bookwright-cli 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. bookwright/__init__.py +3 -0
  2. bookwright/__main__.py +6 -0
  3. bookwright/cli.py +19 -0
  4. bookwright/commands/__init__.py +0 -0
  5. bookwright/commands/_envelope.py +36 -0
  6. bookwright/commands/check.py +75 -0
  7. bookwright/commands/graph/__init__.py +23 -0
  8. bookwright/commands/graph/build.py +157 -0
  9. bookwright/commands/graph/envelope.py +26 -0
  10. bookwright/commands/graph/query.py +98 -0
  11. bookwright/commands/init/__init__.py +5 -0
  12. bookwright/commands/init/conflict.py +107 -0
  13. bookwright/commands/init/envelope.py +322 -0
  14. bookwright/commands/init/git.py +96 -0
  15. bookwright/commands/init/main.py +263 -0
  16. bookwright/commands/init/resolve.py +193 -0
  17. bookwright/commands/init/scaffold.py +242 -0
  18. bookwright/commands/init/validate.py +172 -0
  19. bookwright/commands/integration/__init__.py +22 -0
  20. bookwright/commands/integration/use.py +120 -0
  21. bookwright/commands/validate.py +160 -0
  22. bookwright/commands/version.py +35 -0
  23. bookwright/core/__init__.py +35 -0
  24. bookwright/core/_blocks.py +239 -0
  25. bookwright/core/_build.py +154 -0
  26. bookwright/core/_research_block.py +56 -0
  27. bookwright/core/_translate.py +90 -0
  28. bookwright/core/errors.py +127 -0
  29. bookwright/core/iso639_1.py +200 -0
  30. bookwright/core/manifest.py +343 -0
  31. bookwright/errors.py +47 -0
  32. bookwright/golem/__init__.py +71 -0
  33. bookwright/golem/base.py +200 -0
  34. bookwright/golem/errors.py +29 -0
  35. bookwright/golem/modules/__init__.py +1 -0
  36. bookwright/golem/modules/character.py +109 -0
  37. bookwright/golem/modules/event.py +91 -0
  38. bookwright/golem/modules/feature.py +161 -0
  39. bookwright/golem/modules/inference.py +41 -0
  40. bookwright/golem/modules/narrative.py +55 -0
  41. bookwright/golem/modules/provenance.py +197 -0
  42. bookwright/golem/modules/relationship.py +38 -0
  43. bookwright/golem/modules/setting.py +30 -0
  44. bookwright/golem/namespaces.py +332 -0
  45. bookwright/golem/serialize.py +25 -0
  46. bookwright/golem/slug.py +22 -0
  47. bookwright/indexers/__init__.py +47 -0
  48. bookwright/indexers/base.py +55 -0
  49. bookwright/indexers/errors.py +80 -0
  50. bookwright/indexers/rdflib_indexer.py +89 -0
  51. bookwright/integrations/__init__.py +155 -0
  52. bookwright/integrations/base.py +117 -0
  53. bookwright/integrations/claude/__init__.py +29 -0
  54. bookwright/integrations/constants.py +38 -0
  55. bookwright/integrations/descriptions.py +48 -0
  56. bookwright/integrations/errors.py +170 -0
  57. bookwright/integrations/generic/__init__.py +56 -0
  58. bookwright/integrations/lint.py +160 -0
  59. bookwright/integrations/materialize.py +202 -0
  60. bookwright/integrations/options.py +203 -0
  61. bookwright/io/__init__.py +1 -0
  62. bookwright/io/bible.py +500 -0
  63. bookwright/io/errors.py +98 -0
  64. bookwright/io/frontmatter.py +61 -0
  65. bookwright/io/fs.py +226 -0
  66. bookwright/io/manuscript.py +15 -0
  67. bookwright/io/project.py +21 -0
  68. bookwright/io/report.py +107 -0
  69. bookwright/io/research.py +427 -0
  70. bookwright/resources/__init__.py +1 -0
  71. bookwright/resources/commands/bookwright-analyze.md +66 -0
  72. bookwright/resources/commands/bookwright-bible.md +96 -0
  73. bookwright/resources/commands/bookwright-checklist.md +67 -0
  74. bookwright/resources/commands/bookwright-clarify.md +65 -0
  75. bookwright/resources/commands/bookwright-constitution.md +79 -0
  76. bookwright/resources/commands/bookwright-continuity.md +70 -0
  77. bookwright/resources/commands/bookwright-draft.md +74 -0
  78. bookwright/resources/commands/bookwright-outline.md +71 -0
  79. bookwright/resources/commands/bookwright-research.md +107 -0
  80. bookwright/resources/commands/bookwright-scenes.md +66 -0
  81. bookwright/resources/commands/bookwright-synopsis.md +67 -0
  82. bookwright/resources/commands/bookwright-verify.md +136 -0
  83. bookwright/resources/commands/references/golem-character.md +65 -0
  84. bookwright/resources/commands/references/golem-events-timeline.md +56 -0
  85. bookwright/resources/commands/references/golem-relationships.md +53 -0
  86. bookwright/resources/commands/references/greimas-actants.md +57 -0
  87. bookwright/resources/commands/references/pending-protocol.md +72 -0
  88. bookwright/resources/commands/references/propp-functions.md +54 -0
  89. bookwright/resources/commands/references/research-format.md +136 -0
  90. bookwright/resources/project/.bookwright/cache/.gitkeep +0 -0
  91. bookwright/resources/project/.bookwright/schema/.gitkeep +0 -0
  92. bookwright/resources/project/.bookwright/templates/.gitkeep +0 -0
  93. bookwright/resources/project/.gitignore +23 -0
  94. bookwright/resources/project/README.md.j2 +40 -0
  95. bookwright/resources/project/__init__.py +6 -0
  96. bookwright/resources/project/bible/characters/.gitkeep +0 -0
  97. bookwright/resources/project/bible/constitution.md.j2 +74 -0
  98. bookwright/resources/project/bible/glossary.md +36 -0
  99. bookwright/resources/project/bible/locations/.gitkeep +0 -0
  100. bookwright/resources/project/bible/pov-structure.md +43 -0
  101. bookwright/resources/project/bible/relationships.md +36 -0
  102. bookwright/resources/project/bible/research/_index.md +28 -0
  103. bookwright/resources/project/bible/research/sources.md +23 -0
  104. bookwright/resources/project/bible/settings/.gitkeep +0 -0
  105. bookwright/resources/project/bible/subplots.md +35 -0
  106. bookwright/resources/project/bible/themes.md +36 -0
  107. bookwright/resources/project/bible/timeline.md +38 -0
  108. bookwright/resources/project/manuscript/.gitkeep +0 -0
  109. bookwright/resources/project/outline/arcs.md +34 -0
  110. bookwright/resources/project/outline/scenes.md +31 -0
  111. bookwright/resources/project/outline/structure.md +35 -0
  112. bookwright/resources/project/outline/synopsis.md +25 -0
  113. bookwright/resources/schemas/__init__.py +19 -0
  114. bookwright/resources/schemas/golem-1.1/VERSION +1 -0
  115. bookwright/resources/schemas/golem-1.1/golem.ttl +1947 -0
  116. bookwright/resources/schemas/golem-1.1/version.json +8 -0
  117. bookwright/resources/templates/__init__.py +1 -0
  118. bookwright/resources/templates/bible/character.md.tmpl +63 -0
  119. bookwright/resources/templates/bible/location.md.tmpl +37 -0
  120. bookwright/resources/templates/bible/research/_index.md.tmpl +25 -0
  121. bookwright/resources/templates/bible/research/sources.md.tmpl +21 -0
  122. bookwright/resources/templates/bible/research/tema.md.tmpl +37 -0
  123. bookwright/resources/templates/bible/setting.md.tmpl +38 -0
  124. bookwright/resources/templates/manifest.template.toml +79 -0
  125. bookwright/resources/templates/manuscript/chapter.md.tmpl +36 -0
  126. bookwright/resources/templates/scenes/scene.md.tmpl +37 -0
  127. bookwright/resources/vocabularies/__init__.py +6 -0
  128. bookwright/resources/vocabularies/greimas.ttl +4 -0
  129. bookwright/resources/vocabularies/propp.ttl +4 -0
  130. bookwright/resources/vocabularies/sources.ttl +82 -0
  131. bookwright/validation/__init__.py +33 -0
  132. bookwright/validation/anchor_queries.py +223 -0
  133. bookwright/validation/base.py +233 -0
  134. bookwright/validation/queries.py +197 -0
  135. bookwright/validation/registry.py +185 -0
  136. bookwright/validation/report.py +106 -0
  137. bookwright/validation/runner.py +65 -0
  138. bookwright/validation/validators/__init__.py +9 -0
  139. bookwright/validation/validators/character_presence.py +202 -0
  140. bookwright/validation/validators/factual_anchor.py +291 -0
  141. bookwright/validation/validators/focalization.py +152 -0
  142. bookwright/validation/validators/setting_continuity.py +100 -0
  143. bookwright/validation/validators/temporal.py +277 -0
  144. bookwright_cli-0.2.0.dist-info/METADATA +218 -0
  145. bookwright_cli-0.2.0.dist-info/RECORD +149 -0
  146. bookwright_cli-0.2.0.dist-info/WHEEL +4 -0
  147. bookwright_cli-0.2.0.dist-info/entry_points.txt +2 -0
  148. bookwright_cli-0.2.0.dist-info/licenses/LICENSE +202 -0
  149. bookwright_cli-0.2.0.dist-info/licenses/NOTICE +14 -0
