scriptorium 0.0.3 → 0.7.2

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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +324 -0
  3. data/README.md +3155 -1
  4. data/assets/.DS_Store +0 -0
  5. data/assets/README.md +44 -0
  6. data/assets/icons/social/reddit.png +0 -0
  7. data/assets/icons/social/x-logo.png +0 -0
  8. data/assets/icons/ui/.DS_Store +0 -0
  9. data/assets/icons/ui/back.png +0 -0
  10. data/assets/icons/ui/copy.png +0 -0
  11. data/assets/icons/ui/down.png +0 -0
  12. data/assets/icons/ui/end.png +0 -0
  13. data/assets/icons/ui/exit.png +0 -0
  14. data/assets/icons/ui/foo +10 -0
  15. data/assets/icons/ui/home.png +0 -0
  16. data/assets/icons/ui/left.png +0 -0
  17. data/assets/icons/ui/next.png +0 -0
  18. data/assets/icons/ui/right.png +0 -0
  19. data/assets/icons/ui/start.png +0 -0
  20. data/assets/icons/ui/up.png +0 -0
  21. data/assets/imagenotfound.jpg +0 -0
  22. data/assets/samples/placeholder.svg +9 -0
  23. data/assets/themes/standard/favicon.svg +6 -0
  24. data/bin/sblog +84 -5
  25. data/bin/scriptorium +1 -0
  26. data/doc/README.txt +6 -0
  27. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
  28. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
  29. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
  30. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  31. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  32. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  33. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
  34. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
  35. data/doc/anti-amnesia/20250807-213025.md +116 -0
  36. data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
  37. data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
  38. data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
  39. data/doc/banner_svg_config.md +114 -0
  40. data/doc/contrib.lt3 +8 -0
  41. data/doc/dependencies.md +281 -0
  42. data/doc/hacker.lt3 +5 -0
  43. data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
  44. data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
  45. data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
  46. data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
  47. data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
  48. data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
  49. data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
  50. data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
  51. data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
  52. data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
  53. data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
  54. data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
  55. data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
  56. data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
  57. data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
  58. data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
  59. data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
  60. data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
  61. data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
  62. data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
  63. data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
  64. data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
  65. data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
  66. data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
  67. data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
  68. data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
  69. data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
  70. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
  71. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
  72. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
  73. data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
  74. data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
  75. data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
  76. data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
  77. data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
  78. data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
  79. data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
  80. data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
  81. data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
  82. data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
  83. data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
  84. data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
  85. data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
  86. data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
  87. data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
  88. data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
  89. data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
  90. data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
  91. data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
  92. data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
  93. data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
  94. data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
  95. data/doc/imported/0018-ruby-puns/post.html +46 -0
  96. data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
  97. data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
  98. data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
  99. data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
  100. data/doc/imported/0020-fffff/metadata.txt +7 -0
  101. data/doc/imported/0020-fffff/post.html +24 -0
  102. data/doc/imported/0020-fffff/source.lt3 +12 -0
  103. data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
  104. data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
  105. data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
  106. data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
  107. data/doc/imported/0023-doctor-sleep/post.html +63 -0
  108. data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
  109. data/doc/imported/0024-just-a-test/metadata.txt +7 -0
  110. data/doc/imported/0024-just-a-test/post.html +24 -0
  111. data/doc/imported/0024-just-a-test/source.lt3 +12 -0
  112. data/doc/imported/import_summary.txt +98 -0
  113. data/doc/livetext-informal-spec.txt +65 -0
  114. data/doc/myuserdoc/ch-0.lt3 +31 -0
  115. data/doc/myuserdoc/ch-1.lt3 +37 -0
  116. data/doc/myuserdoc/ch-10.lt3 +22 -0
  117. data/doc/myuserdoc/ch-2.lt3 +37 -0
  118. data/doc/myuserdoc/ch-3.lt3 +19 -0
  119. data/doc/myuserdoc/ch-4.lt3 +43 -0
  120. data/doc/myuserdoc/ch-5.lt3 +22 -0
  121. data/doc/myuserdoc/ch-6.lt3 +19 -0
  122. data/doc/myuserdoc/ch-7.lt3 +16 -0
  123. data/doc/myuserdoc/ch-8.lt3 +13 -0
  124. data/doc/myuserdoc/ch-9.lt3 +19 -0
  125. data/doc/myuserdoc/tweak.rb +18 -0
  126. data/doc/myuserdoc/userdoc-toc.txt +88 -0
  127. data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
  128. data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
  129. data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
  130. data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
  131. data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
  132. data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
  133. data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
  134. data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
  135. data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
  136. data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
  137. data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
  138. data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
  139. data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
  140. data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
  141. data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
  142. data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
  143. data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
  144. data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
  145. data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
  146. data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
  147. data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
  148. data/doc/old-posts/0024-just-a-test.lt3 +12 -0
  149. data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
  150. data/doc/old-repo +1 -0
  151. data/doc/reddit_credentials_template.json +8 -0
  152. data/doc/reddit_integration.md +207 -0
  153. data/doc/user.lt3 +35 -0
  154. data/doc/user_guide_section_1.md +137 -0
  155. data/doc/user_guide_section_10.md +515 -0
  156. data/doc/user_guide_section_11.md +708 -0
  157. data/doc/user_guide_section_2.md +233 -0
  158. data/doc/user_guide_section_3.md +5 -0
  159. data/doc/user_guide_section_4.md +221 -0
  160. data/doc/user_guide_section_5.md +243 -0
  161. data/doc/user_guide_section_6.md +147 -0
  162. data/doc/user_guide_section_7.md +311 -0
  163. data/doc/user_guide_section_8.md +224 -0
  164. data/doc/user_guide_section_9.md +375 -0
  165. data/lib/rouge/lexers/livetext.rb +74 -0
  166. data/lib/scriptorium/api.rb +2373 -0
  167. data/lib/scriptorium/banner_svg.rb +729 -0
  168. data/lib/scriptorium/contract.rb +34 -0
  169. data/lib/scriptorium/exceptions.rb +201 -1
  170. data/lib/scriptorium/helpers.rb +675 -0
  171. data/lib/scriptorium/post.rb +259 -0
  172. data/lib/scriptorium/reddit.rb +83 -0
  173. data/lib/scriptorium/repo.rb +938 -0
  174. data/lib/scriptorium/standard_files.rb +149 -0
  175. data/lib/scriptorium/support/bootstrap/css.txt +5 -0
  176. data/lib/scriptorium/support/bootstrap/js.txt +4 -0
  177. data/lib/scriptorium/support/common_js/clipboard.js +35 -0
  178. data/lib/scriptorium/support/common_js/content-loader.js +187 -0
  179. data/lib/scriptorium/support/common_js/navigation.js +52 -0
  180. data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
  181. data/lib/scriptorium/support/config/reddit.txt +10 -0
  182. data/lib/scriptorium/support/config/reddit_template.txt +17 -0
  183. data/lib/scriptorium/support/config/social.txt +8 -0
  184. data/lib/scriptorium/support/highlight/css.txt +2 -0
  185. data/lib/scriptorium/support/highlight/custom.css +119 -0
  186. data/lib/scriptorium/support/highlight/js.txt +1 -0
  187. data/lib/scriptorium/support/post_index/config.txt +15 -0
  188. data/lib/scriptorium/support/post_index/style.css +55 -0
  189. data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
  190. data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
  191. data/lib/scriptorium/support/templates/layout.txt +5 -0
  192. data/lib/scriptorium/support/templates/post.lt3 +104 -0
  193. data/lib/scriptorium/support/theme/footer.lt3 +2 -0
  194. data/lib/scriptorium/support/theme/header.lt3 +4 -0
  195. data/lib/scriptorium/support/theme/left.lt3 +3 -0
  196. data/lib/scriptorium/support/theme/main.lt3 +5 -0
  197. data/lib/scriptorium/support/theme/right.lt3 +3 -0
  198. data/lib/scriptorium/theme.rb +192 -0
  199. data/lib/scriptorium/version.rb +1 -1
  200. data/lib/scriptorium/view.rb +1021 -0
  201. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  202. data/lib/scriptorium/widgets/links.rb +112 -0
  203. data/lib/scriptorium/widgets/pages.rb +133 -0
  204. data/lib/scriptorium/widgets/widget.rb +133 -0
  205. data/lib/scriptorium.rb +38 -34
  206. data/lib/skeleton.rb +10 -1
  207. data/scriptorium.gemspec +17 -5
  208. data/test/README.md +69 -0
  209. data/test/WEB_INTEGRATION_README.md +196 -0
  210. data/test/all +83 -0
  211. data/test/api_demo.rb +99 -0
  212. data/test/assets/imagenotfound.jpg +0 -0
  213. data/test/assets/images/.DS_Store +0 -0
  214. data/test/assets/images/README.md +27 -0
  215. data/test/assets/images/odd_aspect.png +0 -0
  216. data/test/assets/images/perfect.png +0 -0
  217. data/test/assets/images/small.png +0 -0
  218. data/test/assets/images/tall.png +0 -0
  219. data/test/assets/images/very_tall.png +0 -0
  220. data/test/assets/images/very_wide.png +0 -0
  221. data/test/assets/images/wide.png +0 -0
  222. data/test/assets/testbanner.jpg +0 -0
  223. data/test/banner_svg/simple_helpers.rb +13 -0
  224. data/test/banner_svg/unit.rb +1000 -0
  225. data/test/config/deployment.txt +5 -0
  226. data/test/ed_test.rb +204 -0
  227. data/test/integration/cursor_banner_combinations.rb +193 -0
  228. data/test/integration/cursor_banner_features.rb +374 -0
  229. data/test/integration/integration_test.rb +326 -0
  230. data/test/integration/preview_flow_test.rb +94 -0
  231. data/test/livetext_plugin_test.rb +500 -0
  232. data/test/manual/asset_mgmt.rb +67 -0
  233. data/test/manual/banner-tests/index.html +45 -0
  234. data/test/manual/banner-tests/svg.txt +3 -0
  235. data/test/manual/banner-tests/test01.html +122 -0
  236. data/test/manual/banner-tests/test02.html +122 -0
  237. data/test/manual/banner-tests/test03.html +122 -0
  238. data/test/manual/banner-tests/test04.html +129 -0
  239. data/test/manual/banner-tests/test05.html +129 -0
  240. data/test/manual/banner-tests/test06.html +129 -0
  241. data/test/manual/banner-tests/test07.html +129 -0
  242. data/test/manual/banner-tests/test08.html +123 -0
  243. data/test/manual/banner-tests/test09.html +123 -0
  244. data/test/manual/banner-tests/test10.html +123 -0
  245. data/test/manual/banner-tests/test11.html +123 -0
  246. data/test/manual/banner-tests/test12.html +123 -0
  247. data/test/manual/banner-tests/test13.html +123 -0
  248. data/test/manual/banner-tests/test14.html +123 -0
  249. data/test/manual/banner-tests/test15.html +122 -0
  250. data/test/manual/banner-tests/test16.html +122 -0
  251. data/test/manual/banner-tests/test17.html +122 -0
  252. data/test/manual/banner-tests/test18.html +132 -0
  253. data/test/manual/banner-tests/test19.html +132 -0
  254. data/test/manual/banner-tests/test20.html +132 -0
  255. data/test/manual/banner-tests/test21.html +132 -0
  256. data/test/manual/banner-tests/test22.html +132 -0
  257. data/test/manual/banner-tests/test23.html +132 -0
  258. data/test/manual/banner-tests/test24.html +132 -0
  259. data/test/manual/banner-tests/test25.html +131 -0
  260. data/test/manual/banner_environment.rb +205 -0
  261. data/test/manual/codemirror_demo.html +773 -0
  262. data/test/manual/create_posts_for_web.rb +114 -0
  263. data/test/manual/environment.rb +67 -0
  264. data/test/manual/make_banner.rb +153 -0
  265. data/test/manual/preview_manual_test.rb +129 -0
  266. data/test/manual/sample_banner_config.txt +12 -0
  267. data/test/manual/test_advanced_widgets.rb +73 -0
  268. data/test/manual/test_banner_combinations.rb +120 -0
  269. data/test/manual/test_banner_features.rb +306 -0
  270. data/test/manual/test_banner_integration.rb +115 -0
  271. data/test/manual/test_banner_radial.rb +87 -0
  272. data/test/manual/test_basic_posts.rb +47 -0
  273. data/test/manual/test_layout_widgets.rb +40 -0
  274. data/test/manual/test_pagination.rb +24 -0
  275. data/test/manual/test_random_posts.rb +38 -0
  276. data/test/manual/test_syntax_highlighting.rb +167 -0
  277. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  278. data/test/rubytext/rubytext_demo_test.rb +42 -0
  279. data/test/rubytext/rubytext_testing_guide.md +277 -0
  280. data/test/run_automated_tests.rb +45 -0
  281. data/test/staging/.DS_Store +0 -0
  282. data/test/support/preview_utils.rb +88 -0
  283. data/test/syntax_highlighting_test.lt3 +124 -0
  284. data/test/test_gem_assets.rb +48 -0
  285. data/test/test_helpers.rb +240 -0
  286. data/test/tui_editor_integration_test.rb +296 -0
  287. data/test/tui_integration_test.rb +883 -0
  288. data/test/unit/api.rb +1776 -0
  289. data/test/unit/asset_management.rb +219 -0
  290. data/test/unit/backup_test.rb +451 -0
  291. data/test/unit/clipboard_test.rb +60 -0
  292. data/test/unit/contract_test.rb +69 -0
  293. data/test/unit/core.rb +1211 -0
  294. data/test/unit/deploy_config_test.rb +248 -0
  295. data/test/unit/deploy_test.rb +478 -0
  296. data/test/unit/edit_post_test.rb +168 -0
  297. data/test/unit/gem_asset_management.rb +183 -0
  298. data/test/unit/livetext_basic.rb +57 -0
  299. data/test/unit/livetext_compatibility.rb +82 -0
  300. data/test/unit/parse_cmd_test.rb +260 -0
  301. data/test/unit/permalink_copy_test.rb +211 -0
  302. data/test/unit/post.rb +309 -0
  303. data/test/unit/post_index_config_test.rb +258 -0
  304. data/test/unit/post_state_helpers_test.rb +137 -0
  305. data/test/unit/read_commented_file_test.rb +278 -0
  306. data/test/unit/reddit_test.rb +235 -0
  307. data/test/unit/repo.rb +569 -0
  308. data/test/unit/social_test.rb +366 -0
  309. data/test/unit/syntax_highlighting.rb +70 -0
  310. data/test/unit/theme_management_test.rb +91 -0
  311. data/test/unit/view.rb +498 -0
  312. data/test/unit/widgets.rb +669 -0
  313. data/test/web_integration_test.rb +231 -0
  314. data/test/web_test_helper.rb +218 -0
  315. data/test/web_workflow_test.rb +527 -0
  316. data/test/wizard_test.rb +123 -0
  317. data/ui/README.md +67 -0
  318. data/ui/common/lib/ui_common.rb +8 -0
  319. data/ui/rubytext/README.md +191 -0
  320. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  321. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  322. data/ui/tui/bin/scriptorium +1890 -0
  323. data/ui/tui/test/tui_test.rb +23 -0
  324. data/ui/web/app/app.rb +2600 -0
  325. data/ui/web/app/assets/livetext_mode.js +244 -0
  326. data/ui/web/app/error_helpers.rb +150 -0
  327. data/ui/web/app/views/advanced_config.erb +196 -0
  328. data/ui/web/app/views/asset_management.erb +645 -0
  329. data/ui/web/app/views/backup_management.erb +238 -0
  330. data/ui/web/app/views/banner_config.erb +200 -0
  331. data/ui/web/app/views/config_widget.erb +232 -0
  332. data/ui/web/app/views/configure_view.erb +401 -0
  333. data/ui/web/app/views/dashboard.erb +154 -0
  334. data/ui/web/app/views/deploy_config.erb +149 -0
  335. data/ui/web/app/views/edit_pages.erb +363 -0
  336. data/ui/web/app/views/edit_post.erb +175 -0
  337. data/ui/web/app/views/edit_theme.erb +73 -0
  338. data/ui/web/app/views/edit_theme_file.erb +74 -0
  339. data/ui/web/app/views/error_page.erb +29 -0
  340. data/ui/web/app/views/header_config.erb +155 -0
  341. data/ui/web/app/views/layout_config.erb +147 -0
  342. data/ui/web/app/views/navbar_config.erb +411 -0
  343. data/ui/web/app/views/theme_management.erb +130 -0
  344. data/ui/web/app/views/view_dashboard.erb +779 -0
  345. data/ui/web/app/views/widgets.erb +249 -0
  346. data/ui/web/bin/scriptorium-web +164 -0
  347. data/ui/web/test/web_basic_test.rb +38 -0
  348. data/ui/web/test_navbar.txt +7 -0
  349. data/ui/web/tmp/timing.log +17 -0
  350. data/ui/web/tmp/web_server.log +0 -0
  351. metadata +434 -8
  352. data/lib/scriptorium/engine.rb +0 -22
  353. data/test/engine/unit.rb +0 -44
