quirework 0.1.0__tar.gz

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 (255) hide show
  1. quirework-0.1.0/LICENSE +21 -0
  2. quirework-0.1.0/PKG-INFO +444 -0
  3. quirework-0.1.0/README.md +410 -0
  4. quirework-0.1.0/pyproject.toml +54 -0
  5. quirework-0.1.0/setup.cfg +4 -0
  6. quirework-0.1.0/src/quirework/__init__.py +3 -0
  7. quirework-0.1.0/src/quirework/__main__.py +3 -0
  8. quirework-0.1.0/src/quirework/cli.py +431 -0
  9. quirework-0.1.0/src/quirework/core/__init__.py +1 -0
  10. quirework-0.1.0/src/quirework/core/artifact_paths.py +86 -0
  11. quirework-0.1.0/src/quirework/core/checks.py +235 -0
  12. quirework-0.1.0/src/quirework/core/frontmatter.py +83 -0
  13. quirework-0.1.0/src/quirework/core/globs.py +45 -0
  14. quirework-0.1.0/src/quirework/core/pinned.py +169 -0
  15. quirework-0.1.0/src/quirework/core/usage.py +604 -0
  16. quirework-0.1.0/src/quirework/delivery/__init__.py +1 -0
  17. quirework-0.1.0/src/quirework/delivery/artifacts.py +210 -0
  18. quirework-0.1.0/src/quirework/delivery/text.py +166 -0
  19. quirework-0.1.0/src/quirework/manuscript/__init__.py +1 -0
  20. quirework-0.1.0/src/quirework/manuscript/backfill.py +1972 -0
  21. quirework-0.1.0/src/quirework/manuscript/editions.py +111 -0
  22. quirework-0.1.0/src/quirework/manuscript/footprint.py +95 -0
  23. quirework-0.1.0/src/quirework/manuscript/formats.py +208 -0
  24. quirework-0.1.0/src/quirework/manuscript/lifecycle.py +191 -0
  25. quirework-0.1.0/src/quirework/manuscript/notes.py +2301 -0
  26. quirework-0.1.0/src/quirework/manuscript/pages.py +284 -0
  27. quirework-0.1.0/src/quirework/manuscript/quarto.py +416 -0
  28. quirework-0.1.0/src/quirework/manuscript/quotes.py +512 -0
  29. quirework-0.1.0/src/quirework/manuscript/rename.py +309 -0
  30. quirework-0.1.0/src/quirework/manuscript/sources.py +286 -0
  31. quirework-0.1.0/src/quirework/manuscript/trail.py +1875 -0
  32. quirework-0.1.0/src/quirework/manuscript/units.py +416 -0
  33. quirework-0.1.0/src/quirework/project.py +645 -0
  34. quirework-0.1.0/src/quirework/provenance/__init__.py +1 -0
  35. quirework-0.1.0/src/quirework/provenance/agyfilter.py +436 -0
  36. quirework-0.1.0/src/quirework/provenance/backup/__init__.py +469 -0
  37. quirework-0.1.0/src/quirework/provenance/backup/base.py +290 -0
  38. quirework-0.1.0/src/quirework/provenance/backup/command.py +107 -0
  39. quirework-0.1.0/src/quirework/provenance/backup/directory.py +142 -0
  40. quirework-0.1.0/src/quirework/provenance/backup/git.py +150 -0
  41. quirework-0.1.0/src/quirework/provenance/backup/rclone.py +153 -0
  42. quirework-0.1.0/src/quirework/provenance/capture/__init__.py +1 -0
  43. quirework-0.1.0/src/quirework/provenance/capture/commands.py +28 -0
  44. quirework-0.1.0/src/quirework/provenance/capture/extract_artifacts.py +110 -0
  45. quirework-0.1.0/src/quirework/provenance/capture/extract_files.py +118 -0
  46. quirework-0.1.0/src/quirework/provenance/capture/fetch_conversation.py +127 -0
  47. quirework-0.1.0/src/quirework/provenance/capture/fetch_gemini.py +149 -0
  48. quirework-0.1.0/src/quirework/provenance/capture/render_transcript.py +126 -0
  49. quirework-0.1.0/src/quirework/provenance/capture/transform.py +22 -0
  50. quirework-0.1.0/src/quirework/provenance/catalog.py +733 -0
  51. quirework-0.1.0/src/quirework/provenance/ccfilter.py +1126 -0
  52. quirework-0.1.0/src/quirework/provenance/codexfilter.py +883 -0
  53. quirework-0.1.0/src/quirework/provenance/coldread.py +1731 -0
  54. quirework-0.1.0/src/quirework/provenance/curate.py +67 -0
  55. quirework-0.1.0/src/quirework/provenance/humaninput.py +811 -0
  56. quirework-0.1.0/src/quirework/provenance/ingest.py +31 -0
  57. quirework-0.1.0/src/quirework/provenance/ingestion/__init__.py +1 -0
  58. quirework-0.1.0/src/quirework/provenance/ingestion/agy.py +192 -0
  59. quirework-0.1.0/src/quirework/provenance/ingestion/claude.py +493 -0
  60. quirework-0.1.0/src/quirework/provenance/ingestion/codex.py +296 -0
  61. quirework-0.1.0/src/quirework/provenance/lineage.py +148 -0
  62. quirework-0.1.0/src/quirework/provenance/metrics.py +1247 -0
  63. quirework-0.1.0/src/quirework/provenance/rulings.py +478 -0
  64. quirework-0.1.0/src/quirework/provenance/scope.py +73 -0
  65. quirework-0.1.0/src/quirework/provenance/search.py +455 -0
  66. quirework-0.1.0/src/quirework/provenance/semantic.py +475 -0
  67. quirework-0.1.0/src/quirework/provenance/show.py +1213 -0
  68. quirework-0.1.0/src/quirework/provenance/store.py +1271 -0
  69. quirework-0.1.0/src/quirework/provenance/trees.py +133 -0
  70. quirework-0.1.0/src/quirework/provenance/worktrees.py +199 -0
  71. quirework-0.1.0/src/quirework/providers/__init__.py +1 -0
  72. quirework-0.1.0/src/quirework/providers/blind.py +2192 -0
  73. quirework-0.1.0/src/quirework/providers/canary.py +685 -0
  74. quirework-0.1.0/src/quirework/providers/catalog.py +44 -0
  75. quirework-0.1.0/src/quirework/providers/claude_login.py +92 -0
  76. quirework-0.1.0/src/quirework/providers/exits.py +196 -0
  77. quirework-0.1.0/src/quirework/providers/harness.py +830 -0
  78. quirework-0.1.0/src/quirework/providers/images.py +92 -0
  79. quirework-0.1.0/src/quirework/providers/models.py +1284 -0
  80. quirework-0.1.0/src/quirework/providers/quota.py +588 -0
  81. quirework-0.1.0/src/quirework/providers/reads.py +474 -0
  82. quirework-0.1.0/src/quirework/providers/replies.py +175 -0
  83. quirework-0.1.0/src/quirework/publish/__init__.py +1 -0
  84. quirework-0.1.0/src/quirework/publish/backends.py +112 -0
  85. quirework-0.1.0/src/quirework/publish/bookstage.py +1086 -0
  86. quirework-0.1.0/src/quirework/publish/build.py +60 -0
  87. quirework-0.1.0/src/quirework/publish/editions.py +48 -0
  88. quirework-0.1.0/src/quirework/publish/epubcheck.py +287 -0
  89. quirework-0.1.0/src/quirework/publish/experiment.py +1097 -0
  90. quirework-0.1.0/src/quirework/publish/figfonts.py +234 -0
  91. quirework-0.1.0/src/quirework/publish/fignumbers.py +293 -0
  92. quirework-0.1.0/src/quirework/publish/figures.py +729 -0
  93. quirework-0.1.0/src/quirework/publish/folios.py +62 -0
  94. quirework-0.1.0/src/quirework/publish/fonts.py +307 -0
  95. quirework-0.1.0/src/quirework/publish/graybuild.py +73 -0
  96. quirework-0.1.0/src/quirework/publish/hugo.py +117 -0
  97. quirework-0.1.0/src/quirework/publish/kindle.js +411 -0
  98. quirework-0.1.0/src/quirework/publish/kindle.py +1393 -0
  99. quirework-0.1.0/src/quirework/publish/panelkit.py +918 -0
  100. quirework-0.1.0/src/quirework/publish/plans.py +651 -0
  101. quirework-0.1.0/src/quirework/publish/proof.py +792 -0
  102. quirework-0.1.0/src/quirework/publish/redpen.py +1654 -0
  103. quirework-0.1.0/src/quirework/publish/render.py +942 -0
  104. quirework-0.1.0/src/quirework/publish/targets.py +216 -0
  105. quirework-0.1.0/src/quirework/publish/variant.py +918 -0
  106. quirework-0.1.0/src/quirework/runs/__init__.py +1 -0
  107. quirework-0.1.0/src/quirework/runs/__main__.py +15 -0
  108. quirework-0.1.0/src/quirework/runs/commands.py +278 -0
  109. quirework-0.1.0/src/quirework/runs/coverage.py +86 -0
  110. quirework-0.1.0/src/quirework/runs/engine.py +2143 -0
  111. quirework-0.1.0/src/quirework/runs/feed.py +853 -0
  112. quirework-0.1.0/src/quirework/runs/observe.py +379 -0
  113. quirework-0.1.0/src/quirework/runs/storage.py +155 -0
  114. quirework-0.1.0/src/quirework/settings.py +492 -0
  115. quirework-0.1.0/src/quirework/sops/__init__.py +1 -0
  116. quirework-0.1.0/src/quirework/sops/catalog.py +386 -0
  117. quirework-0.1.0/src/quirework/sops/commands.py +567 -0
  118. quirework-0.1.0/src/quirework/sops/composition.py +382 -0
  119. quirework-0.1.0/src/quirework/sops/instruments.py +184 -0
  120. quirework-0.1.0/src/quirework/sops/personas.py +296 -0
  121. quirework-0.1.0/src/quirework/sops/review.py +2568 -0
  122. quirework-0.1.0/src/quirework/sops/room.py +2791 -0
  123. quirework-0.1.0/src/quirework/sops/roundtable.py +2578 -0
  124. quirework-0.1.0/src/quirework/sops/sections.py +169 -0
  125. quirework-0.1.0/src/quirework/sops/workshop.py +1629 -0
  126. quirework-0.1.0/src/quirework/templates/backup.toml +39 -0
  127. quirework-0.1.0/src/quirework/templates/book.toml +88 -0
  128. quirework-0.1.0/src/quirework/templates/run.toml +32 -0
  129. quirework-0.1.0/src/quirework/templates/site.toml +90 -0
  130. quirework-0.1.0/src/quirework/templates/tells.toml +64 -0
  131. quirework-0.1.0/src/quirework/templates/terminology.toml +20 -0
  132. quirework-0.1.0/src/quirework/templates/tmpfiles.conf +42 -0
  133. quirework-0.1.0/src/quirework/testing.py +345 -0
  134. quirework-0.1.0/src/quirework/text/__init__.py +1 -0
  135. quirework-0.1.0/src/quirework/text/jargon.py +545 -0
  136. quirework-0.1.0/src/quirework/text/mdwrap.py +1001 -0
  137. quirework-0.1.0/src/quirework/text/tells.py +547 -0
  138. quirework-0.1.0/src/quirework.egg-info/PKG-INFO +444 -0
  139. quirework-0.1.0/src/quirework.egg-info/SOURCES.txt +253 -0
  140. quirework-0.1.0/src/quirework.egg-info/dependency_links.txt +1 -0
  141. quirework-0.1.0/src/quirework.egg-info/entry_points.txt +2 -0
  142. quirework-0.1.0/src/quirework.egg-info/requires.txt +19 -0
  143. quirework-0.1.0/src/quirework.egg-info/top_level.txt +1 -0
  144. quirework-0.1.0/tests/test_agy_ingestion.py +35 -0
  145. quirework-0.1.0/tests/test_agyfilter.py +367 -0
  146. quirework-0.1.0/tests/test_architecture.py +70 -0
  147. quirework-0.1.0/tests/test_artifact_paths.py +54 -0
  148. quirework-0.1.0/tests/test_author_turns.py +259 -0
  149. quirework-0.1.0/tests/test_backup.py +936 -0
  150. quirework-0.1.0/tests/test_blind.py +793 -0
  151. quirework-0.1.0/tests/test_blind_jail.py +181 -0
  152. quirework-0.1.0/tests/test_bookstage.py +611 -0
  153. quirework-0.1.0/tests/test_canary.py +594 -0
  154. quirework-0.1.0/tests/test_catalog.py +294 -0
  155. quirework-0.1.0/tests/test_ccfilter.py +1133 -0
  156. quirework-0.1.0/tests/test_chapter_experiment.py +617 -0
  157. quirework-0.1.0/tests/test_checks.py +283 -0
  158. quirework-0.1.0/tests/test_claude_login.py +310 -0
  159. quirework-0.1.0/tests/test_cli_help.py +94 -0
  160. quirework-0.1.0/tests/test_codex_selection.py +107 -0
  161. quirework-0.1.0/tests/test_codexfilter.py +547 -0
  162. quirework-0.1.0/tests/test_coldread_cache.py +450 -0
  163. quirework-0.1.0/tests/test_coldread_triage.py +50 -0
  164. quirework-0.1.0/tests/test_composition.py +109 -0
  165. quirework-0.1.0/tests/test_configuration_guide.py +103 -0
  166. quirework-0.1.0/tests/test_edition_bindings.py +200 -0
  167. quirework-0.1.0/tests/test_editions.py +286 -0
  168. quirework-0.1.0/tests/test_epub_conform.py +181 -0
  169. quirework-0.1.0/tests/test_epubcheck.py +102 -0
  170. quirework-0.1.0/tests/test_example_side_quest.py +228 -0
  171. quirework-0.1.0/tests/test_example_site.py +145 -0
  172. quirework-0.1.0/tests/test_exits.py +147 -0
  173. quirework-0.1.0/tests/test_export_flat.py +129 -0
  174. quirework-0.1.0/tests/test_feed.py +528 -0
  175. quirework-0.1.0/tests/test_fignumbers.py +233 -0
  176. quirework-0.1.0/tests/test_figure_fonts.py +166 -0
  177. quirework-0.1.0/tests/test_figure_inventory.py +88 -0
  178. quirework-0.1.0/tests/test_figure_legibility.py +60 -0
  179. quirework-0.1.0/tests/test_figures.py +276 -0
  180. quirework-0.1.0/tests/test_folios.py +41 -0
  181. quirework-0.1.0/tests/test_footprint.py +189 -0
  182. quirework-0.1.0/tests/test_graybuild.py +58 -0
  183. quirework-0.1.0/tests/test_humaninput.py +197 -0
  184. quirework-0.1.0/tests/test_kindle.py +1005 -0
  185. quirework-0.1.0/tests/test_lifecycle.py +299 -0
  186. quirework-0.1.0/tests/test_live_drivers.py +339 -0
  187. quirework-0.1.0/tests/test_mdwrap.py +734 -0
  188. quirework-0.1.0/tests/test_metrics_paste.py +121 -0
  189. quirework-0.1.0/tests/test_mounted_reads.py +889 -0
  190. quirework-0.1.0/tests/test_notes.py +1401 -0
  191. quirework-0.1.0/tests/test_notes_command.py +133 -0
  192. quirework-0.1.0/tests/test_pages.py +368 -0
  193. quirework-0.1.0/tests/test_panelkit.py +494 -0
  194. quirework-0.1.0/tests/test_personas.py +85 -0
  195. quirework-0.1.0/tests/test_pinned.py +155 -0
  196. quirework-0.1.0/tests/test_project.py +619 -0
  197. quirework-0.1.0/tests/test_project_trees.py +229 -0
  198. quirework-0.1.0/tests/test_proof.py +633 -0
  199. quirework-0.1.0/tests/test_provenance_lineage.py +230 -0
  200. quirework-0.1.0/tests/test_provenance_metrics.py +207 -0
  201. quirework-0.1.0/tests/test_provenance_search.py +86 -0
  202. quirework-0.1.0/tests/test_provenance_semantic.py +53 -0
  203. quirework-0.1.0/tests/test_provenance_show.py +776 -0
  204. quirework-0.1.0/tests/test_publish_backends.py +307 -0
  205. quirework-0.1.0/tests/test_quarto_registry.py +121 -0
  206. quirework-0.1.0/tests/test_quota.py +403 -0
  207. quirework-0.1.0/tests/test_quotes_all.py +82 -0
  208. quirework-0.1.0/tests/test_reader_copy.py +149 -0
  209. quirework-0.1.0/tests/test_receipts.py +125 -0
  210. quirework-0.1.0/tests/test_redpen.py +891 -0
  211. quirework-0.1.0/tests/test_redpen_titles.py +47 -0
  212. quirework-0.1.0/tests/test_register.py +271 -0
  213. quirework-0.1.0/tests/test_rename.py +209 -0
  214. quirework-0.1.0/tests/test_render.py +734 -0
  215. quirework-0.1.0/tests/test_replies.py +303 -0
  216. quirework-0.1.0/tests/test_retired_phrases.py +124 -0
  217. quirework-0.1.0/tests/test_review_handoff.py +297 -0
  218. quirework-0.1.0/tests/test_review_jail.py +246 -0
  219. quirework-0.1.0/tests/test_review_range.py +43 -0
  220. quirework-0.1.0/tests/test_review_resume.py +87 -0
  221. quirework-0.1.0/tests/test_review_status.py +174 -0
  222. quirework-0.1.0/tests/test_review_tools.py +80 -0
  223. quirework-0.1.0/tests/test_review_watch.py +124 -0
  224. quirework-0.1.0/tests/test_room.py +2022 -0
  225. quirework-0.1.0/tests/test_roundtable.py +1268 -0
  226. quirework-0.1.0/tests/test_rulings.py +316 -0
  227. quirework-0.1.0/tests/test_run_coverage.py +82 -0
  228. quirework-0.1.0/tests/test_run_observe.py +308 -0
  229. quirework-0.1.0/tests/test_run_quota.py +631 -0
  230. quirework-0.1.0/tests/test_run_seats.py +175 -0
  231. quirework-0.1.0/tests/test_runs.py +1128 -0
  232. quirework-0.1.0/tests/test_scope.py +167 -0
  233. quirework-0.1.0/tests/test_search.py +257 -0
  234. quirework-0.1.0/tests/test_selfdriven.py +456 -0
  235. quirework-0.1.0/tests/test_semantic.py +344 -0
  236. quirework-0.1.0/tests/test_settings.py +158 -0
  237. quirework-0.1.0/tests/test_shared_spec_files.py +475 -0
  238. quirework-0.1.0/tests/test_show.py +494 -0
  239. quirework-0.1.0/tests/test_sop_sections.py +243 -0
  240. quirework-0.1.0/tests/test_sources.py +190 -0
  241. quirework-0.1.0/tests/test_store.py +911 -0
  242. quirework-0.1.0/tests/test_suite_scratch.py +68 -0
  243. quirework-0.1.0/tests/test_tells.py +359 -0
  244. quirework-0.1.0/tests/test_testing_plugin.py +137 -0
  245. quirework-0.1.0/tests/test_trail.py +862 -0
  246. quirework-0.1.0/tests/test_trail_backfill.py +979 -0
  247. quirework-0.1.0/tests/test_unit_references.py +222 -0
  248. quirework-0.1.0/tests/test_units.py +140 -0
  249. quirework-0.1.0/tests/test_usage.py +385 -0
  250. quirework-0.1.0/tests/test_variant.py +621 -0
  251. quirework-0.1.0/tests/test_workshop_drivers.py +497 -0
  252. quirework-0.1.0/tests/test_workshop_resume.py +170 -0
  253. quirework-0.1.0/tests/test_workshop_roster.py +111 -0
  254. quirework-0.1.0/tests/test_workshop_watch.py +124 -0
  255. quirework-0.1.0/tests/test_worktrees.py +160 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ademar Reis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,444 @@
