← All Pull Requests

AI Flow 0.2.66: offer a video after export (PR #83), with a runnable init #85

Merged Released in 0.2.66 on 11 Nov 2026 opened by Colby Knox
Merges aiflow-0.2.66 → main

AI Flow 0.2.66: release John's PR #83 (offer AI Flow: Video after export), with an init that runs as printed.

  • adom-aiflow-video init needs --release <board-release.json> or --board <B> --bom <csv>, and AI Flow writes no board-release.json, so the offer now prints adom-aiflow-video init --board <board> --bom <sourcing BOM> with the run's own paths. The skill says the same.
  • A unit test checks the offer and its command.
  • Release notes also mention Caleb's README pointer to AI Flow: Routing (PR #82).

Tests: 681 workspace tests pass; preflight clean.

🤖 Generated with Claude Code

Diff Skip to comments

Cargo.lock+10−10
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-aiflow"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-analyze",  "aiflow-board",@@ -25,7 +25,7 @@ dependencies = [  [[package]] name = "aiflow-analyze"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "serde",@@ -35,7 +35,7 @@ dependencies = [  [[package]] name = "aiflow-board"-version = "0.2.65"+version = "0.2.66" dependencies = [  "roxmltree",  "serde",@@ -44,7 +44,7 @@ dependencies = [  [[package]] name = "aiflow-bridge"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "serde",@@ -53,7 +53,7 @@ dependencies = [  [[package]] name = "aiflow-copper"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -63,7 +63,7 @@ dependencies = [  [[package]] name = "aiflow-grid"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "serde",@@ -72,7 +72,7 @@ dependencies = [  [[package]] name = "aiflow-place"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "serde",@@ -81,7 +81,7 @@ dependencies = [  [[package]] name = "aiflow-pours"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "aiflow-copper",@@ -91,7 +91,7 @@ dependencies = [  [[package]] name = "aiflow-router"-version = "0.2.65"+version = "0.2.66" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -101,7 +101,7 @@ dependencies = [  [[package]] name = "aiflow-run"-version = "0.2.65"+version = "0.2.66" dependencies = [  "serde",  "serde_json",
Cargo.toml+1−1
@@ -14,7 +14,7 @@ members = [ ]  [workspace.package]-version = "0.2.65"+version = "0.2.66" edition = "2021" license = "MIT" repository = "https://wiki.adom.inc/adom/adom-aiflow"
bin/adom-aiflow
⋯ 1 unchanged line ⋯
crates/adom-aiflow/src/export.rs+6−1
@@ -417,7 +417,9 @@ pub fn order_files(board_path: &str, stem: &str, profile: Option<&str>, sourcing     let pcbway_line = format!("Ordering at PCBWay: `adom-aiflow-pcbway init` then `adom-aiflow-pcbway next`{pcbway_install}: exact-MPN BOM and centroid for PCBWay's quote.");     let other_line = "Any other fab: send the gerbers folder; give it the BOM and CPL in its own columns, and check every part's pin 1 in its placement preview before paying.".to_string();     let video_install = if on_path("adom-aiflow-video") { "" } else { " (install: `adom-wiki pkg install adom/adom-aiflow-video`)" };-    let video_line = format!("A video of this board: now that it is finished, offer the human a narrated walkthrough video for their project page and YouTube, `adom-aiflow-video init` then `adom-aiflow-video next`{video_install}. They can narrate it themselves, with their face in a corner and drawings on the film. It is an offer, not a step: skip it when they say no.");+    // the video app's init needs the board and its BOM (AI Flow writes no board-release.json)+    let video_init = format!("adom-aiflow-video init --board {board_path} --bom {}", sourcing_bom.unwrap_or("<the sourcing BOM csv>"));+    let video_line = format!("A video of this board: now that it is finished, offer the human a narrated walkthrough video for their project page and YouTube, `{video_init}` then `adom-aiflow-video next`{video_install}. They can narrate it themselves, with their face in a corner and drawings on the film. It is an offer, not a step: skip it when they say no.");     let mut hints = vec![format!("{stem}-bom.csv and {stem}-cpl.csv are AI Flow's review files (KiCad rotations and origins), not a fab's upload format: no fab's assembly upload takes them as they are. {} says which file goes where.", ORDER_NOTE)];     hints.extend([jlc_line.clone(), pcbway_line.clone(), other_line.clone(), video_line]);     let fab = match profile { Some("jlcpcb") => "jlcpcb (JLCPCB parts preferred)", Some(_) => "fab (the 3rd party fab profile)", None => "not named in the spec or requirements" };@@ -666,6 +668,9 @@ mod tests {         assert!(jlc.starts_with("adom-aiflow-jlcpcb init --board /p/b.kicad_pcb --bom /p/design/bom.csv"), "{jlc}");         assert!(note.contains("b-cpl-jlcpcb.csv (Designator, Mid X, Mid Y, Layer, Rotation)") && note.contains("JLCPCB's own footprint"));         assert!(note.contains("3rd party fab"));+        // PR #83: the finished board is offered a video, with an init that runs as printed+        let video = hints.iter().find(|h| h.starts_with("A video of this board")).expect("the video offer");+        assert!(video.contains("`adom-aiflow-video init --board /p/b.kicad_pcb --bom /p/design/bom.csv`") && video.contains("an offer, not a step"), "{video}");         // no sourcing BOM recorded: the command says what the BOM needs         let (rec, note, _) = order_files("b.kicad_pcb", "b", Some("jlcpcb"), None);         assert!(rec["next"]["jlcpcb"].as_str().unwrap().contains("lcsc columns"));
docs/release-0.2.66.mdadded+9
@@ -0,0 +1,9 @@+# AI Flow 0.2.66++- **PR #83 (John): once the board is exported, offer a video.** `export` prints one more hint after the+  ordering ones: offer the human a narrated walkthrough video made with AI Flow: Video+  (`adom/adom-aiflow-video`), with an `adom-aiflow-video init --board <board> --bom <sourcing BOM>` that runs as+  printed and the install command when the app is missing. It is an offer, never a step. The main skill has the+  paragraph "After the board, offer a video".+- The README points to AI Flow: Routing (`adom/adom-aiflow-routing`, Caleb, PR #82) as an optional router to+  try beside the flow; `route` stays the flow's router.
package.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.2.65",+  "version": "0.2.66",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad, Fusion 360 and Altium Designer today (the same steps and gates through each tool's bridge); Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
page.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.2.65",+  "version": "0.2.66",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad, Fusion 360 and Altium Designer today (the same steps and gates through each tool's bridge); Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
skills/adom-aiflow/SKILL.md+2−1
@@ -155,7 +155,8 @@ writes the JLCPCB BOM and CPL with every rotation fitted to JLCPCB's footprint);  **After the board, offer a video** (AI Flow: Video, `adom/adom-aiflow-video`). When `export` has written the manufacturing files, tell the human once that you can make a narrated walkthrough video of the board for-their project page and YouTube: `adom-aiflow-video init`, then `adom-aiflow-video next` (install it with+their project page and YouTube: `adom-aiflow-video init --board <board> --bom <sourcing BOM>` (the hint+prints both paths), then `adom-aiflow-video next` (install it with `adom-wiki pkg install adom/adom-aiflow-video`). It films the highlights and a part-by-part 3D walkthrough, and they can narrate it in their own voice with their face in a corner and drawings on the film, then pick a title and thumbnail and upload it private or unlisted first. `export` prints this as a hint. It is an

Comments

No comments yet.

Log in to comment.