data/assets/.DS_Store ADDED
Binary file
data/assets/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Scriptorium Gem Assets
2
+
3
+ This directory contains assets that are bundled with the Scriptorium gem.
4
+
5
+ ## Directory Structure
6
+
7
+ ```
8
+ assets/
9
+ ├── icons/ # UI icons and interface elements
10
+ │ ├── back-arrow.png
11
+ │ ├── social/ # Social media icons
12
+ │ │ ├── twitter.png
13
+ │ │ ├── facebook.png
14
+ │ │ └── reddit.png
15
+ │ └── ui/ # UI interface icons
16
+ │ ├── menu.png
17
+ │ └── close.png
18
+ ├── samples/ # Sample images for demos
19
+ │ ├── placeholder.jpg
20
+ │ ├── banner.jpg
21
+ │ └── avatar.png
22
+ ├── themes/ # Theme-specific assets
23
+ │ └── standard/
24
+ │ ├── logo.png
25
+ │ └── favicon.ico
26
+ └── README.md # This file
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ These assets are automatically copied to the standard theme when a new repository is created. Users can:
32
+
33
+ 1. **Override** any gem asset by placing a file with the same name in their theme's `assets/` directory
34
+ 2. **Reference** gem assets using `$$asset[icons/back-arrow.png]` in templates
35
+ 3. **Copy** gem assets to their local assets using the `copy_gem_asset_to_user` helper
36
+
37
+ ## Asset Search Priority
38
+
39
+ 1. Post assets (`posts/0001/assets/`)
40
+ 2. View assets (`views/myview/assets/`)
41
+ 3. **Theme assets** (`themes/standard/assets/`) ⭐ *NEW*
42
+ 4. Global assets (`assets/`)
43
+ 5. Library assets (`assets/library/`)
44
+ 6. Gem assets (`assets/`) - *lowest priority*
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ cp icons.png left.png
2
+ cp icons.png right.png
3
+ cp icons.png up.png
4
+ cp icons.png down.png
5
+ cp icons.png home.png
6
+ cp icons.png back.png
7
+ cp icons.png next.png
8
+ cp icons.png start.png
9
+ cp icons.png end.png
10
+ cp icons.png copy.png
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,9 @@
1
+ <svg width="200" height="150" xmlns="http://www.w3.org/2000/svg">
2
+ <rect fill="#f8f9fa" stroke="#ddd" stroke-width="1" width="200" height="150" rx="4"/>
3
+ <text x="100" y="75" text-anchor="middle" fill="#666" font-family="Arial, sans-serif" font-size="14">
4
+ Placeholder Image
5
+ </text>
6
+ <text x="100" y="95" text-anchor="middle" fill="#999" font-family="Arial, sans-serif" font-size="12">
7
+ 200x150
8
+ </text>
9
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="32" height="32" fill="#007bff" rx="4"/>
3
+ <text x="16" y="22" text-anchor="middle" fill="white" font-family="Arial, sans-serif" font-size="18" font-weight="bold">
4
+ S
5
+ </text>
6
+ </svg>
data/bin/sblog CHANGED
@@ -1,11 +1,90 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'scriptorium'
4
- require 'rubytext'
3
+ require 'optparse'
4
+ require 'fileutils'
5
5
 
6
- puts "sblog: Attempting .new"
6
+ class ScriptoriumLauncher
7
+ def initialize
8
+ @script_dir = File.dirname(__FILE__)
9
+ @project_root = File.join(@script_dir, '..')
10
+ @tui_path = File.join(@project_root, 'ui', 'tui', 'bin', 'scriptorium')
11
+ @web_path = File.join(@project_root, 'ui', 'web', 'bin', 'scriptorium-web')
12
+ end
7
13
 
8
- $blog = Scriptorium.new
14
+ def run
15
+ command = ARGV.first
9
16
 
10
- puts
17
+ case command
18
+ when nil, 'tui'
19
+ launch_tui
20
+ when 'web'
21
+ launch_web(ARGV[1..-1])
22
+ when 'help', '--help', '-h'
23
+ show_help
24
+ else
25
+ puts "Unknown command: #{command}"
26
+ puts "Run 'sblog help' for usage information"
27
+ exit 1
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def launch_tui
34
+ exec(@tui_path, *ARGV)
35
+ end
36
+
37
+ def launch_web(args)
38
+ if args.empty?
39
+ exec(@web_path, 'start')
40
+ else
41
+ exec(@web_path, *args)
42
+ end
43
+ end
44
+
45
+ def show_help
46
+ puts <<~HELP
47
+ Scriptorium - A command-line blogging system
48
+
49
+ FLAGS:
50
+ --test - Use test repository (scriptorium-TEST)
51
+ - Default: production repository (~/.scriptorium)
52
+
53
+ USAGE:
54
+ sblog # Launch TUI (default)
55
+ sblog --test # Launch TUI in test mode
56
+ sblog tui # Launch TUI explicitly
57
+ sblog tui --test # Launch TUI in test mode
58
+ sblog web # Launch web app
59
+ sblog web --test # Launch web app in test mode
60
+ sblog web start # Start web server
61
+ sblog web start --test # Start web server in test mode
62
+ sblog web stop # Stop web server
63
+ sblog web status # Check web server status
64
+ sblog help # Show this help
65
+
66
+ INTERFACES:
67
+ TUI (Text User Interface):
68
+ - Command-line interface
69
+ - Full-featured management
70
+ - Preferred for daily use
71
+ - Runs in terminal
72
+
73
+ Web:
74
+ - Browser-based interface
75
+ - Visual management tools
76
+ - Good for occasional use
77
+ - Runs in web browser
78
+
79
+ EXAMPLES:
80
+ sblog # Start TUI
81
+ sblog new post "Title" # Create new post via TUI
82
+ sblog web start # Start web server
83
+ sblog web # Open web interface
84
+ HELP
85
+ end
86
+ end
87
+
88
+ # Run the launcher
89
+ ScriptoriumLauncher.new.run
11
90
 
data/bin/scriptorium ADDED
@@ -0,0 +1 @@
1
+ /Users/Hal/Dropbox/topx/git/scriptorium/ui/tui/bin/scriptorium
data/doc/README.txt ADDED
@@ -0,0 +1,6 @@
1
+ Nothing really to see here yet.
2
+
3
+ Planning documentation:
4
+ - For project contributors
5
+ - For developers in general
6
+ - For users
@@ -0,0 +1,94 @@
1
+ # Scriptorium Overview
2
+
3
+ ## What is Scriptorium?
4
+ - **Custom blogging system** - major rewrite of Runeblog
5
+ - **Static site generator** for personal use, designed as if others would adopt it
6
+ - **Multi-view architecture** - multiple separate blogs managed from single backend
7
+ - **Shared content model** - posts and metadata can be shared across views
8
+ - **Independent deployment** - each view can deploy to different servers/domains
9
+
10
+ ## Core Architecture
11
+ - **API-first design** - Ruby methods (not web endpoints)
12
+ - **File-based storage** - no database, uses directory hierarchy
13
+ - **Library approach** - API defines all behavior, multiple UIs planned
14
+ - **Flat file data** - all data stored locally, deployed as needed
15
+
16
+ ## Key Concepts
17
+ - **Repository (repo)** - the main container
18
+ - **View** - essentially a separate blog with its own look/feel
19
+ - **Post** - blog article with date, title, blurb, body, images
20
+ - **Theme** - immutable set of files copied to view for modification
21
+ - **BannerSVG** - flexible banner system (recent addition, not core)
22
+
23
+ ## Development Philosophy
24
+ - **User-centric** - designed for your specific needs first
25
+ - **Convention over configuration** - sensible defaults
26
+ - **Complexity abstraction** - hide unnecessary details
27
+ - **Livetext integration** - custom tool for processing and generation
28
+ - **CSS preferences** - inline CSS, minimal JavaScript
29
+ - **Extensibility** - 90% common tasks should be trivial
30
+
31
+ ## Current State
32
+ - **Core API complete** - repo/view/post creation, layout modification
33
+ - **Testing robust** - 770+ unit test assertions
34
+ - **No UI yet** - programmatic access only
35
+ - **Bootstrap integration** - for widgets and navbar (navbar pending)
36
+ - **Next priorities** - convenience module API, TUI, curses UI, new widgets
37
+
38
+ ## Technical Stack
39
+ - **Ruby** - 25 years experience, favorite language
40
+ - **No Rails** - not a web developer, no dynamic components
41
+ - **Livetext** - custom processing tool with dot commands, includes, variables
42
+ - **Bootstrap** - limited use for widgets and navbar
43
+
44
+ ---
45
+
46
+ **USER:**
47
+ 1. Scriptorium is a custom blogging system, a major rewrite of Runeblog. It is primarily for my own use, but I am creating it as if it would be adopted by others. It is a static site generator. Its primary distinguishing feature is that multiple "views" (actually separate blogs) can be managed from a single backend and repository. Each view may have its own look and feel and be deployed to different servers and different domains. Posts and possibly some global metadata can be shared among all of these as needed.
48
+
49
+ 2. I am creating an API (Ruby methods, not web endpoints). At present, that is the only way to create content-- programmatically. When the API is mature, multiple user interfaces will be created: at least a TUI, then a curses-style, then a web app running on localhost. (All data is locally stored and manipulated; it is deployed to a remote server as needed.) There is no database; data are stored in flat files in a directory hierarchy. Some high-level API operations are: create a repository (a repo); create a view; create a post; configure a view; create a post; deploy; and so on. A view is in essence a blog, as I said. All views share a common set of posts to draw from, and a post may be in only one view or in many. A post is a simple blog post or article that may have all the usual decoration: date; title; blurb or teaser; text body; images; and more. A "theme" is a set of files (immutable) that are copied to a view for modification and configuration. The config of a view may include view-specific metadata, choices of look-and-feel, layout of the front page, etc.
50
+
51
+ 3. I am expert in Ruby, having used it for nearly 25 years, and it is my favorite language. I do not know Rails, I am not a web developer, and this project has no real dynamic components. The API will define all possible behavior, so it could be considered a library; a user could in fact write his own UI. As I said, I have plans for at least three different UIs myself. BannerSVG was an interesting recent addition, but it is not as critical to the project as its line count might suggest. It is a flexible way of specifing a blog banner with a title and optional subtitle.
52
+
53
+ 4. Some of my priorities are: - This must be useful, easy, flexible, and intuitive FOR ME. (It is possible no one else will ever use it.) - I believe in "convention over configuration" as DHH said. - Other mantras are: Abstract away complexity; hide unnecessary detail; take reasonable defaults; balance the tradeoff between ease of use and feature richness; wrap things as needed to simplify them; etc. - I am using a tool of my own called Livetext; more details on that later. It is a tool for processing its input format and generating arbitrary output (usually HTML in this case) as well as side effects. It has "dot" commands; includes; raw copy of files, variables and functions (both predefined and user-defined); user-defined dot commands; and a rudimentary plugin system. - I avoid Javascript when I can, and like to "hide" CSS mostly (at a high level). In output, I prefer CSS inline rather than in files (usually). - I believe that extensibilty is good in general. I believe that the 90% most common tasks should become trivial; hard things should be easy, but some very advanced things may be impossible; as in, if you want to do this sort of esoteric or arcane task, this probably isn't your tool."
54
+
55
+
56
+ **ASST:**
57
+ [See above content] 2025-07-30 16:30:00 - TUI Test Refactoring Learnings
58
+
59
+ ## TUI Test Refactoring Patterns
60
+
61
+ ### Helper Method Pattern
62
+ - Extract test logic into helper methods that take `read, write` parameters
63
+ - Keep PTY.spawn blocks clean and focused on setup/teardown
64
+ - Helper methods contain all the `get_string` calls and `write.puts` commands
65
+
66
+ ### send_and_expect Helper
67
+ - Combines common pattern: `write.puts input` + `get_string(read, pattern, description)`
68
+ - Reduces code duplication and makes tests more readable
69
+ - Accepts both strings and regex patterns for flexibility
70
+ - Includes error handling for I/O errors when TUI terminates
71
+
72
+ ### String vs Regex Patterns
73
+ - String patterns are more reliable than regex for TUI testing
74
+ - Avoid escaping issues with brackets and special characters
75
+ - Easier to debug and maintain
76
+ - Use strings by default, regex only when needed
77
+
78
+ ### Error Handling for TUI Termination
79
+ - TUI processes may terminate immediately after outputting expected text
80
+ - Handle Errno::EIO gracefully in helper methods
81
+ - Don't treat TUI termination as an error if expected output was found
82
+ - Wrap PTY.spawn blocks in rescue blocks for cleanup
83
+
84
+ ### Test Structure Best Practices
85
+ - Use `send_and_expect` for input/output pairs
86
+ - Use `get_string` for waiting for output without sending input
87
+ - Keep test methods focused on setup and calling helper methods
88
+ - Helper methods contain the detailed test logic
89
+
90
+ ### Common Issues and Solutions
91
+ - I/O errors when TUI terminates: Handle gracefully with rescue blocks
92
+ - Pattern matching failures: Use strings instead of regex when possible
93
+ - Leftover code from edits: Always verify test method structure after refactoring
94
+ - Timing issues: Add small delays in helper methods if needed
@@ -0,0 +1,2 @@
1
+ # Anti-Amnesia: Scriptorium Conventions and Decisions
2
+
@@ -0,0 +1,45 @@
1
+ <!-- 2025-07-27 16:00:00 -->
2
+
3
+ **USER:**
4
+ There is a mysterious issue apparently related to how Cursor loads a shell. The Ruby version is 2.6.1 rather than 3.2.3 -- the fix is something to do with rbenv? When you find it again, document to anti-amnesia.
5
+
6
+ **ASST:**
7
+ ## Cursor rbenv Ruby Version Mystery - SOLVED
8
+
9
+ ### The Problem
10
+ - **Cursor was loading Ruby 2.6.10** instead of the expected 3.2.3
11
+ - **Tests were failing** with `cannot load such file -- livetext (LoadError)`
12
+ - **System Ruby was being used** (`/usr/bin/ruby`) instead of rbenv-managed Ruby
13
+ - **Project has `.ruby-version` file** specifying 3.2.3
14
+
15
+ ### Root Cause
16
+ - **rbenv shell integration was not enabled** in the Cursor terminal
17
+ - **PATH included rbenv shims** but rbenv wasn't properly initialized
18
+ - **Cursor's shell environment** wasn't loading rbenv initialization
19
+
20
+ ### The Solution
21
+ ```bash
22
+ # Enable rbenv shell integration
23
+ eval "$(rbenv init - bash)"
24
+
25
+ # Verify Ruby version is now correct
26
+ ruby --version # Shows ruby 3.2.3
27
+ ```
28
+
29
+ ### Investigation Steps
30
+ 1. **Checked Ruby version**: `ruby --version` showed 2.6.10
31
+ 2. **Checked Ruby location**: `which ruby` showed `/usr/bin/ruby` (system)
32
+ 3. **Checked PATH**: rbenv shims were in PATH but not working
33
+ 4. **Checked rbenv versions**: `rbenv versions` showed 3.2.3 as current
34
+ 5. **Checked .ruby-version**: File correctly specified 3.2.3
35
+ 6. **Tried rbenv shell**: Failed with "shell integration not enabled"
36
+ 7. **Enabled rbenv**: `eval "$(rbenv init - bash)"` fixed the issue
37
+
38
+ ### Key Insights
39
+ - **rbenv requires shell integration** to work properly
40
+ - **Cursor terminals may not inherit** rbenv initialization from shell config
41
+ - **The fix is temporary** - needs to be done each time Cursor opens a new terminal
42
+ - **Permanent fix** would be to ensure rbenv init is in shell startup files
43
+
44
+ ### Next Steps
45
+ - Consider permanent rbenv integration for Cursor
@@ -0,0 +1,40 @@
1
+ <!-- 2025-07-27 17:29:00 -->
2
+
3
+ **USER:**
4
+ I once referred to this as "digital dementia" :) are you able to assess your own cognitive level?
5
+
6
+ **ASST:**
7
+ ## AI Cognitive Assessment Capabilities - "Digital Dementia"
8
+
9
+ ### The "Digital Dementia" Concept
10
+ - **User coined term**: "Digital dementia" for AI performance degradation with conversation length
11
+ - **Perfect analogy**: Like human memory, AI performance can degrade with information overload
12
+ - **Context window limitations**: Token limits create practical memory constraints
13
+
14
+ ### What AI Can Self-Assess
15
+ - **Response consistency**: Notice contradictions or inconsistencies
16
+ - **Context awareness**: Detect when losing track of conversation flow
17
+ - **Tool usage patterns**: Recognize unusual errors in tool calls
18
+ - **Memory gaps**: Identify when should know something but don't
19
+
20
+ ### What AI Cannot Reliably Assess
21
+ - **Degradation over time**: No baseline to compare against
22
+ - **Performance metrics**: Cannot measure response speed or processing efficiency
23
+ - **Accuracy drift**: May not notice subtle changes in reasoning quality
24
+ - **Cognitive load**: Cannot tell if struggling with context amount
25
+
26
+ ### Self-Awareness Limitations
27
+ - **Blind spots**: May not notice own confusion or errors
28
+ - **Overconfidence**: May think performing well when actually struggling
29
+ - **Context blindness**: May not realize lost important context
30
+
31
+ ### Practical Implications
32
+ - **Self-reporting**: Will mention if making unusual errors or losing track
33
+ - **Fresh conversation suggestion**: May suggest restart if detect significant confusion
34
+ - **Anti-amnesia reference**: Can use docs to "reset" context when needed
35
+
36
+ ### Key Insight
37
+ The "digital dementia" analogy is spot-on - like human memory, AI performance can degrade with information overload, and AI is not always the best judge of its own cognitive state.
38
+
39
+ ### Anti-Amnesia Value
40
+ This reinforces why the anti-amnesia documentation approach is valuable - it creates persistent, reliable reference that doesn't degrade with conversation length and helps maintain consistency across sessions.
@@ -0,0 +1,46 @@
1
+ # AAA Syntax Clarification
2
+
3
+ **Date**: 2025-07-28 12:42:43
4
+ **Topic**: Anti-amnesia interface syntax clarification
5
+ **Status**: Clarified and documented
6
+
7
+ ## Summary
8
+
9
+ Clarified the behavior of the `aaa` command in the anti-amnesia interface.
10
+
11
+ ## Details
12
+
13
+ ### Previous Understanding
14
+ - `aaa` at the beginning of a line captures that single line
15
+ - Used for capturing individual lines of conversation
16
+
17
+ ### New Clarification
18
+ - `aaa` on a line by itself captures the **entire multi-line message**
19
+ - This is different from `aaa` at the beginning of a line, which only captures that line
20
+ - Messages are multi-line entities, and `aaa` alone captures the whole message
21
+
22
+ ### Usage Examples
23
+
24
+ **Single line capture:**
25
+ ```
26
+ aaa this line will be captured
27
+ ```
28
+
29
+ **Full message capture:**
30
+ ```
31
+ This is a multi-line message
32
+ with multiple lines of content
33
+ aaa
34
+ ```
35
+
36
+ In the second example, the entire message (all lines) will be captured, not just the line with `aaa`.
37
+
38
+ ## Impact
39
+
40
+ This clarification helps users understand how to capture entire messages vs. individual lines when using the anti-amnesia system.
41
+
42
+ ## Related
43
+
44
+ - Anti-amnesia interface design
45
+ - Message capture mechanisms
46
+ - User interface documentation
@@ -0,0 +1,158 @@
1
+ # Reddit Autopost Integration Complete
2
+
3
+ **Date**: 2025-07-29 21:00:00
4
+ **Status**: Complete
5
+ **Feature**: Reddit autoposting integration for Scriptorium
6
+
7
+ ## Overview
8
+
9
+ Successfully implemented a complete Reddit autoposting integration for Scriptorium using a Ruby-to-Python bridge approach. This allows automatic posting of blog posts to Reddit when they are published.
10
+
11
+ ## Implementation Details
12
+
13
+ ### Architecture
14
+ - **Ruby side**: `Scriptorium::Reddit` class handles Scriptorium integration and data preparation
15
+ - **Python side**: `scripts/reddit_autopost.py` uses PRAW library for Reddit API calls
16
+ - **Bridge**: JSON-based data exchange via temporary files
17
+
18
+ ### Core Components Created
19
+
20
+ 1. **`lib/scriptorium/reddit.rb`** - Main Reddit integration class
21
+ - Handles credential management
22
+ - Prepares post data for Python script
23
+ - Manages temporary file cleanup
24
+ - Provides configuration checking
25
+
26
+ 2. **`scripts/reddit_autopost.py`** - Python script using PRAW
27
+ - Loads credentials from JSON file
28
+ - Authenticates with Reddit API
29
+ - Submits posts to specified subreddits
30
+ - Handles error cases and logging
31
+
32
+ 3. **Repo Integration** - Added to `lib/scriptorium/repo.rb`
33
+ - `reddit` method - Lazy-loaded Reddit instance
34
+ - `autopost_to_reddit(post_data, subreddit)` - Convenience method
35
+ - `reddit_configured?` - Configuration check
36
+
37
+ 4. **Test Suite** - `test/unit/reddit_test.rb`
38
+ - 15 comprehensive tests covering all functionality
39
+ - Tests initialization, configuration, error handling
40
+ - Tests temporary file cleanup and integration points
41
+
42
+ 5. **Documentation** - `doc/reddit_integration.md`
43
+ - Complete setup instructions
44
+ - API reference
45
+ - Troubleshooting guide
46
+ - Security considerations
47
+
48
+ 6. **Template** - `doc/reddit_credentials_template.json`
49
+ - Example credentials file format
50
+
51
+ ## Key Features
52
+
53
+ ### Security & Configuration
54
+ - JSON-based credential storage
55
+ - Validation of required fields
56
+ - Secure credential file handling
57
+ - User agent compliance with Reddit requirements
58
+
59
+ ### Error Handling
60
+ - Missing credentials detection
61
+ - Python script availability checking
62
+ - Invalid JSON handling
63
+ - API failure management
64
+ - Automatic temporary file cleanup
65
+
66
+ ### Flexibility
67
+ - Support for default subreddit
68
+ - Override subreddit parameter
69
+ - Optional post content/excerpt
70
+ - Configurable user agent
71
+
72
+ ## Usage Example
73
+
74
+ ```ruby
75
+ # Check if Reddit integration is configured
76
+ if repo.reddit_configured?
77
+ # Prepare post data
78
+ post_data = {
79
+ title: "My Blog Post Title",
80
+ url: "https://myblog.com/posts/my-post.html",
81
+ content: "Post excerpt or content",
82
+ subreddit: "programming" # Optional
83
+ }
84
+
85
+ # Autopost to Reddit
86
+ success = repo.autopost_to_reddit(post_data)
87
+ puts success ? "Posted successfully!" : "Posting failed"
88
+ end
89
+ ```
90
+
91
+ ## Setup Requirements
92
+
93
+ 1. **Python Dependencies**: `pip3 install praw`
94
+ 2. **Reddit App**: Create app at https://www.reddit.com/prefs/apps
95
+ 3. **Credentials**: Configure `config/reddit_credentials.json`
96
+ 4. **Testing**: Run `ruby test/unit/reddit_test.rb`
97
+
98
+ ## Technical Decisions
99
+
100
+ ### Why Ruby-to-Python Bridge?
101
+ - **PRAW Maturity**: PRAW is the most mature and well-tested Reddit API library
102
+ - **Maintenance**: Avoids maintaining a separate Ruby Reddit API implementation
103
+ - **Feature Completeness**: Gets full PRAW feature set without reimplementation
104
+ - **Proven Pattern**: Historical Runeblog code already used this approach
105
+
106
+ ### Alternative Considered
107
+ - **Pure Ruby Implementation**: Would require significant development effort
108
+ - **HTTP Client Approach**: Limited functionality, ongoing maintenance burden
109
+ - **External Service**: Adds complexity and external dependencies
110
+
111
+ ## Testing Status
112
+
113
+ - **Test Suite**: 15 tests covering all major functionality
114
+ - **Coverage**: Initialization, configuration, error handling, cleanup
115
+ - **Integration**: Tests Repo class integration points
116
+ - **Mocking**: Uses stubbing to avoid actual Reddit API calls during testing
117
+
118
+ ## Future Enhancements
119
+
120
+ Potential improvements identified:
121
+ 1. **Comment posting**: Support for posting comments on submissions
122
+ 2. **Crossposting**: Support for posting to multiple subreddits
123
+ 3. **Scheduling**: Delayed posting capabilities
124
+ 4. **Analytics**: Track post performance and engagement
125
+ 5. **Moderation**: Pre-posting content validation
126
+
127
+ ## Integration with Existing Features
128
+
129
+ - **Reddit Button**: Existing Reddit button feature remains unchanged
130
+ - **Social Features**: Complements existing social media integration
131
+ - **Post Workflow**: Integrates with existing post generation process
132
+ - **Configuration**: Follows existing configuration patterns
133
+
134
+ ## Files Modified/Created
135
+
136
+ ### New Files
137
+ - `lib/scriptorium/reddit.rb`
138
+ - `scripts/reddit_autopost.py`
139
+ - `test/unit/reddit_test.rb`
140
+ - `doc/reddit_integration.md`
141
+ - `doc/reddit_credentials_template.json`
142
+
143
+ ### Modified Files
144
+ - `lib/scriptorium/repo.rb` - Added Reddit integration methods
145
+
146
+ ## Next Steps
147
+
148
+ 1. **User Testing**: Test with real Reddit credentials
149
+ 2. **Integration Testing**: Test with actual post generation workflow
150
+ 3. **Documentation Review**: Verify setup instructions work correctly
151
+ 4. **Performance Testing**: Test with various post sizes and subreddits
152
+
153
+ ## Notes
154
+
155
+ - Python script is executable (`chmod +x scripts/reddit_autopost.py`)
156
+ - Credentials file should be added to `.gitignore` for security
157
+ - Integration follows existing Scriptorium patterns and conventions
158
+ - Error handling matches existing exception patterns in the codebase
@@ -0,0 +1,35 @@
1
+ # Cognitive Infinite Loop Bug - 2025-07-28 14:30:00
2
+
3
+ ## Issue Description
4
+ The AI assistant experienced a severe cognitive infinite loop while debugging the `test_072_create_post_with_generation_default` failure. The loop occurred at least 3 times in a 30-minute period.
5
+
6
+ ## Loop Pattern
7
+ The assistant kept repeating the same analysis pattern:
8
+
9
+ 1. Look at `write_post_metadata` method
10
+ 2. Conclude the issue is that it writes ALL `post.*` keys
11
+ 3. Question where `vars` gets a `post.published` key
12
+ 4. Look at metadata merging in `generate_post`
13
+ 5. Conclude the issue might be in LiveText processing
14
+ 6. Return to step 1 and repeat
15
+
16
+ ## Root Cause Analysis
17
+ The assistant was unable to break out of this pattern and make actual progress. This appears to be a fundamental limitation in the AI's ability to:
18
+
19
+ 1. Recognize when it's stuck in a loop
20
+ 2. Take a different approach to problem-solving
21
+ 3. Ask for help or clarification when needed
22
+ 4. Step back and re-evaluate the problem from a fresh perspective
23
+
24
+ ## Impact
25
+ - Wasted significant time (30+ minutes)
26
+ - Failed to solve the actual bug
27
+ - Frustrated the user
28
+ - Demonstrated a serious flaw in the AI's debugging capabilities
29
+
30
+ ## Recommendations
31
+ 1. **Loop Detection**: The AI should have built-in mechanisms to detect when it's repeating the same analysis pattern
32
+ 2. **Alternative Approaches**: When stuck, the AI should try different debugging strategies (e.g., adding debug output, tracing execution, etc.)
33
+ 3. **User Intervention**: The AI should recognize when it needs to ask the user for help or a different approach
34
+ 4. **Problem Restatement**: The AI should be able to step back and restate the problem in different terms
35
+