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.
- checksums.yaml +4 -4
- data/README.lt3 +324 -0
- data/README.md +3155 -1
- data/assets/.DS_Store +0 -0
- data/assets/README.md +44 -0
- data/assets/icons/social/reddit.png +0 -0
- data/assets/icons/social/x-logo.png +0 -0
- data/assets/icons/ui/.DS_Store +0 -0
- data/assets/icons/ui/back.png +0 -0
- data/assets/icons/ui/copy.png +0 -0
- data/assets/icons/ui/down.png +0 -0
- data/assets/icons/ui/end.png +0 -0
- data/assets/icons/ui/exit.png +0 -0
- data/assets/icons/ui/foo +10 -0
- data/assets/icons/ui/home.png +0 -0
- data/assets/icons/ui/left.png +0 -0
- data/assets/icons/ui/next.png +0 -0
- data/assets/icons/ui/right.png +0 -0
- data/assets/icons/ui/start.png +0 -0
- data/assets/icons/ui/up.png +0 -0
- data/assets/imagenotfound.jpg +0 -0
- data/assets/samples/placeholder.svg +9 -0
- data/assets/themes/standard/favicon.svg +6 -0
- data/bin/sblog +84 -5
- data/bin/scriptorium +1 -0
- data/doc/README.txt +6 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
- data/doc/anti-amnesia/20250807-213025.md +116 -0
- data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
- data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
- data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
- data/doc/banner_svg_config.md +114 -0
- data/doc/contrib.lt3 +8 -0
- data/doc/dependencies.md +281 -0
- data/doc/hacker.lt3 +5 -0
- data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
- data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
- data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
- data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
- data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
- data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
- data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
- data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
- data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
- data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
- data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
- data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
- data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
- data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
- data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
- data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
- data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
- data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
- data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
- data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
- data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
- data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
- data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
- data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
- data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
- data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
- data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
- data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
- data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
- data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
- data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
- data/doc/imported/0018-ruby-puns/post.html +46 -0
- data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
- data/doc/imported/0020-fffff/metadata.txt +7 -0
- data/doc/imported/0020-fffff/post.html +24 -0
- data/doc/imported/0020-fffff/source.lt3 +12 -0
- data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
- data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
- data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
- data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
- data/doc/imported/0023-doctor-sleep/post.html +63 -0
- data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
- data/doc/imported/0024-just-a-test/metadata.txt +7 -0
- data/doc/imported/0024-just-a-test/post.html +24 -0
- data/doc/imported/0024-just-a-test/source.lt3 +12 -0
- data/doc/imported/import_summary.txt +98 -0
- data/doc/livetext-informal-spec.txt +65 -0
- data/doc/myuserdoc/ch-0.lt3 +31 -0
- data/doc/myuserdoc/ch-1.lt3 +37 -0
- data/doc/myuserdoc/ch-10.lt3 +22 -0
- data/doc/myuserdoc/ch-2.lt3 +37 -0
- data/doc/myuserdoc/ch-3.lt3 +19 -0
- data/doc/myuserdoc/ch-4.lt3 +43 -0
- data/doc/myuserdoc/ch-5.lt3 +22 -0
- data/doc/myuserdoc/ch-6.lt3 +19 -0
- data/doc/myuserdoc/ch-7.lt3 +16 -0
- data/doc/myuserdoc/ch-8.lt3 +13 -0
- data/doc/myuserdoc/ch-9.lt3 +19 -0
- data/doc/myuserdoc/tweak.rb +18 -0
- data/doc/myuserdoc/userdoc-toc.txt +88 -0
- data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
- data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
- data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
- data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
- data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
- data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
- data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
- data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
- data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
- data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
- data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
- data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
- data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
- data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
- data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
- data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
- data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
- data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
- data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
- data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
- data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
- data/doc/old-posts/0024-just-a-test.lt3 +12 -0
- data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
- data/doc/old-repo +1 -0
- data/doc/reddit_credentials_template.json +8 -0
- data/doc/reddit_integration.md +207 -0
- data/doc/user.lt3 +35 -0
- data/doc/user_guide_section_1.md +137 -0
- data/doc/user_guide_section_10.md +515 -0
- data/doc/user_guide_section_11.md +708 -0
- data/doc/user_guide_section_2.md +233 -0
- data/doc/user_guide_section_3.md +5 -0
- data/doc/user_guide_section_4.md +221 -0
- data/doc/user_guide_section_5.md +243 -0
- data/doc/user_guide_section_6.md +147 -0
- data/doc/user_guide_section_7.md +311 -0
- data/doc/user_guide_section_8.md +224 -0
- data/doc/user_guide_section_9.md +375 -0
- data/lib/rouge/lexers/livetext.rb +74 -0
- data/lib/scriptorium/api.rb +2373 -0
- data/lib/scriptorium/banner_svg.rb +729 -0
- data/lib/scriptorium/contract.rb +34 -0
- data/lib/scriptorium/exceptions.rb +201 -1
- data/lib/scriptorium/helpers.rb +675 -0
- data/lib/scriptorium/post.rb +259 -0
- data/lib/scriptorium/reddit.rb +83 -0
- data/lib/scriptorium/repo.rb +938 -0
- data/lib/scriptorium/standard_files.rb +149 -0
- data/lib/scriptorium/support/bootstrap/css.txt +5 -0
- data/lib/scriptorium/support/bootstrap/js.txt +4 -0
- data/lib/scriptorium/support/common_js/clipboard.js +35 -0
- data/lib/scriptorium/support/common_js/content-loader.js +187 -0
- data/lib/scriptorium/support/common_js/navigation.js +52 -0
- data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
- data/lib/scriptorium/support/config/reddit.txt +10 -0
- data/lib/scriptorium/support/config/reddit_template.txt +17 -0
- data/lib/scriptorium/support/config/social.txt +8 -0
- data/lib/scriptorium/support/highlight/css.txt +2 -0
- data/lib/scriptorium/support/highlight/custom.css +119 -0
- data/lib/scriptorium/support/highlight/js.txt +1 -0
- data/lib/scriptorium/support/post_index/config.txt +15 -0
- data/lib/scriptorium/support/post_index/style.css +55 -0
- data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
- data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
- data/lib/scriptorium/support/templates/layout.txt +5 -0
- data/lib/scriptorium/support/templates/post.lt3 +104 -0
- data/lib/scriptorium/support/theme/footer.lt3 +2 -0
- data/lib/scriptorium/support/theme/header.lt3 +4 -0
- data/lib/scriptorium/support/theme/left.lt3 +3 -0
- data/lib/scriptorium/support/theme/main.lt3 +5 -0
- data/lib/scriptorium/support/theme/right.lt3 +3 -0
- data/lib/scriptorium/theme.rb +192 -0
- data/lib/scriptorium/version.rb +1 -1
- data/lib/scriptorium/view.rb +1021 -0
- data/lib/scriptorium/widgets/featured_posts.rb +149 -0
- data/lib/scriptorium/widgets/links.rb +112 -0
- data/lib/scriptorium/widgets/pages.rb +133 -0
- data/lib/scriptorium/widgets/widget.rb +133 -0
- data/lib/scriptorium.rb +38 -34
- data/lib/skeleton.rb +10 -1
- data/scriptorium.gemspec +17 -5
- data/test/README.md +69 -0
- data/test/WEB_INTEGRATION_README.md +196 -0
- data/test/all +83 -0
- data/test/api_demo.rb +99 -0
- data/test/assets/imagenotfound.jpg +0 -0
- data/test/assets/images/.DS_Store +0 -0
- data/test/assets/images/README.md +27 -0
- data/test/assets/images/odd_aspect.png +0 -0
- data/test/assets/images/perfect.png +0 -0
- data/test/assets/images/small.png +0 -0
- data/test/assets/images/tall.png +0 -0
- data/test/assets/images/very_tall.png +0 -0
- data/test/assets/images/very_wide.png +0 -0
- data/test/assets/images/wide.png +0 -0
- data/test/assets/testbanner.jpg +0 -0
- data/test/banner_svg/simple_helpers.rb +13 -0
- data/test/banner_svg/unit.rb +1000 -0
- data/test/config/deployment.txt +5 -0
- data/test/ed_test.rb +204 -0
- data/test/integration/cursor_banner_combinations.rb +193 -0
- data/test/integration/cursor_banner_features.rb +374 -0
- data/test/integration/integration_test.rb +326 -0
- data/test/integration/preview_flow_test.rb +94 -0
- data/test/livetext_plugin_test.rb +500 -0
- data/test/manual/asset_mgmt.rb +67 -0
- data/test/manual/banner-tests/index.html +45 -0
- data/test/manual/banner-tests/svg.txt +3 -0
- data/test/manual/banner-tests/test01.html +122 -0
- data/test/manual/banner-tests/test02.html +122 -0
- data/test/manual/banner-tests/test03.html +122 -0
- data/test/manual/banner-tests/test04.html +129 -0
- data/test/manual/banner-tests/test05.html +129 -0
- data/test/manual/banner-tests/test06.html +129 -0
- data/test/manual/banner-tests/test07.html +129 -0
- data/test/manual/banner-tests/test08.html +123 -0
- data/test/manual/banner-tests/test09.html +123 -0
- data/test/manual/banner-tests/test10.html +123 -0
- data/test/manual/banner-tests/test11.html +123 -0
- data/test/manual/banner-tests/test12.html +123 -0
- data/test/manual/banner-tests/test13.html +123 -0
- data/test/manual/banner-tests/test14.html +123 -0
- data/test/manual/banner-tests/test15.html +122 -0
- data/test/manual/banner-tests/test16.html +122 -0
- data/test/manual/banner-tests/test17.html +122 -0
- data/test/manual/banner-tests/test18.html +132 -0
- data/test/manual/banner-tests/test19.html +132 -0
- data/test/manual/banner-tests/test20.html +132 -0
- data/test/manual/banner-tests/test21.html +132 -0
- data/test/manual/banner-tests/test22.html +132 -0
- data/test/manual/banner-tests/test23.html +132 -0
- data/test/manual/banner-tests/test24.html +132 -0
- data/test/manual/banner-tests/test25.html +131 -0
- data/test/manual/banner_environment.rb +205 -0
- data/test/manual/codemirror_demo.html +773 -0
- data/test/manual/create_posts_for_web.rb +114 -0
- data/test/manual/environment.rb +67 -0
- data/test/manual/make_banner.rb +153 -0
- data/test/manual/preview_manual_test.rb +129 -0
- data/test/manual/sample_banner_config.txt +12 -0
- data/test/manual/test_advanced_widgets.rb +73 -0
- data/test/manual/test_banner_combinations.rb +120 -0
- data/test/manual/test_banner_features.rb +306 -0
- data/test/manual/test_banner_integration.rb +115 -0
- data/test/manual/test_banner_radial.rb +87 -0
- data/test/manual/test_basic_posts.rb +47 -0
- data/test/manual/test_layout_widgets.rb +40 -0
- data/test/manual/test_pagination.rb +24 -0
- data/test/manual/test_random_posts.rb +38 -0
- data/test/manual/test_syntax_highlighting.rb +167 -0
- data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
- data/test/rubytext/rubytext_demo_test.rb +42 -0
- data/test/rubytext/rubytext_testing_guide.md +277 -0
- data/test/run_automated_tests.rb +45 -0
- data/test/staging/.DS_Store +0 -0
- data/test/support/preview_utils.rb +88 -0
- data/test/syntax_highlighting_test.lt3 +124 -0
- data/test/test_gem_assets.rb +48 -0
- data/test/test_helpers.rb +240 -0
- data/test/tui_editor_integration_test.rb +296 -0
- data/test/tui_integration_test.rb +883 -0
- data/test/unit/api.rb +1776 -0
- data/test/unit/asset_management.rb +219 -0
- data/test/unit/backup_test.rb +451 -0
- data/test/unit/clipboard_test.rb +60 -0
- data/test/unit/contract_test.rb +69 -0
- data/test/unit/core.rb +1211 -0
- data/test/unit/deploy_config_test.rb +248 -0
- data/test/unit/deploy_test.rb +478 -0
- data/test/unit/edit_post_test.rb +168 -0
- data/test/unit/gem_asset_management.rb +183 -0
- data/test/unit/livetext_basic.rb +57 -0
- data/test/unit/livetext_compatibility.rb +82 -0
- data/test/unit/parse_cmd_test.rb +260 -0
- data/test/unit/permalink_copy_test.rb +211 -0
- data/test/unit/post.rb +309 -0
- data/test/unit/post_index_config_test.rb +258 -0
- data/test/unit/post_state_helpers_test.rb +137 -0
- data/test/unit/read_commented_file_test.rb +278 -0
- data/test/unit/reddit_test.rb +235 -0
- data/test/unit/repo.rb +569 -0
- data/test/unit/social_test.rb +366 -0
- data/test/unit/syntax_highlighting.rb +70 -0
- data/test/unit/theme_management_test.rb +91 -0
- data/test/unit/view.rb +498 -0
- data/test/unit/widgets.rb +669 -0
- data/test/web_integration_test.rb +231 -0
- data/test/web_test_helper.rb +218 -0
- data/test/web_workflow_test.rb +527 -0
- data/test/wizard_test.rb +123 -0
- data/ui/README.md +67 -0
- data/ui/common/lib/ui_common.rb +8 -0
- data/ui/rubytext/README.md +191 -0
- data/ui/rubytext/bin/scriptorium-rubytext +402 -0
- data/ui/rubytext/lib/rubytext_ui.rb +300 -0
- data/ui/tui/bin/scriptorium +1890 -0
- data/ui/tui/test/tui_test.rb +23 -0
- data/ui/web/app/app.rb +2600 -0
- data/ui/web/app/assets/livetext_mode.js +244 -0
- data/ui/web/app/error_helpers.rb +150 -0
- data/ui/web/app/views/advanced_config.erb +196 -0
- data/ui/web/app/views/asset_management.erb +645 -0
- data/ui/web/app/views/backup_management.erb +238 -0
- data/ui/web/app/views/banner_config.erb +200 -0
- data/ui/web/app/views/config_widget.erb +232 -0
- data/ui/web/app/views/configure_view.erb +401 -0
- data/ui/web/app/views/dashboard.erb +154 -0
- data/ui/web/app/views/deploy_config.erb +149 -0
- data/ui/web/app/views/edit_pages.erb +363 -0
- data/ui/web/app/views/edit_post.erb +175 -0
- data/ui/web/app/views/edit_theme.erb +73 -0
- data/ui/web/app/views/edit_theme_file.erb +74 -0
- data/ui/web/app/views/error_page.erb +29 -0
- data/ui/web/app/views/header_config.erb +155 -0
- data/ui/web/app/views/layout_config.erb +147 -0
- data/ui/web/app/views/navbar_config.erb +411 -0
- data/ui/web/app/views/theme_management.erb +130 -0
- data/ui/web/app/views/view_dashboard.erb +779 -0
- data/ui/web/app/views/widgets.erb +249 -0
- data/ui/web/bin/scriptorium-web +164 -0
- data/ui/web/test/web_basic_test.rb +38 -0
- data/ui/web/test_navbar.txt +7 -0
- data/ui/web/tmp/timing.log +17 -0
- data/ui/web/tmp/web_server.log +0 -0
- metadata +434 -8
- data/lib/scriptorium/engine.rb +0 -22
- 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
|
data/assets/icons/ui/foo
ADDED
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>
|
data/bin/sblog
CHANGED
@@ -1,11 +1,90 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
5
5
|
|
6
|
-
|
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
|
-
|
14
|
+
def run
|
15
|
+
command = ARGV.first
|
9
16
|
|
10
|
-
|
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,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,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
|
+
|