tftio-kb 2.5.1

Personal knowledge base — typed AST with org-mode as projection, SQLite-backed
Documentation
use kb::ast::*;
use kb::generator::generate;

fn main() {
    let doc = Document {
        blocks: vec![
            Block::Heading {
                level: 1,
                title: Title("Knowledge Base Demo".into()),
                tags: vec![Tag("demo".into()), Tag("kb".into())],
                children: vec![
                    Block::Paragraph {
                        inlines: vec![
                            Inline::Plain("This document was generated by the ".into()),
                            Inline::Bold(vec![Inline::Plain("tftio-kb".into())]),
                            Inline::Plain(" Rust crate. It demonstrates ".into()),
                            Inline::Italic(vec![Inline::Plain("all".into())]),
                            Inline::Plain(" block and inline constructors in the AST.".into()),
                        ],
                    },
                    Block::PropertyDrawer {
                        entries: vec![
                            ("ID".into(), "demo-001".into()),
                            ("CREATED".into(), "<2026-05-01 Fri>".into()),
                        ],
                    },
                ],
            },
            Block::Heading {
                level: 2,
                title: Title("Inline Formatting".into()),
                tags: vec![],
                children: vec![Block::Paragraph {
                    inlines: vec![
                        Inline::Plain("The AST supports ".into()),
                        Inline::Bold(vec![Inline::Plain("bold".into())]),
                        Inline::Plain(", ".into()),
                        Inline::Italic(vec![Inline::Plain("italic".into())]),
                        Inline::Plain(", ".into()),
                        Inline::InlineCode("inline code".into()),
                        Inline::Plain(", ".into()),
                        Inline::Verbatim("verbatim".into()),
                        Inline::Plain(", and ".into()),
                        Inline::Link {
                            target: "https://example.com".into(),
                            description: Some("links".into()),
                        },
                        Inline::Plain(" with descriptions, plus bare ".into()),
                        Inline::Link {
                            target: "https://sqlite.org".into(),
                            description: None,
                        },
                        Inline::Plain(" links.".into()),
                    ],
                }],
            },
            Block::Heading {
                level: 2,
                title: Title("Code Block".into()),
                tags: vec![],
                children: vec![Block::SrcBlock {
                    language: "rust".into(),
                    content: "fn main() {\n    println!(\"Hello from kb!\");\n}".into(),
                }],
            },
            Block::Heading {
                level: 2,
                title: Title("Lists".into()),
                tags: vec![],
                children: vec![
                    Block::Paragraph {
                        inlines: vec![Inline::Plain("Unordered list with checkboxes:".into())],
                    },
                    Block::List {
                        list_type: ListType::Unordered,
                        items: vec![
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Design the AST types".into())],
                                }],
                                checkbox: Checkbox::Checked,
                            },
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Implement the generator".into())],
                                }],
                                checkbox: Checkbox::Checked,
                            },
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Write the parser".into())],
                                }],
                                checkbox: Checkbox::Checked,
                            },
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Add storage layer".into())],
                                }],
                                checkbox: Checkbox::Unchecked,
                            },
                        ],
                    },
                    Block::Paragraph {
                        inlines: vec![Inline::Plain("Ordered list:".into())],
                    },
                    Block::List {
                        list_type: ListType::Ordered(1),
                        items: vec![
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Phase 1: scaffold".into())],
                                }],
                                checkbox: Checkbox::NoCheckbox,
                            },
                            ListItem {
                                content: vec![Block::Paragraph {
                                    inlines: vec![Inline::Plain("Phase 2: core types".into())],
                                }],
                                checkbox: Checkbox::NoCheckbox,
                            },
                        ],
                    },
                ],
            },
            Block::Heading {
                level: 2,
                title: Title("Quote Block".into()),
                tags: vec![],
                children: vec![Block::QuoteBlock {
                    children: vec![Block::Paragraph {
                        inlines: vec![Inline::Plain(
                            "The KB is headless. Clients translate between the canonical document model and whatever format their consumer wants.".into(),
                        )],
                    }],
                }],
            },
            Block::Heading {
                level: 2,
                title: Title("Planning".into()),
                tags: vec![],
                children: vec![Block::Planning {
                    entries: vec![
                        PlanningEntry::Scheduled(Timestamp("<2026-05-01 Fri>".into())),
                        PlanningEntry::Deadline(Timestamp("<2026-05-15 Fri>".into())),
                    ],
                }],
            },
            Block::HorizontalRule,
            Block::Paragraph {
                inlines: vec![Inline::Plain("End of generated document.".into())],
            },
            Block::Comment {
                text: "This comment should not appear in rendered output".into(),
            },
        ],
    };

    println!("{}", generate(&doc));
}