1
+ Metadata-Version: 2.4
2
+ Name: quirework
3
+ Version: 0.1.0
4
+ Summary: Tools for writing and researching books and sites with an AI companion
5
+ Author: Ademar Reis
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://quirework.com
8
+ Project-URL: Source, https://github.com/adereis/quirework
9
+ Project-URL: Documentation, https://github.com/adereis/quirework/tree/main/docs
10
+ Project-URL: Issues, https://github.com/adereis/quirework/issues
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: Natural Language :: English
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Provides-Extra: capture
20
+ Requires-Dist: websocket-client>=1.6; extra == "capture"
21
+ Provides-Extra: quarto
22
+ Requires-Dist: quarto-cli>=1.5; extra == "quarto"
23
+ Requires-Dist: pypdf>=4; extra == "quarto"
24
+ Requires-Dist: fonttools[woff]>=4.40; extra == "quarto"
25
+ Requires-Dist: Pillow>=9.4; extra == "quarto"
26
+ Provides-Extra: semantic
27
+ Requires-Dist: numpy>=1.24; extra == "semantic"
28
+ Requires-Dist: fastembed>=0.4; extra == "semantic"
29
+ Provides-Extra: test
30
+ Requires-Dist: pytest>=8; extra == "test"
31
+ Provides-Extra: dev
32
+ Requires-Dist: quirework[capture,quarto,semantic,test]; extra == "dev"
33
+ Dynamic: license-file
34
+
35
+ # Quirework
36
+
37
+ Quirework is a set of tools for writing and researching with an AI
38
+ companion such as Claude Code or Codex. The work can be a book, a site
39
+ of long-lived posts, or anything else that has to stay consistent with
40
+ itself while it grows. The companion works in your project. Quirework
41
+ gives it a durable spec, named procedures, consistency checks,
42
+ publication tools, and controlled ways to ask other models for an
43
+ independent view.
44
+
45
+ You can run every command yourself. That is not the workflow Quirework
46
+ was made for. The normal workflow is to tell your companion what you
47
+ want to accomplish, let it follow the project's procedure, and judge the
48
+ evidence it brings back.
49
+
50
+ Quirework does not write your work and it does not settle editorial
51
+ questions. It gives the collaboration a memory and a method. It builds
52
+ the artifacts, catches drift across chapters or posts, and preserves
53
+ enough evidence for you to make the call.
54
+
55
+ A Quarto book can use it, and so can a site of Markdown pages such as a
56
+ Hugo blog. One installation serves several, because a project is
57
+ selected by a `quirework.toml` found from the working directory and
58
+ never by where the package happens to live.
59
+
60
+ The website, [quirework.com](https://quirework.com), shows the tool at
61
+ work: the spec and its trail, the procedures, and a fictional sample
62
+ book you can read in every edition it was published in. AI wrote that
63
+ book to test the tool, and no person reviewed its prose. Every deploy
64
+ renders it again from the same commit of this repository.
65
+
66
+ ## The default workflow
67
+
68
+ The author sets the aim and keeps editorial authority. The AI companion
69
+ coordinates the work. Quirework makes that work inspectable and
70
+ repeatable.
71
+
72
+ A typical revision starts with a request in Claude Code or Codex. The
73
+ companion then follows this loop:
74
+
75
+ 1. Read the project's guide and resolve the relevant SOP with
76
+ `quirework sop explain NAME`.
77
+ 2. Load the work's commitments, the guidance for the chapter or post at
78
+ hand, and its bindings with `quirework spec notes --primer`.
79
+ 3. Inspect the prose and the prior human decisions the task needs.
80
+ `quirework spec trail SLUG` leads from a commitment to the author's
81
+ own turns that shaped it.
82
+ 4. Draft or revise inside the limits of the SOP.
83
+ 5. Convene a writers room, a roundtable, a prose workshop, or blind
84
+ readers when the task benefits from independent perspectives.
85
+ 6. Reconcile those reports against the spec instead of treating a model
86
+ answer as authority.
87
+ 7. Run the structural, editorial, and publication checks named by the
88
+ SOP, and an independent consistency review where it asks for one.
89
+ 8. Return the change, the evidence, and any remaining author decision.
90
+
91
+ The spec is the center of that loop. It states what the work currently
92
+ holds. Sidecars bind passages to those commitments. When one commitment
93
+ changes, the companion can find every chapter or post that expresses it
94
+ before a local edit becomes a contradiction somewhere else.
95
+
96
+ SOPs make the rest of the loop project-specific. A project can define
97
+ how its companion writes a chapter or a post, checks a claim, researches
98
+ a source, runs a workshop, or prepares a blind read. Quirework catalogs
99
+ those procedures and generates thin skill routes for Claude Code and
100
+ portable agents. The SOP remains the source of truth.
101
+
102
+ The foreground companion is not tied to the models it supervises. A
103
+ Codex session can send a blind reading to Claude. A Claude Code session
104
+ can convene a room with Codex, Claude, and Antigravity seats. Each seat
105
+ declares its harness, model, effort, materials, and access policy. The
106
+ receipt records what the provider actually served.
107
+
108
+ The
109
+ [workflow guide](https://github.com/adereis/quirework/blob/main/docs/workflows.md)
110
+ develops this loop through five especially useful patterns: writers
111
+ rooms, roundtables of models working together as themselves, independent
112
+ prose workshops, blind-reader panels, and contextual consistency
113
+ reviews.
114
+
115
+ ## What it does
116
+
117
+ ### Keeps the claims from drifting apart
118
+
119
+ A work that argues something has commitments, and after a year they live
120
+ in one chapter's phrasing and contradict another's. Quirework gives them
121
+ a file. Each commitment is a section with a slug, each chapter names the
122
+ sections it expresses, and `spec notes bind --slug S` answers the
123
+ question that matters when you change one: which other chapters have to
124
+ change with it.
125
+
126
+ A site argues one thing per post, so each post can keep a spec of its
127
+ own: its reader, its thesis, its boundaries. A shared spec holds what
128
+ several posts lean on, and a post that binds another's claim is listed
129
+ when that claim changes.
130
+
131
+ The shared spec can span several files read as one register, such as
132
+ what the work claims in one and how it states it in another. A project
133
+ can publish some of those files and keep the rest to itself, and the
134
+ gate then refuses a published page that cites a section its reader
135
+ cannot open. A slug is a name, and a section can outgrow it.
136
+ `spec rename OLD NEW` rewrites a slug everywhere it is written, and
137
+ refuses before writing anything if it cannot.
138
+
139
+ The annotations live in a sidecar rather than in the prose, so the
140
+ rendered text never carries them and reflowing a paragraph never
141
+ disturbs them. A book keeps them beside each chapter, and a site keeps
142
+ them outside the tree its generator renders. A derived edition's
143
+ documents bind the same spec, so a commitment can be followed from the
144
+ chapter that states it into every edition that retells it.
145
+ `spec notes --check` gates the structure: a mark left in the prose, a
146
+ sidecar that no longer mirrors its chapter, a binding that names a
147
+ commitment the spec does not declare, a reading order that disagrees
148
+ with the files on disk. `spec quotes` checks that a phrase quoted in
149
+ metadata still exists in the work, and `--grep TERM` lists every
150
+ quotation of a term you just retired from the prose.
151
+
152
+ ### Keeps track of what the work stands on
153
+
154
+ Research gets a register too. Each source has a slug, in one file of
155
+ sections or one file per source, and a mark cites it as `@source(slug)`.
156
+ `spec sources --slug S` then lists every chapter or post that leans on a
157
+ source, and the gate refuses a citation of a source the register does
158
+ not hold. A source can keep a plain-text capture of itself, and a
159
+ quotation from it is checked against that capture, so a misremembered
160
+ line is caught the way a misquoted chapter is. A references register,
161
+ which says where the work stands on each source, cites the spec by slug,
162
+ and the gate holds each of those citations to a section that exists.
163
+
164
+ ### Remembers how the work was written
165
+
166
+ `provenance` captures your Claude Code, Codex and Antigravity sessions
167
+ from their local stores, and web conversations too. The captures go to a
168
+ store outside your repository and wait there until you read and accept
169
+ them. The repository keeps only the decisions: which sessions count,
170
+ each with a hash that proves its bytes. So the transcripts never bloat
171
+ the work's history, and a grep across the repository never wades through
172
+ them. `provenance store backup` copies the store to the destinations it
173
+ names, through rclone, a mounted directory, git or a script of your own.
174
+ It never deletes a session at a destination before the copy that
175
+ replaced it has arrived. `provenance search` then reads the human's own
176
+ turns, by keyword or by meaning; the semantic index is built and stored
177
+ locally, so corpus text never leaves the machine.
178
+
179
+ `spec trail` connects that record to the spec without putting any of it
180
+ in the spec. A trail sidecar, kept beside the private corpus, points
181
+ each spec section at the conversations where the author seeded,
182
+ sharpened or reversed it: a session and the time a turn was logged, not
183
+ a copy of the words. A companion about to change a commitment reads the
184
+ author's own turns, oldest first, and opens as much of each conversation
185
+ as it needs. For a spec that grew before it had a trail,
186
+ `spec trail backfill` has cheap readers flag every session once and
187
+ leaves the decision for each section to a strong model. Each read
188
+ records the turns it saw, so a session that later gains turns is handed
189
+ out again for those turns alone.
190
+
191
+ On top of that corpus it measures things about the making. `metrics`
192
+ estimates the division of labor between the human and the AI, with its
193
+ caveats attached rather than laundered away. `input` compiles the
194
+ human's verbatim words. `coldread` puts the record in front of blind
195
+ analysts and caches their reports by content, so changing the recipe
196
+ misses the cache deliberately rather than reusing an answer to a
197
+ different question.
198
+
199
+ ### Turns procedures into something your companion can follow
200
+
201
+ Procedures are files the project writes, and the catalog makes them
202
+ navigable: `sop explain NAME` prints required reading in dependency
203
+ order with its word count, while follow-up work is recorded and
204
+ deliberately never traversed for you. Personas say who is reading,
205
+ instruments say what they are asked, and both are versioned data
206
+ composed at preparation and frozen with the run. `sop skills` generates
207
+ thin entry points so Claude Code or Codex can be pointed at a procedure
208
+ by name. A procedure that declares modes has them named in its entry
209
+ point, and `sop show NAME --mode MODE` prints only the part a request
210
+ needs. An entry point stops once it has presented its plan, before any
211
+ run starts, unless the request opens with `go`.
212
+
213
+ ### Runs models under conditions you declared
214
+
215
+ A run is a plan: seats, ordered turns, an explicit model and effort.
216
+ Prepare freezes the prompts and the inputs and hashes them, start
217
+ executes through Codex, Claude Code or Antigravity, and the receipt
218
+ records the model actually served rather than the one requested. Each
219
+ claim in it names its source: the effort is read from the harness's own
220
+ session record where the harness keeps one, and the billing names the
221
+ kind of credential the seat ran on, never the credential itself. A
222
+ Claude seat can run through a gateway the project declares, and then
223
+ never borrows the host's own login.
224
+
225
+ The controls are the point. A seat can be confined by the operating
226
+ system rather than asked nicely, and where a provider can only offer an
227
+ audited boundary the run says so instead of claiming isolation. Delivery
228
+ is a separate choice from exposure: plain text, prose with its figures,
229
+ rendered PDF pages, native file attachments. A pending request is never
230
+ blindly resubmitted, a run stopped by a quota limit is continued in its
231
+ own session rather than restarted, and a compaction event is always
232
+ reported even when the answer looks fine. `sop runs watch` follows a run
233
+ as it goes, and `export` hands back the answers and a sanitized receipt.
234
+
235
+ The five patterns build on that engine, and what tells them apart is who
236
+ sees what. A writers room (`sop room`) develops one answer through
237
+ disagreement on a shared board. A roundtable (`sop roundtable`) has
238
+ models work together as themselves, each seeing every turn as it
239
+ happens. A prose workshop (`sop workshop`) gives every writer the same
240
+ frozen packet and never another writer's draft, and keeps the drafts
241
+ anonymous under a sealed key. A blind-reader panel (`sop panel`) shows
242
+ each reader only the reader-facing material. A consistency review
243
+ (`sop review`) gives an independent reviewer the project guide, the
244
+ spec, the marks, a brief and a Git range, with the repository read-only.
245
+
246
+ ### Publishes a book in four formats, or a site through its generator
247
+
248
+ Publishing is a backend the project names. A site built by Hugo keeps
249
+ its own configuration, theme and deploy, and `publish build` builds it
250
+ into the project's build tree, where it cannot overwrite the directory
251
+ the site deploys from. A project that publishes more than one thing,
252
+ such as a book and the site that serves its editions, names each as a
253
+ target, and a target can take another's output into its own. A book gets
254
+ the rest of this section.
255
+
256
+ `publish build` renders a Quarto manuscript to every format its
257
+ `_quarto.yml` lists: HTML, PDF through Typst, EPUB and DOCX for a book
258
+ that lists all four, as the authoring guide's example does. It stages
259
+ three trees to do it, because the formats disagree about what they will
260
+ carry, and it checks afterwards that a figure has the same number in
261
+ every edition rather than assuming so. The source tree is never written
262
+ into.
263
+
264
+ Every derived edition renders the same way: a memo for a manager, a
265
+ version for young readers, the book as poems, each composed beside the
266
+ book with a `_quarto.yml` of its own.
267
+
268
+ It also does the things that go wrong silently. It generates a grayscale
269
+ figure set from the color one, because e-ink desaturates color into mud.
270
+ It validates the EPUB with the W3C reference checker, pinned by version
271
+ and checksum, because a file every desktop reader opens can still be
272
+ rejected by a retailer. It refuses to render in a substituted typeface,
273
+ because Typst and rsvg substitute without complaining and the whole book
274
+ comes out in the wrong face.
275
+
276
+ ### Hands copies to readers and brings their marks back
277
+
278
+ A reader's note is only useful if it finds the text it was written
279
+ against. Until a book is published, it can render every copy as a proof
280
+ named for its commit, with the commit stamped on its pages, and the
281
+ build stops if one page lacks the stamp. `publish copy --for NAME`
282
+ renders a proof for one person from a committed tree. The copy takes the
283
+ next number in a log kept outside the project, and its file is named by
284
+ that number, never by the person.
285
+
286
+ The marks come back the same way they went out. `publish redpen` builds
287
+ a reviewable DOCX and reads the reviewer's marks back onto the source.
288
+ `publish kindle` delivers a copy to a Kindle library from a signed-in
289
+ browser tab, then finds each highlight and note from the reader's
290
+ exported notebook in the manuscript. Marks on a copy made for the author
291
+ become the author's own turns in the record, and another reader's are
292
+ kept apart as that reader's feedback. `provenance rulings archive` keeps
293
+ the rulings the author makes on a review sheet as turns of theirs too,
294
+ so a spec trail can point at one.
295
+
296
+ ### Formats and inspects the prose
297
+
298
+ `text wrap` applies the project's own conventions, and it can apply
299
+ different ones per path, declared as a table of globs: one sentence per
300
+ line in chapters or posts, hard wrapped at a column in guides.
301
+ `text check` reports field jargon in reader-facing prose against a term
302
+ list the project writes, so a word must be avoided, glossed on first
303
+ use, or confined to where it belongs. A phrase the project has retired
304
+ goes on the same list and fails the check if it ever comes back.
305
+ `text tells` reports the habits a model leaves in prose it drafted: the
306
+ contrast move, which says what a thing is by saying what it is not, and
307
+ phrases the project lists. `--since REV` prints only what the working
308
+ tree adds over a revision, which is the warning a commit hook or a
309
+ review pass wants; like `text check`, it never gates. Quirework ships no
310
+ default phrase list, since a stale one would read as clean prose;
311
+ `config template tells` prints a dated seed and the recipe for keeping
312
+ it current.
313
+
314
+ ## Install
315
+
316
+ Python 3.11 or later is required. A checkout of this repository brings
317
+ the two examples along with the tool:
318
+
319
+ ```bash
320
+ git clone https://github.com/adereis/quirework.git
321
+ cd quirework
322
+ python3 -m venv --system-site-packages .venv
323
+ .venv/bin/python -m pip install -e '.[quarto]'
324
+ ```
325
+
326
+ Put `.venv/bin` on your `PATH`, or copy `.envrc.example` to `.envrc` and
327
+ let direnv do it. To install the released package into an environment of
328
+ your own without a checkout, run `pip install 'quirework[quarto]'`.
329
+
330
+ The extras follow the work. `quarto` installs Quarto, which brings Typst
331
+ for the PDF, and what a book's render needs besides. A site needs none.
332
+ `semantic` adds local semantic search of the corpus, `capture` captures
333
+ web conversations from a browser, and `test` runs the test suite. `dev`
334
+ includes all of them.
335
+
336
+ The core and command discovery use the Python standard library. Other
337
+ programs are needed only by the operations that use them:
338
+
339
+ - Model seats run through the Codex, Claude Code or Antigravity CLI,
340
+ each installed separately.
341
+ - Enforced filesystem isolation uses bubblewrap on Linux, and an
342
+ Antigravity seat also needs `xdg-dbus-proxy`.
343
+ - A book's PDF and SVG work uses Poppler and librsvg, and the typeface
344
+ check uses Fontconfig.
345
+ - EPUB validation needs Java and the W3C checker, which
346
+ `quirework publish epubcheck --install` fetches pinned by version and
347
+ checksum. A render without them says the EPUB was not validated.
348
+ - A site renders with Hugo, and a store backup uses rclone when one of
349
+ its targets does.
350
+
351
+ A missing required program stops the operation with an error.
352
+
353
+ ## Let the companion choose the tools
354
+
355
+ You normally work by describing the job to your AI companion. The
356
+ command groups below are the vocabulary it uses to carry out that job:
357
+
358
+ ```text
359
+ quirework spec Read and check the spec, marks, sources, quotations and trail
360
+ quirework publish Render the manuscript and inspect its editions
361
+ quirework text Format and inspect writing
362
+ quirework provenance Capture, organize, and search source history
363
+ quirework sop Find procedures and operate supervised workflows
364
+ quirework dev Repository checks and tooling maintenance
365
+ quirework config Inspect and validate project configuration
366
+ quirework usage Report which commands, procedures and seats get used
367
+ ```
368
+
369
+ You can also run the commands directly. Add `--help` at any level to
370
+ inspect the actual options. Help does not require a project, a private
371
+ corpus, or a provider account.
372
+
373
+ Common operations include:
374
+
375
+ ```bash
376
+ quirework spec notes --primer -c opening
377
+ quirework spec notes bind --slug kettle-signal
378
+ quirework spec trail kettle-signal
379
+ quirework spec notes --check
380
+ quirework publish build --to html
381
+ quirework publish copy --for Ada
382
+ quirework publish redpen build --chapter opening
383
+ quirework text wrap manuscript/opening.qmd
384
+ quirework text tells --since main
385
+ quirework provenance search 'an earlier idea'
386
+ quirework sop list
387
+ quirework sop explain review
388
+ quirework sop runs prepare plan.json /path/to/private/run
389
+ quirework sop runs start /path/to/private/run --timeout 60 --wait-quota 0
390
+ quirework sop runs watch /path/to/private/run
391
+ ```
392
+
393
+ Starting from nothing? The
394
+ [authoring guide](https://github.com/adereis/quirework/blob/main/docs/authoring.md)
395
+ is the path from an empty directory to a manuscript with a spec, marked
396
+ chapters, figures and its own procedures, and its last part does the
397
+ same for a site.
398
+ [examples/side-quest](https://github.com/adereis/quirework/tree/main/examples/side-quest)
399
+ is a short complete book that walked it: a comic memoir with a spec and
400
+ its trail, a book in four formats, three derived editions bound to the
401
+ same spec, an extension of its own, the fifteen sessions it was written
402
+ in, and the records of the workshop, writers room, blind read,
403
+ roundtable and consistency review that made parts of it. Its editions
404
+ can be read at
405
+ [quirework.com/examples](https://quirework.com/examples/).
406
+ [examples/demo-site](https://github.com/adereis/quirework/tree/main/examples/demo-site)
407
+ is the site version: posts with a spec each, a shared spec, marks kept
408
+ outside the rendered tree, and a voice policy the checks enforce.
409
+
410
+ Both examples are test fixtures, not showcases. Their authors are
411
+ invented, AI wrote them, and no person edited or reviewed their prose.
412
+ Every session of the book was driven by an AI playing its author, which
413
+ the example's own README says. Read them for the structure Quirework
414
+ keeps, not as examples of the writing it helps an author make.
415
+
416
+ The
417
+ [configuration guide](https://github.com/adereis/quirework/blob/main/docs/configuration.md)
418
+ explains how to connect a project. The
419
+ [workflow guide](https://github.com/adereis/quirework/blob/main/docs/workflows.md)
420
+ covers procedures, research, model runs, and saved evidence. The
421
+ [development guide](https://github.com/adereis/quirework/blob/main/docs/development.md)
422
+ covers architecture and tests.
423
+
424
+ ## A project owns its choices
425
+
426
+ Place `quirework.toml` at the project root. Quirework discovers it from
427
+ the working directory, including subdirectories. Use
428
+ `quirework --project PATH ...` to select a different project explicitly.
429
+ Installing Quirework never selects a project by the package's location.
430
+ `quirework config template book` or `site` prints an annotated file to
431
+ start from. Private corpus paths and account identities go in an ignored
432
+ `quirework.local.toml` beside it. What belongs to you across every
433
+ project, such as where the session store lives and which devices receive
434
+ your copies, goes in `~/.config/quirework/config.toml`.
435
+
436
+ A book's Quarto file remains the source of its publication settings and
437
+ reading order; a site's own generator configuration does the same job
438
+ for the site. Personas, questions, custom procedures, editorial
439
+ policies, and private corpora belong to the project. A project without
440
+ provenance can use the publishing and run tools independently.
441
+
442
+ Quirework is one distribution with one Python namespace. Its domain
443
+ modules are designed for reuse without the CLI or a particular project.
444
+ The software is licensed under the MIT license.