feat: implement storybook DSL with template composition and validation

Add complete domain-specific language for authoring narrative content for
agent simulations.

Features:
- Complete parser using LALRPOP + logos lexer
- Template composition (includes + multiple inheritance)
- Strict mode validation for templates
- Reserved keyword protection
- Semantic validators (trait ranges, schedule overlaps, life arcs, behaviors)
- Name resolution and cross-reference tracking
- CLI tool (validate, inspect, query commands)
- Query API with filtering
- 260 comprehensive tests (unit, integration, property-based)

Implementation phases:
- Phase 1 (Parser): Complete
- Phase 2 (Resolution + Validation): Complete
- Phase 3 (Public API + CLI): Complete

BREAKING CHANGE: Initial implementation
This commit is contained in:
2026-02-08 13:24:35 +00:00
commit 9c20dd4092
59 changed files with 25484 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
# Seeds for failure cases proptest has generated in the past. It is
# automatically read and these particular cases re-run before any
# novel cases are generated.
#
# It is recommended to check this file in to source control so that
# everyone who runs the test benefits from these saved cases.
cc f001e5854731fe83d1c75e58f0519043c413356fcad528eb53a5337077bcfafa # shrinks to (rel1, rel2) = (Relationship { name: "a", participants: [Participant { role: None, name: ["_"], self_block: Some([]), other_block: None, span: Span { start: 0, end: 10 } }, Participant { role: None, name: ["a"], self_block: None, other_block: None, span: Span { start: 0, end: 10 } }], fields: [Field { name: "_", value: Int(0), span: Span { start: 0, end: 10 } }, Field { name: "_", value: Int(1), span: Span { start: 0, end: 10 } }], span: Span { start: 0, end: 10 } }, Relationship { name: "a", participants: [Participant { role: None, name: ["a"], self_block: Some([]), other_block: None, span: Span { start: 20, end: 30 } }, Participant { role: None, name: ["_"], self_block: None, other_block: None, span: Span { start: 20, end: 30 } }], fields: [Field { name: "_", value: Int(0), span: Span { start: 0, end: 10 } }, Field { name: "_", value: Int(1), span: Span { start: 0, end: 10 } }], span: Span { start: 20, end: 30 } })