@@ -0,0 +1,8 @@
1
+ {
2
+ "repository": "https://github.com/GOLEM-lab/golem-ontology",
3
+ "commit": "f666128a9a29f39c9f23c96ae1c48023cc8e7898",
4
+ "file": "golem/golem_v1-1.ttl",
5
+ "version_iri": "https://w3id.org/golem/ontology/v1.1",
6
+ "version_info": "1.1",
7
+ "retrieved": "2026-05-30"
8
+ }
@@ -0,0 +1 @@
1
+ """Bundled TOML/Markdown templates loaded via importlib.resources."""
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: "[PENDING: ¿Cómo se llama el personaje?]"
3
+ # born: 1990 # año entero; descomenta y rellena, nunca un texto
4
+ # died: # año entero o deja la línea omitida si sigue vivo
5
+ features: []
6
+ narrative_roles: []
7
+ ---
8
+
9
+ # Ficha de personaje
10
+
11
+ <!--
12
+ Guía para el agente y el autor: esta ficha se indexa como un `Character` del
13
+ modelo GOLEM. El frontmatter sólo admite las claves `name`, `born`, `died`,
14
+ `features` y `narrative_roles`; cualquier otra clave de nivel superior genera un
15
+ aviso del indexador.
16
+
17
+ - `name`: cadena obligatoria. El prompt `[PENDING: …]` es legal sólo entre
18
+ comillas (`name: "[PENDING: …]"`); sin comillas, los corchetes se leen como
19
+ una lista YAML y la ficha se descarta.
20
+ - `born` / `died`: año entero o se omiten. Nunca un texto ni un `[PENDING]`:
21
+ un valor no entero hace que el indexador descarte el archivo. La edad se
22
+ expresa por `born`/`died` o en prosa, jamás como cadena en el frontmatter.
23
+ - `features` / `narrative_roles`: listas de cadenas.
24
+
25
+ Ejemplo de frontmatter ya rellenado:
26
+
27
+ name: "Ana Soler"
28
+ born: 1990
29
+ features: ["cicatriz en la ceja", "zurda"]
30
+ narrative_roles: ["protagonista", "heroína"]
31
+ -->
32
+
33
+ ## Rasgos biográficos
34
+
35
+ <!-- Guía: origen, familia, hitos vitales. La edad se deriva de `born`/`died` o
36
+ se cuenta aquí en prosa, nunca como dato en el frontmatter. -->
37
+
38
+ [PENDING: ¿De dónde viene el personaje y qué hechos marcaron su vida?]
39
+
40
+ ## Rasgos psicológicos
41
+
42
+ [PENDING: ¿Qué quiere, qué teme y qué herida arrastra?]
43
+
44
+ ## Rasgos físicos
45
+
46
+ [PENDING: ¿Qué aspecto tiene y qué detalle lo hace reconocible?]
47
+
48
+ ## Rol narrativo
49
+
50
+ <!-- Guía: su función en la trama (protagonista, antagonista, aliado…) y cómo
51
+ se relaciona con los `narrative_roles` declarados en el frontmatter. -->
52
+
53
+ [PENDING: ¿Qué papel cumple en la historia y respecto a quién?]
54
+
55
+ ## Diálogo de muestra
56
+
57
+ <!-- Guía: dos o tres réplicas que capturen su voz, para mantenerla constante. -->
58
+
59
+ [PENDING: ¿Cómo habla? Escribe una réplica característica.]
60
+
61
+ ## Patrones de lenguaje corporal
62
+
63
+ [PENDING: ¿Qué gestos o tics lo delatan bajo presión?]
@@ -0,0 +1,37 @@
1
+ # Ficha de lugar
2
+
3
+ <!--
4
+ Guía para el agente y el autor: esta plantilla describe un lugar concreto y
5
+ sensorial (una taberna, un puente, una habitación), no el universo amplio (para
6
+ eso está la ficha de escenario). **No se indexa en v0**: el modelo GOLEM aún no
7
+ tiene un manejador de lugares, así que esta ficha es material de consulta y no
8
+ lleva frontmatter ingerido por el indexador. Ancla cada lugar en los cinco
9
+ sentidos para que las escenas que ocurran allí sean concretas. Ejemplo:
10
+
11
+ - Qué se ve: vigas combadas, una lámpara de aceite que parpadea.
12
+ - Qué se oye: el río golpeando los pilotes bajo el suelo.
13
+ - Qué se huele: humedad, brea, pan quemado.
14
+ -->
15
+
16
+ ## Qué se ve
17
+
18
+ [PENDING: ¿Qué imágenes dominan el lugar a primera vista?]
19
+
20
+ ## Qué se oye
21
+
22
+ [PENDING: ¿Qué sonidos lo habitan?]
23
+
24
+ ## Qué se huele
25
+
26
+ [PENDING: ¿Qué olores lo caracterizan?]
27
+
28
+ ## Qué se toca
29
+
30
+ [PENDING: ¿Qué texturas y temperaturas se sienten aquí?]
31
+
32
+ ## Atmósfera dominante
33
+
34
+ <!-- Guía: la emoción que el lugar imprime en quien lo cruza; la suma sensorial
35
+ convertida en tono. -->
36
+
37
+ [PENDING: ¿Qué sensación deja el lugar y cómo afecta a la escena que ocurre en él?]
@@ -0,0 +1,25 @@
1
+ ---
2
+ open_questions: []
3
+ ---
4
+
5
+ # Índice de investigación
6
+
7
+ <!--
8
+ Guía: molde del índice de investigación, resoluble por capas (un override del
9
+ proyecto bajo `.bookwright/templates/` tiene prioridad sobre este core). Conserva
10
+ la clave `open_questions:` y añade temas en la lista de abajo. El cuerpo en prosa
11
+ no se indexa; el contrato exacto está en `references/research-format.md`.
12
+ -->
13
+
14
+ ## Temas
15
+
16
+ <!-- Guía: una entrada por tema investigado, enlazando a su `<slug>.md`. -->
17
+
18
+ [PENDING: ¿Qué tema vas a enlazar? p. ej. `- [Título del tema](slug-del-tema.md)`]
19
+
20
+ ## Preguntas abiertas
21
+
22
+ <!-- Guía: pasa cada pregunta a `open_questions:` con un `id` cuando quieras
23
+ rastrearla en el grafo. -->
24
+
25
+ [PENDING: ¿Qué pregunta global del proyecto queda abierta?]
@@ -0,0 +1,21 @@
1
+ ---
2
+ sources: []
3
+ ---
4
+
5
+ # Registro de fuentes
6
+
7
+ <!--
8
+ Guía: molde del registro de fuentes, resoluble por capas (un override del
9
+ proyecto bajo `.bookwright/templates/` tiene prioridad sobre este core). Cada
10
+ elemento de `sources:` necesita procedencia completa — `name`, `reference`,
11
+ `author`, `original_language`, `type` (primaria | secundaria | oficial |
12
+ académica | periodística | testimonial), `reliability` (alta | media | baja),
13
+ `reliability_justification`, `access_date`, `original_quote` y `translation`
14
+ cuando la lengua difiera de la del libro. Ver `references/research-format.md`.
15
+ -->
16
+
17
+ ## Notas
18
+
19
+ <!-- Guía: prosa de trabajo; no se indexa. La fuente real vive en `sources:`. -->
20
+
21
+ [PENDING: ¿Qué fuente vas a registrar y con qué justificación de fiabilidad?]
@@ -0,0 +1,37 @@
1
+ ---
2
+ findings: []
3
+ anchors: []
4
+ ---
5
+
6
+ # Tema de investigación
7
+
8
+ <!--
9
+ Guía: molde de un tema de investigación, resoluble por capas (un override del
10
+ proyecto bajo `.bookwright/templates/` tiene prioridad sobre este core).
11
+ `findings:` lista los hallazgos (cada uno con `id`, `claim` y `sources`, salvo
12
+ los abiertos con `open: true`). `anchors:` promueve hallazgos a anclas
13
+ vinculantes (`promotes` + `constrains`). Sustituye el encabezado de arriba por el
14
+ título humano del tema; el archivo se nombra con su *slug*. Contrato exacto en
15
+ `references/research-format.md`.
16
+ -->
17
+
18
+ ## Hallazgos
19
+
20
+ <!-- Guía: un hallazgo por afirmación. Cuando las fuentes discrepen, escribe un
21
+ hallazgo por versión, cada uno con su propia fuente; nunca los fundas. -->
22
+
23
+ [PENDING: ¿Qué afirmaste, con qué fuente y sobre qué entidad narrativa recae?]
24
+
25
+ ## Anclas
26
+
27
+ <!-- Guía: marca como ancla solo el hallazgo cuya mejor fuente alcance
28
+ `[research].min_reliability_for_anchor`. -->
29
+
30
+ [PENDING: ¿Qué hallazgo restringe a qué entidad (personaje, escenario, evento o `timeline`)?]
31
+
32
+ ## Preguntas abiertas
33
+
34
+ <!-- Guía: deja aquí, o como `open_questions` en el índice, lo que siga sin
35
+ fuente fiable; no lo rellenes con afirmaciones inventadas. -->
36
+
37
+ [PENDING: ¿Qué sub-pregunta de este tema queda abierta?]
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: "[PENDING: ¿Cómo se llama el escenario?]"
3
+ ---
4
+
5
+ # Ficha de escenario
6
+
7
+ <!--
8
+ Guía para el agente y el autor: esta ficha se indexa como un `Setting` del
9
+ modelo GOLEM, el universo narrativo amplio (una región, una era, una cultura),
10
+ no un lugar concreto y sensorial (para eso está la plantilla de "lugar").
11
+
12
+ El frontmatter admite **únicamente** la clave `name`: cualquier otra clave de
13
+ nivel superior genera un aviso del indexador. `name` es una cadena obligatoria;
14
+ el prompt `[PENDING: …]` es legal sólo entre comillas. Ejemplo ya rellenado:
15
+
16
+ name: "Las Ciudades-Puente del Vel"
17
+ -->
18
+
19
+ ## Cultura
20
+
21
+ <!-- Guía: valores, costumbres, lenguas, estructuras de poder que tiñen la vida
22
+ cotidiana de este universo. -->
23
+
24
+ [PENDING: ¿Qué cultura(s) habitan este escenario y qué las define?]
25
+
26
+ ## Sistema / era
27
+
28
+ <!-- Guía: el marco tecnológico, mágico o histórico, y el momento temporal en
29
+ que transcurre la obra dentro de este universo. -->
30
+
31
+ [PENDING: ¿En qué época y bajo qué sistema (tecnológico, mágico, social) ocurre?]
32
+
33
+ ## Geografía amplia
34
+
35
+ <!-- Guía: la forma del mundo a gran escala: regiones, fronteras, rutas; los
36
+ lugares concretos se detallan en fichas de lugar aparte. -->
37
+
38
+ [PENDING: ¿Cómo es la geografía general y qué regiones importan a la trama?]
@@ -0,0 +1,79 @@
1
+ # Bookwright project manifest.
2
+ #
3
+ # This file is the source of truth for a Bookwright project: it declares the
4
+ # CLI floor, the schema generation stamp, the project's URI namespace, and the
5
+ # author-facing book metadata. Every other Bookwright command reads from here.
6
+ #
7
+ # Generated by `Manifest.build(...)`. The toolkit preserves comments and key
8
+ # order on every round-trip; edit values freely.
9
+
10
+ [bookwright]
11
+ # Minimum Bookwright CLI version required to operate on this project (PEP 440).
12
+ cli_version_min = "0.0.0"
13
+ # GOLEM ontology schema stamp.
14
+ schema_version = "golem-1.1"
15
+ # Manifest format version (positive integer string).
16
+ manifest_version = "1"
17
+ # Absolute http(s) URI used as the @prefix for the project's Turtle graph.
18
+ # Must end with `/`.
19
+ uri_base = "https://example.org/project/"
20
+ # Graph indexer backend.
21
+ indexer = "rdflib"
22
+
23
+ [book]
24
+ # Required: human-readable title.
25
+ title = "Untitled"
26
+ # Required: one of novel | essay | memoir | non-fiction-narrative | other.
27
+ type = "novel"
28
+ # Required: ISO 639-1 alpha-2 code (lowercase).
29
+ language = "en"
30
+ # Required: at least one author. Duplicates are allowed (co-authorship).
31
+ authors = ["Anonymous"]
32
+ # Optional free-form fields below.
33
+ subtitle = ""
34
+ genre = []
35
+ # Optional `target_length_words` (positive integer) is omitted by default.
36
+ # The builder will insert it when an override is supplied.
37
+ status = "drafting"
38
+
39
+ [book.metadata]
40
+ # Free-form metadata preserved verbatim by the manifest loader.
41
+
42
+ [vocabularies]
43
+ # List of vocabulary names (resolved later against .bookwright/vocabularies/).
44
+ active = []
45
+
46
+ [validators]
47
+ # Built-in validators to enable/disable plus the names of custom validators.
48
+ enabled = []
49
+ disabled = []
50
+ custom = []
51
+
52
+ [integration]
53
+ # Recorded integration metadata. The manifest loader treats this block as data
54
+ # only; agent dispatch happens in a downstream registry.
55
+ key = "claude"
56
+ skills_dir = ".claude/skills"
57
+
58
+ [integration.options]
59
+ # Free-form options preserved verbatim.
60
+
61
+ [paths]
62
+ # Project-relative content roots. No filesystem check at load time.
63
+ manuscript = "manuscript/"
64
+ bible = "bible/"
65
+ outline = "outline/"
66
+ graph = "bible/graph.ttl"
67
+ constitution = "bible/constitution.md"
68
+
69
+ [research]
70
+ # Whether the research system is active. When false, the bookwright-research
71
+ # skill reports the system inert and produces no graph-bound findings.
72
+ enabled = true
73
+ # Source provenances (ISO 639-1 codes) the protocol should deliberately seek for
74
+ # nationally-charged topics, e.g. ["de", "pl", "en", "fr"]. Empty = no declared
75
+ # preference; the original-language rule still applies.
76
+ source_languages = []
77
+ # Minimum source reliability required before a finding may become a binding
78
+ # anchor: one of "alta" | "media" | "baja".
79
+ min_reliability_for_anchor = "media"
@@ -0,0 +1,36 @@
1
+ # Capítulo: [PENDING: ¿Qué título lleva el capítulo?]
2
+
3
+ <!--
4
+ Guía para el agente y el autor: esta plantilla estructura el borrador de un
5
+ capítulo. No lleva frontmatter ingerido por el indexador: es texto de
6
+ manuscrito. Usa el encabezado para fijar el propósito del capítulo antes de
7
+ redactar, y separa las escenas con una línea de regla (`---`) o un salto claro.
8
+ Ejemplo de propósito: "Cap. 3 — Ana descubre la deuda de Marco; termina con la
9
+ decisión de ocultárselo a su madre." -->
10
+
11
+ ## Propósito del capítulo
12
+
13
+ <!-- Guía: una o dos frases con la función dramática del capítulo y el cambio de
14
+ estado que debe producir. -->
15
+
16
+ [PENDING: ¿Qué hace avanzar este capítulo y cómo deja al lector distinto al empezarlo?]
17
+
18
+ ## POV y momento
19
+
20
+ <!-- Guía: desde qué personaje se narra (si la obra es multi-POV) y cuándo
21
+ ocurre respecto a la línea de tiempo. -->
22
+
23
+ [PENDING: ¿Quién narra y en qué punto de la historia transcurre?]
24
+
25
+ ## Escenas
26
+
27
+ <!-- Guía: lista las escenas del capítulo en orden; desarrolla cada una en su
28
+ propia ficha de escena y enlázalas o transcríbelas aquí al redactar. -->
29
+
30
+ [PENDING: ¿En qué escenas se divide el capítulo?]
31
+
32
+ ## Borrador
33
+
34
+ <!-- Guía: el texto del capítulo. Empieza a escribir aquí. -->
35
+
36
+ [PENDING: Redacta el capítulo a partir de las decisiones anteriores.]
@@ -0,0 +1,37 @@
1
+ # Escena: [PENDING: ¿Qué identificador y título lleva la escena?]
2
+
3
+ <!--
4
+ Guía para el agente y el autor: esta plantilla estructura el borrador de una
5
+ escena, la unidad mínima de la redacción. No lleva frontmatter ingerido por el
6
+ indexador. Toda escena debe cambiar algo: define objetivo, conflicto y cambio de
7
+ estado antes de escribir. Ejemplo:
8
+
9
+ - Objetivo del POV: conseguir el salvoconducto.
10
+ - Conflicto: el vendedor la reconoce y sube el precio.
11
+ - Cambio de estado: de anónima a buscada.
12
+ -->
13
+
14
+ ## Encuadre
15
+
16
+ <!-- Guía: lugar, momento y quién está presente al abrir la escena. -->
17
+
18
+ [PENDING: ¿Dónde, cuándo y con quién arranca la escena?]
19
+
20
+ ## Objetivo del POV
21
+
22
+ [PENDING: ¿Qué quiere conseguir el personaje de punto de vista aquí?]
23
+
24
+ ## Conflicto
25
+
26
+ [PENDING: ¿Qué o quién se interpone?]
27
+
28
+ ## Cambio de estado
29
+
30
+ <!-- Guía: el "antes → después" que justifica la existencia de la escena; si
31
+ nada cambia, la escena sobra. -->
32
+
33
+ [PENDING: ¿Cómo queda la situación al cerrar la escena, distinta de como empezó?]
34
+
35
+ ## Borrador
36
+
37
+ [PENDING: Redacta la escena a partir de las decisiones anteriores.]
@@ -0,0 +1,6 @@
1
+ """Bundled Turtle vocabulary stubs copied into ``.bookwright/vocabularies/``.
2
+
3
+ Marker file — vocabularies are read at scaffold time via
4
+ ``importlib.resources.files("bookwright.resources.vocabularies")``. Full
5
+ vocabularies land with iteration 10.
6
+ """
@@ -0,0 +1,4 @@
1
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
2
+ @prefix greimas: <https://bookwright.dev/vocab/greimas#> .
3
+
4
+ greimas:Actant a owl:Class .
@@ -0,0 +1,4 @@
1
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
2
+ @prefix propp: <https://bookwright.dev/vocab/propp#> .
3
+
4
+ propp:Function a owl:Class .
@@ -0,0 +1,82 @@
1
+ @prefix bw: <https://bookwright.dev/vocab/bw#> .
2
+ @prefix crm: <http://www.cidoc-crm.org/cidoc-crm/> .
3
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
4
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
6
+
7
+ # Bookwright's own research/provenance vocabulary (iteration 012). These terms are
8
+ # Bookwright's, NOT part of the frozen GOLEM ontology (`golem.ttl`): they are
9
+ # intentionally outside the `CLASS_IRI` 17-class closure (Constitution X). The
10
+ # emitted `bible/graph.ttl` reuses only `crm:E13_Attribute_Assignment` and
11
+ # `crm:E55_Type` for typing; no new GOLEM/ontology class is introduced (FR-001).
12
+ # This file is the human-readable declaration the emitted triples conform to;
13
+ # enforcement lives in the `Source` Pydantic `Literal`s (research D4).
14
+
15
+ # --- Source-type controlled vocabulary (six E55_Type individuals, FR-003) ----
16
+
17
+ <https://bookwright.dev/vocab/bw#source-type/primaria>
18
+ a crm:E55_Type ; rdfs:label "primaria"@es .
19
+ <https://bookwright.dev/vocab/bw#source-type/secundaria>
20
+ a crm:E55_Type ; rdfs:label "secundaria"@es .
21
+ <https://bookwright.dev/vocab/bw#source-type/oficial>
22
+ a crm:E55_Type ; rdfs:label "oficial"@es .
23
+ <https://bookwright.dev/vocab/bw#source-type/academica>
24
+ a crm:E55_Type ; rdfs:label "académica"@es .
25
+ <https://bookwright.dev/vocab/bw#source-type/periodistica>
26
+ a crm:E55_Type ; rdfs:label "periodística"@es .
27
+ <https://bookwright.dev/vocab/bw#source-type/testimonial>
28
+ a crm:E55_Type ; rdfs:label "testimonial"@es .
29
+
30
+ # --- Reliability controlled vocabulary (three E55_Type individuals, FR-004) --
31
+
32
+ <https://bookwright.dev/vocab/bw#reliability/alta>
33
+ a crm:E55_Type ; rdfs:label "alta"@es .
34
+ <https://bookwright.dev/vocab/bw#reliability/media>
35
+ a crm:E55_Type ; rdfs:label "media"@es .
36
+ <https://bookwright.dev/vocab/bw#reliability/baja>
37
+ a crm:E55_Type ; rdfs:label "baja"@es .
38
+
39
+ # --- bw: property declarations (contracts/provenance-graph.md) ----------------
40
+
41
+ bw:reference a rdf:Property ;
42
+ rdfs:label "reference"@en ;
43
+ rdfs:comment "Bibliographic reference or URL of a source."@en .
44
+ bw:author a rdf:Property ;
45
+ rdfs:label "author"@en ;
46
+ rdfs:comment "Author or issuing body of a source."@en .
47
+ bw:originalLanguage a rdf:Property ;
48
+ rdfs:label "originalLanguage"@en ;
49
+ rdfs:comment "ISO 639-1 code of a source's original language."@en .
50
+ bw:reliability a rdf:Property ;
51
+ rdfs:label "reliability"@en ;
52
+ rdfs:comment "A source's reliability E55_Type individual (alta/media/baja)."@en .
53
+ bw:reliabilityJustification a rdf:Property ;
54
+ rdfs:label "reliabilityJustification"@en ;
55
+ rdfs:comment "Prose justifying a source's reliability rating."@en .
56
+ bw:accessDate a rdf:Property ;
57
+ rdfs:label "accessDate"@en ;
58
+ rdfs:comment "The date a source was consulted (xsd:date)."@en .
59
+ bw:originalQuote a rdf:Property ;
60
+ rdfs:label "originalQuote"@en ;
61
+ rdfs:comment "Verbatim quote in the source's original language."@en .
62
+ bw:translation a rdf:Property ;
63
+ rdfs:label "translation"@en ;
64
+ rdfs:comment "Translation of the quote; present iff source language differs from the book's."@en .
65
+ bw:claim a rdf:Property ;
66
+ rdfs:label "claim"@en ;
67
+ rdfs:comment "The real-world assertion a finding records."@en .
68
+ bw:assertedBy a rdf:Property ;
69
+ rdfs:label "assertedBy"@en ;
70
+ rdfs:comment "Who asserts a finding's claim (agent or author)."@en .
71
+ bw:supportedBy a rdf:Property ;
72
+ rdfs:label "supportedBy"@en ;
73
+ rdfs:comment "A source supporting a finding (one per source)."@en .
74
+ bw:open a rdf:Property ;
75
+ rdfs:label "open"@en ;
76
+ rdfs:comment "True when a finding is an unresolved open question (xsd:boolean)."@en .
77
+ bw:promotes a rdf:Property ;
78
+ rdfs:label "promotes"@en ;
79
+ rdfs:comment "The finding an anchor promotes into a binding constraint."@en .
80
+ bw:constrains a rdf:Property ;
81
+ rdfs:label "constrains"@en ;
82
+ rdfs:comment "The narrative entity (or timeline) an anchor constrains."@en .
@@ -0,0 +1,33 @@
1
+ """Validation subsystem: deterministic coherence checks + the ``validate`` command.
2
+
3
+ The public surface a custom validator imports (``Severity``, ``Violation``) and the
4
+ engine seam the command wires together (discovery, the runner, the report).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from bookwright.validation.base import (
10
+ Severity,
11
+ UnknownValidatorError,
12
+ ValidationContext,
13
+ Validator,
14
+ ValidatorError,
15
+ Violation,
16
+ )
17
+ from bookwright.validation.registry import discover_validators, resolve_active
18
+ from bookwright.validation.report import ScopeFilter, ValidationReport
19
+ from bookwright.validation.runner import run_validators
20
+
21
+ __all__ = [
22
+ "ScopeFilter",
23
+ "Severity",
24
+ "UnknownValidatorError",
25
+ "ValidationContext",
26
+ "ValidationReport",
27
+ "Validator",
28
+ "ValidatorError",
29
+ "Violation",
30
+ "discover_validators",
31
+ "resolve_active",
32
+ "run_validators",
33
+ ]