retold 4.0.4 → 4.0.7

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 (92) hide show
  1. package/.claude/launch.json +29 -0
  2. package/.claude/settings.local.json +60 -2
  3. package/CLAUDE.md +4 -2
  4. package/README.md +4 -2
  5. package/Retold-Modules-Manifest.json +576 -0
  6. package/docs/README.md +7 -1
  7. package/docs/{cover.md → _cover.md} +1 -1
  8. package/docs/_sidebar.md +30 -3
  9. package/docs/architecture/architecture.md +5 -2
  10. package/docs/architecture/dependencies/_generate-graph.js +186 -0
  11. package/docs/architecture/dependencies/_generate-svg.js +364 -0
  12. package/docs/architecture/dependencies/in-ecosystem-dependency-graph-generation.md +97 -0
  13. package/docs/architecture/dependencies/in-ecosystem-dependency-graph.json +3168 -0
  14. package/docs/architecture/dependencies/in-ecosystem-dependency-graph.md +221 -0
  15. package/docs/architecture/dependencies/in-ecosystem-dependency-graph.svg +664 -0
  16. package/docs/architecture/documentation-style-guide.md +65 -0
  17. package/docs/architecture/example-app-style-guide.md +154 -0
  18. package/docs/architecture/modules.md +17 -5
  19. package/docs/architecture/templating/data-access.md +196 -0
  20. package/docs/architecture/templating/data-formatting.md +350 -0
  21. package/docs/architecture/templating/data-generation.md +72 -0
  22. package/docs/architecture/templating/debugging.md +181 -0
  23. package/docs/architecture/templating/entity.md +99 -0
  24. package/docs/architecture/templating/iteration.md +170 -0
  25. package/docs/architecture/templating/jellyfish-deep-dive.md +271 -0
  26. package/docs/architecture/templating/jellyfish-templates.md +476 -0
  27. package/docs/architecture/templating/logic.md +185 -0
  28. package/docs/architecture/templating/ref-breakpoint.md +38 -0
  29. package/docs/architecture/templating/ref-data.md +51 -0
  30. package/docs/architecture/templating/ref-dateonlyformat.md +43 -0
  31. package/docs/architecture/templating/ref-dateonlyymd.md +39 -0
  32. package/docs/architecture/templating/ref-datetimeformat.md +59 -0
  33. package/docs/architecture/templating/ref-datetimeymd.md +44 -0
  34. package/docs/architecture/templating/ref-dejs.md +42 -0
  35. package/docs/architecture/templating/ref-digits.md +36 -0
  36. package/docs/architecture/templating/ref-dj.md +50 -0
  37. package/docs/architecture/templating/ref-dollars.md +36 -0
  38. package/docs/architecture/templating/ref-dt.md +38 -0
  39. package/docs/architecture/templating/ref-dvbk.md +46 -0
  40. package/docs/architecture/templating/ref-dwaf.md +45 -0
  41. package/docs/architecture/templating/ref-dwtf.md +45 -0
  42. package/docs/architecture/templating/ref-entity.md +47 -0
  43. package/docs/architecture/templating/ref-hce.md +29 -0
  44. package/docs/architecture/templating/ref-hcs.md +38 -0
  45. package/docs/architecture/templating/ref-join.md +45 -0
  46. package/docs/architecture/templating/ref-joinunique.md +34 -0
  47. package/docs/architecture/templating/ref-ls.md +37 -0
  48. package/docs/architecture/templating/ref-lv.md +38 -0
  49. package/docs/architecture/templating/ref-lvt.md +33 -0
  50. package/docs/architecture/templating/ref-ne.md +40 -0
  51. package/docs/architecture/templating/ref-pascalcaseidentifier.md +41 -0
  52. package/docs/architecture/templating/ref-pict.md +42 -0
  53. package/docs/architecture/templating/ref-pluckjoinunique.md +39 -0
  54. package/docs/architecture/templating/ref-rn.md +35 -0
  55. package/docs/architecture/templating/ref-rns.md +35 -0
  56. package/docs/architecture/templating/ref-sbr.md +36 -0
  57. package/docs/architecture/templating/ref-solve.md +46 -0
  58. package/docs/architecture/templating/ref-tbda.md +41 -0
  59. package/docs/architecture/templating/ref-tbr.md +43 -0
  60. package/docs/architecture/templating/ref-tbt.md +46 -0
  61. package/docs/architecture/templating/ref-template.md +40 -0
  62. package/docs/architecture/templating/ref-tfa.md +32 -0
  63. package/docs/architecture/templating/ref-tfm.md +43 -0
  64. package/docs/architecture/templating/ref-tif.md +45 -0
  65. package/docs/architecture/templating/ref-tifabs.md +41 -0
  66. package/docs/architecture/templating/ref-ts.md +41 -0
  67. package/docs/architecture/templating/ref-tsfm.md +42 -0
  68. package/docs/architecture/templating/ref-tswp.md +45 -0
  69. package/docs/architecture/templating/ref-tvs.md +48 -0
  70. package/docs/architecture/templating/ref-view.md +40 -0
  71. package/docs/architecture/templating/ref-vrs.md +39 -0
  72. package/docs/architecture/templating/solvers.md +153 -0
  73. package/docs/architecture/templating/template-composition.md +196 -0
  74. package/docs/architecture/templating/template-expressions.md +217 -0
  75. package/docs/architecture/templating/views.md +154 -0
  76. package/docs/examples/todolist/todo-list.md +1 -1
  77. package/docs/modules/apps.md +26 -0
  78. package/docs/modules/pict.md +18 -0
  79. package/docs/modules/utility.md +23 -1
  80. package/docs/retold-catalog.json +829 -102
  81. package/docs/retold-keyword-index.json +195212 -115957
  82. package/modules/CLAUDE.md +1 -0
  83. package/modules/Checkout.sh +1 -0
  84. package/modules/Diff.sh +86 -0
  85. package/modules/Include-Retold-Module-List.sh +4 -2
  86. package/modules/Status.sh +1 -0
  87. package/modules/Update.sh +1 -0
  88. package/modules/apps/Apps.md +1 -0
  89. package/modules/utility/Utility.md +1 -0
  90. package/package.json +9 -11
  91. package/docs/retold-building-documentation.md +0 -33
  92. package/modules/Retold-Modules.md +0 -24
@@ -0,0 +1,29 @@
1
+ {
2
+ "version": "0.0.1",
3
+ "configurations": [
4
+ {
5
+ "name": "docs",
6
+ "runtimeExecutable": "npx",
7
+ "runtimeArgs": ["quack", "docs-serve", "./docs"],
8
+ "port": 3333
9
+ },
10
+ {
11
+ "name": "retold-content-system",
12
+ "runtimeExecutable": "bash",
13
+ "runtimeArgs": ["-c", "cd modules/apps/retold-content-system && PORT=9001 node server.js"],
14
+ "port": 9001
15
+ },
16
+ {
17
+ "name": "retold-remote",
18
+ "runtimeExecutable": "bash",
19
+ "runtimeArgs": ["-c", "cd modules/apps/retold-remote && PORT=9002 node server.js"],
20
+ "port": 9002
21
+ },
22
+ {
23
+ "name": "retold-harness",
24
+ "runtimeExecutable": "bash",
25
+ "runtimeArgs": ["-c", "cd modules/meadow/retold-harness && PORT=9003 node source/Retold-Harness.js"],
26
+ "port": 9003
27
+ }
28
+ ]
29
+ }
@@ -35,7 +35,6 @@
35
35
  "Bash(npm run build-docs:*)",
36
36
  "Bash(lsof:*)",
37
37
  "Bash(find:*)",
38
- "Bash(DISCLAIMER='> **Note:** This is sample documentation for a fictional product, created to demonstrate [pict-docuserve]\\(https://github.com/stevenvelozo/pict-docuserve\\). It is not a real application.')",
39
38
  "Bash(SKIP_FILES=\"_sidebar.md _topbar.md cover.md errorpage.md\")",
40
39
  "Bash(npm install)",
41
40
  "Bash(xargs kill:*)",
@@ -114,7 +113,66 @@
114
113
  "Bash(npm run docker-dev-build:*)",
115
114
  "Bash(npm run docker-dev-run:*)",
116
115
  "Bash(npm rebuild:*)",
117
- "Bash(docker compose:*)"
116
+ "Bash(docker compose:*)",
117
+ "WebFetch(domain:github.com)",
118
+ "Bash(node bin/stricture compile:*)",
119
+ "Bash(node bin/stricture:*)",
120
+ "Bash(open:*)",
121
+ "Bash(for f in simple_form/html/index.html simple_table/html/index.html simple_distill/html/index.html complex_table/html/index.html complex_tuigrid/html/index.html gradebook/html/index.html manyfest_editor/html/index.html debug/index.html index.html)",
122
+ "Bash(do sed -i '' 's/padding: 1\\\\.5rem; max-width: 1200px; margin: 0 auto;/padding: 1.5rem;/g' \"$f\")",
123
+ "Bash(for f in simple_entity/html/index.html index.html mocks/list-view.html mocks/book-read-view.html mocks/book-edit-view.html)",
124
+ "Bash(node generate-build-config.cjs:*)",
125
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/View-Register.cjs << 'ENDOFFILE'\n/**\n * View-Register — Bind your soul to the Calendar of Doom\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-Register',\n\tDefaultRenderable: 'CalendarOfDoom-Register-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-Register-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-auth-container\">\n\t<div class=\"doom-auth-card\">\n\t\t<div class=\"doom-auth-header\">\n\t\t\t<h1 class=\"doom-auth-title\">魂の登録</h1>\n\t\t\t<p class=\"doom-auth-subtitle\">SOUL REGISTRATION</p>\n\t\t\t<p class=\"doom-auth-tagline\">Bind yourself to the calendar. There is no going back.</p>\n\t\t</div>\n\t\t<div id=\"authError\" class=\"doom-auth-error\" style=\"display:none;\"></div>\n\t\t<div class=\"doom-form\">\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Username</label>\n\t\t\t\t<input type=\"text\" id=\"registerUsername\" class=\"doom-input\" placeholder=\"Choose your dark identity\" />\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Display Name</label>\n\t\t\t\t<input type=\"text\" id=\"registerDisplayName\" class=\"doom-input\" placeholder=\"How shall the void address you?\" />\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Email</label>\n\t\t\t\t<input type=\"email\" id=\"registerEmail\" class=\"doom-input\" placeholder=\"doom@your.void\" />\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Password</label>\n\t\t\t\t<input type=\"password\" id=\"registerPassword\" class=\"doom-input\" placeholder=\"Guard it with your existence\"\n\t\t\t\t\tonkeypress=\"if\\(event.key==='Enter'\\){~P~}.PictApplication.doRegister\\(\\)\" />\n\t\t\t</div>\n\t\t\t<button class=\"doom-btn doom-btn-primary doom-btn-block\" onclick=\"{~P~}.PictApplication.doRegister\\(\\)\">\n\t\t\t\tBIND MY SOUL\n\t\t\t</button>\n\t\t\t<div class=\"doom-auth-footer\">\n\t\t\t\t<p>Already doomed? <a href=\"#/Login\" class=\"doom-link\">Return to the gate</a></p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-Register-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-Register-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewRegister extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n}\n\nmodule.exports = ViewRegister;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
126
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/View-DeletedList.cjs << 'ENDOFFILE'\n/**\n * View-DeletedList — The graveyard of obliterated events\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-DeletedList',\n\tDefaultRenderable: 'CalendarOfDoom-DeletedList-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-DeletedList-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel\">\n\t<h2 class=\"doom-panel-title\">The Event Graveyard 墓地</h2>\n\t<p class=\"doom-panel-subtitle\">Here lie the events you obliterated. Their spirits linger in the database, marked but not forgotten.</p>\n\t<p class=\"doom-muted-text\">Deleted events are soft-deleted by Meadow. They exist in shadow, invisible to normal queries but forever in the SQLite void.</p>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-DeletedList-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-DeletedList-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewDeletedList extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n}\n\nmodule.exports = ViewDeletedList;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
127
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/View-EventList.cjs << 'ENDOFFILE'\n/**\n * View-EventList — All doom events in a paginated table of suffering\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-EventList',\n\tDefaultRenderable: 'CalendarOfDoom-EventList-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-EventList-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel\">\n\t<div class=\"doom-toolbar\">\n\t\t<input type=\"text\" id=\"eventSearchInput\" class=\"doom-input doom-search-input\" placeholder=\"Search the abyss...\"\n\t\t\tonkeypress=\"if\\(event.key==='Enter'\\){~P~}.PictApplication.searchEvents\\(\\)\" />\n\t\t<button class=\"doom-btn doom-btn-secondary\" onclick=\"{~P~}.PictApplication.searchEvents\\(\\)\">Search</button>\n\t\t<button class=\"doom-btn doom-btn-muted\" onclick=\"{~P~}.PictApplication.clearSearch\\(\\)\">Clear</button>\n\t\t<select id=\"eventSortSelect\" class=\"doom-select\" onchange=\"{~P~}.PictApplication.changeSortOrder\\(\\)\">\n\t\t\t<option value=\"EventDate-ASC\">Date ↑</option>\n\t\t\t<option value=\"EventDate-DESC\">Date ↓</option>\n\t\t\t<option value=\"Title-ASC\">Title A→Z</option>\n\t\t\t<option value=\"Title-DESC\">Title Z→A</option>\n\t\t\t<option value=\"Status-ASC\">Status ↑</option>\n\t\t\t<option value=\"Status-DESC\">Status ↓</option>\n\t\t\t<option value=\"EventType-ASC\">Type ↑</option>\n\t\t\t<option value=\"EventType-DESC\">Type ↓</option>\n\t\t</select>\n\t\t<span class=\"doom-record-count\" id=\"doom-record-count\"></span>\n\t</div>\n\t<table class=\"doom-table\">\n\t\t<thead><tr>\n\t\t\t<th class=\"doom-th\">Title</th>\n\t\t\t<th class=\"doom-th\">Date</th>\n\t\t\t<th class=\"doom-th\">Type</th>\n\t\t\t<th class=\"doom-th\">Status</th>\n\t\t\t<th class=\"doom-th\">Actions</th>\n\t\t</tr></thead>\n\t\t<tbody id=\"doom-event-list-tbody\"></tbody>\n\t</table>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-EventList-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-EventList-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewEventList extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpEvents = tmpApp.Events || [];\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\n\t\t// Populate record count\n\t\tlet tmpCountEl = document.getElementById\\('doom-record-count'\\);\n\t\tif \\(tmpCountEl\\)\n\t\t{\n\t\t\ttmpCountEl.textContent = tmpApp.FilteredCount + ' of ' + tmpApp.TotalCount + ' doom events';\n\t\t}\n\n\t\t// Populate search input\n\t\tlet tmpSearchInput = document.getElementById\\('eventSearchInput'\\);\n\t\tif \\(tmpSearchInput && tmpApp.ListState.SearchText\\)\n\t\t{\n\t\t\ttmpSearchInput.value = tmpApp.ListState.SearchText;\n\t\t}\n\n\t\t// Set sort select\n\t\tlet tmpSelect = document.getElementById\\('eventSortSelect'\\);\n\t\tif \\(tmpSelect\\)\n\t\t{\n\t\t\ttmpSelect.value = tmpApp.ListState.SortColumn + '-' + tmpApp.ListState.SortDirection;\n\t\t}\n\n\t\t// Populate event rows\n\t\tlet tmpTbody = document.getElementById\\('doom-event-list-tbody'\\);\n\t\tif \\(!tmpTbody\\) { return super.onAfterRender\\(\\); }\n\n\t\tlet tmpRows = '';\n\t\tfor \\(let i = 0; i < tmpEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpEvents[i];\n\t\t\tlet tmpStatusClass = \\(tmpE.Status === 'Complete'\\) ? 'doom-badge-success' : 'doom-badge-default';\n\t\t\tlet tmpTypeClass = \\(tmpE.IsHoliday === '1'\\) ? 'doom-badge-accent' : 'doom-badge-default';\n\t\t\tlet tmpDate = tmpPictApp.formatDate\\(tmpE.EventDate\\);\n\n\t\t\ttmpRows += ''\n\t\t\t\t+ '<tr class=\"doom-tr\">'\n\t\t\t\t+ ' <td class=\"doom-td\">' + \\(tmpE.Title || ''\\) + '</td>'\n\t\t\t\t+ ' <td class=\"doom-td\">' + tmpDate + '</td>'\n\t\t\t\t+ ' <td class=\"doom-td\"><span class=\"doom-badge ' + tmpTypeClass + '\">' + \\(tmpE.EventType || 'Event'\\) + '</span></td>'\n\t\t\t\t+ ' <td class=\"doom-td\"><span class=\"doom-badge ' + tmpStatusClass + '\">' + \\(tmpE.Status || 'Pending'\\) + '</span></td>'\n\t\t\t\t+ ' <td class=\"doom-td doom-actions\">'\n\t\t\t\t+ ' <button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"Pict.PictApplication.viewEvent\\(' + tmpE.IDEvent + '\\)\">View</button>'\n\t\t\t\t+ ' <button class=\"doom-btn doom-btn-sm doom-btn-primary\" onclick=\"Pict.PictApplication.editEvent\\(' + tmpE.IDEvent + '\\)\">Edit</button>'\n\t\t\t\t+ ' <button class=\"doom-btn doom-btn-sm doom-btn-danger\" onclick=\"Pict.PictApplication.deleteEvent\\(' + tmpE.IDEvent + '\\)\">Obliterate</button>'\n\t\t\t\t+ ' </td>'\n\t\t\t\t+ '</tr>';\n\t\t}\n\n\t\tif \\(tmpEvents.length === 0\\)\n\t\t{\n\t\t\ttmpRows = '<tr><td class=\"doom-td\" colspan=\"5\" style=\"text-align:center;opacity:0.5;\">The void is empty. No events found in this dimension.</td></tr>';\n\t\t}\n\n\t\ttmpTbody.innerHTML = tmpRows;\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewEventList;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
128
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/View-EventForm.cjs << 'ENDOFFILE'\n/**\n * View-EventForm — Conjure or reshape a doom event\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-EventForm',\n\tDefaultRenderable: 'CalendarOfDoom-EventForm-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-EventForm-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-form-panel\">\n\t<h2 class=\"doom-panel-title\" id=\"doom-form-title\">Conjure New Event</h2>\n\t<div class=\"doom-form\">\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group doom-form-wide\">\n\t\t\t\t<label class=\"doom-label\">Title of Doom</label>\n\t\t\t\t<input type=\"text\" id=\"eventTitle\" class=\"doom-input\" placeholder=\"Name your catastrophe\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Start Date/Time</label>\n\t\t\t\t<input type=\"datetime-local\" id=\"eventDate\" class=\"doom-input\" />\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">End Date/Time</label>\n\t\t\t\t<input type=\"datetime-local\" id=\"eventEndDate\" class=\"doom-input\" />\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Duration \\(hours\\)</label>\n\t\t\t\t<input type=\"number\" id=\"eventDuration\" class=\"doom-input\" step=\"0.25\" value=\"0\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Status</label>\n\t\t\t\t<select id=\"eventStatus\" class=\"doom-select\">\n\t\t\t\t\t<option value=\"Pending\">Pending</option>\n\t\t\t\t\t<option value=\"In Progress\">In Progress</option>\n\t\t\t\t\t<option value=\"Complete\">Complete</option>\n\t\t\t\t\t<option value=\"Cancelled\">Cancelled</option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\">Type</label>\n\t\t\t\t<select id=\"eventType\" class=\"doom-select\">\n\t\t\t\t\t<option value=\"Event\">Event</option>\n\t\t\t\t\t<option value=\"Meeting\">Meeting</option>\n\t\t\t\t\t<option value=\"Holiday\">Holiday</option>\n\t\t\t\t\t<option value=\"Deadline\">Deadline</option>\n\t\t\t\t\t<option value=\"Deployment\">Deployment</option>\n\t\t\t\t\t<option value=\"Maintenance\">Maintenance</option>\n\t\t\t\t\t<option value=\"Sprint\">Sprint</option>\n\t\t\t\t\t<option value=\"Social\">Social</option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div class=\"doom-form-group\">\n\t\t\t\t<label class=\"doom-label\" style=\"display:block;margin-bottom:8px;\">All Day?</label>\n\t\t\t\t<input type=\"checkbox\" id=\"eventIsAllDay\" /> <span class=\"doom-label-inline\">Yes, consume the entire day</span>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group doom-form-wide\">\n\t\t\t\t<label class=\"doom-label\">Location</label>\n\t\t\t\t<input type=\"text\" id=\"eventLocation\" class=\"doom-input\" placeholder=\"Where does the doom unfold?\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group doom-form-wide\">\n\t\t\t\t<label class=\"doom-label\">Description</label>\n\t\t\t\t<textarea id=\"eventDescription\" class=\"doom-textarea\" rows=\"3\" placeholder=\"Describe the horror...\"></textarea>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group doom-form-wide\">\n\t\t\t\t<label class=\"doom-label\">Notes</label>\n\t\t\t\t<textarea id=\"eventNotes\" class=\"doom-textarea\" rows=\"2\" placeholder=\"Additional dark knowledge...\"></textarea>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-row\">\n\t\t\t<div class=\"doom-form-group doom-form-wide\">\n\t\t\t\t<label class=\"doom-label\">Link URL</label>\n\t\t\t\t<input type=\"url\" id=\"eventLinkURL\" class=\"doom-input\" placeholder=\"https://doom.link\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"doom-form-actions\">\n\t\t\t<button class=\"doom-btn doom-btn-primary\" onclick=\"{~P~}.PictApplication.saveEvent\\(\\)\">Save the Doom</button>\n\t\t\t<button class=\"doom-btn doom-btn-muted\" onclick=\"{~P~}.PictApplication.showCalendarView\\('CalendarOfDoom-MonthView'\\)\">Cancel \\(flee\\)</button>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-EventForm-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-EventForm-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewEventForm extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpEvent = tmpApp.SelectedEvent || {};\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\n\t\t// Set form title\n\t\tlet tmpTitleEl = document.getElementById\\('doom-form-title'\\);\n\t\tif \\(tmpTitleEl\\)\n\t\t{\n\t\t\ttmpTitleEl.textContent = tmpApp.FormTitle || 'Conjure New Event';\n\t\t}\n\n\t\t// Populate fields if editing\n\t\tif \\(tmpEvent.Title\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventTitle'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.Title; }\n\t\t}\n\t\tif \\(tmpEvent.EventDate\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventDate'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpPictApp.formatDateForInput\\(tmpEvent.EventDate\\); }\n\t\t}\n\t\tif \\(tmpEvent.EventEndDate\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventEndDate'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpPictApp.formatDateForInput\\(tmpEvent.EventEndDate\\); }\n\t\t}\n\t\tif \\(tmpEvent.DurationHours\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventDuration'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.DurationHours; }\n\t\t}\n\t\tif \\(tmpEvent.Status\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventStatus'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.Status; }\n\t\t}\n\t\tif \\(tmpEvent.EventType\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventType'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.EventType; }\n\t\t}\n\t\tif \\(tmpEvent.IsAllDay === '1'\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventIsAllDay'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.checked = true; }\n\t\t}\n\t\tif \\(tmpEvent.Location\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventLocation'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.Location; }\n\t\t}\n\t\tif \\(tmpEvent.Description\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventDescription'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.Description; }\n\t\t}\n\t\tif \\(tmpEvent.Notes\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventNotes'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.Notes; }\n\t\t}\n\t\tif \\(tmpEvent.LinkURL\\)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById\\('eventLinkURL'\\);\n\t\t\tif \\(tmpEl\\) { tmpEl.value = tmpEvent.LinkURL; }\n\t\t}\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewEventForm;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
129
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/View-EventDetail.cjs << 'ENDOFFILE'\n/**\n * View-EventDetail — Gaze upon a single doom event in all its terrible glory\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-EventDetail',\n\tDefaultRenderable: 'CalendarOfDoom-EventDetail-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-EventDetail-Template',\n\t\t\tTemplate: /*html*/`<div id=\"doom-event-detail\"></div>`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-EventDetail-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-EventDetail-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewEventDetail extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpEvent = this.pict.AppData.CalendarOfDoom.SelectedEvent || {};\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\n\t\tlet tmpStatusClass = \\(tmpEvent.Status === 'Complete'\\) ? 'doom-badge-success' : 'doom-badge-default';\n\t\tlet tmpIsHoliday = \\(tmpEvent.IsHoliday === '1'\\) ? '<span class=\"doom-badge doom-badge-accent2\">Holiday</span>' : '';\n\t\tlet tmpIsAllDay = \\(tmpEvent.IsAllDay === '1'\\) ? '<span class=\"doom-badge doom-badge-accent\">All Day</span>' : '';\n\n\t\tlet tmpLink = '';\n\t\tif \\(tmpEvent.LinkURL\\)\n\t\t{\n\t\t\ttmpLink = '<a href=\"' + tmpEvent.LinkURL + '\" target=\"_blank\" class=\"doom-link\">' + tmpEvent.LinkURL + '</a>';\n\t\t}\n\n\t\tlet tmpHTML = ''\n\t\t\t+ '<div class=\"doom-panel doom-detail-panel\">'\n\t\t\t+ ' <div class=\"doom-detail-header\">'\n\t\t\t+ ' <h2 class=\"doom-detail-title\">' + \\(tmpEvent.Title || 'Unknown Doom'\\) + '</h2>'\n\t\t\t+ ' <div class=\"doom-detail-badges\">'\n\t\t\t+ ' <span class=\"doom-badge ' + tmpStatusClass + '\">' + \\(tmpEvent.Status || 'Pending'\\) + '</span>'\n\t\t\t+ ' <span class=\"doom-badge doom-badge-default\">' + \\(tmpEvent.EventType || 'Event'\\) + '</span>'\n\t\t\t+ ' ' + tmpIsHoliday + tmpIsAllDay\n\t\t\t+ ' </div>'\n\t\t\t+ ' </div>'\n\t\t\t+ ' <div class=\"doom-detail-body\">'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Start:</strong> ' + tmpPictApp.formatDate\\(tmpEvent.EventDate\\) + ' ' + tmpPictApp.formatTime\\(tmpEvent.EventDate\\) + '</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>End:</strong> ' + tmpPictApp.formatDate\\(tmpEvent.EventEndDate\\) + ' ' + tmpPictApp.formatTime\\(tmpEvent.EventEndDate\\) + '</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Duration:</strong> ' + \\(tmpEvent.DurationHours || 0\\) + ' hours of doom</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Location:</strong> ' + \\(tmpEvent.Location || 'The Void'\\) + '</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Description:</strong><br/>' + \\(tmpEvent.Description || 'No description provided. The event speaks for itself.'\\) + '</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Notes:</strong><br/>' + \\(tmpEvent.Notes || '—'\\) + '</div>'\n\t\t\t+ ' <div class=\"doom-detail-row\"><strong>Link:</strong> ' + \\(tmpLink || '—'\\) + '</div>'\n\t\t\t+ ' </div>'\n\t\t\t+ ' <div class=\"doom-detail-actions\">'\n\t\t\t+ ' <button class=\"doom-btn doom-btn-primary\" onclick=\"Pict.PictApplication.editEvent\\(' + tmpEvent.IDEvent + '\\)\">Reshape</button>'\n\t\t\t+ ' <button class=\"doom-btn doom-btn-success\" onclick=\"Pict.PictApplication.completeEvent\\(' + tmpEvent.IDEvent + '\\)\">Mark Complete</button>'\n\t\t\t+ ' <button class=\"doom-btn doom-btn-danger\" onclick=\"Pict.PictApplication.deleteEvent\\(' + tmpEvent.IDEvent + '\\)\">Obliterate</button>'\n\t\t\t+ ' <button class=\"doom-btn doom-btn-muted\" onclick=\"Pict.PictApplication.showCalendarView\\(Pict.AppData.CalendarOfDoom.ActiveView\\)\">Back</button>'\n\t\t\t+ ' </div>'\n\t\t\t+ '</div>';\n\n\t\tlet tmpContainer = document.getElementById\\('doom-event-detail'\\);\n\t\tif \\(tmpContainer\\)\n\t\t{\n\t\t\ttmpContainer.innerHTML = tmpHTML;\n\t\t}\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewEventDetail;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
130
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/calendar/View-WeekView.cjs << 'ENDOFFILE'\n/**\n * View-WeekView — Seven days of doom, one row at a time\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-WeekView',\n\tDefaultRenderable: 'CalendarOfDoom-WeekView-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-WeekView-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-calendar-panel\">\n\t<div class=\"doom-cal-header\">\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(-1,'week'\\)\">← Prev</button>\n\t\t<h2 class=\"doom-cal-title\" id=\"doom-week-title\"></h2>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(1,'week'\\)\">Next →</button>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-accent\" onclick=\"{~P~}.PictApplication.calendarToday\\(\\)\">Today</button>\n\t</div>\n\t<table class=\"doom-table\">\n\t\t<thead><tr>\n\t\t\t<th class=\"doom-th\">Day</th>\n\t\t\t<th class=\"doom-th\">Date</th>\n\t\t\t<th class=\"doom-th\">Events</th>\n\t\t\t<th class=\"doom-th\">#</th>\n\t\t</tr></thead>\n\t\t<tbody id=\"doom-week-tbody\"></tbody>\n\t</table>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-WeekView-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-WeekView-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewWeekView extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\t\tlet tmpAnchor = new Date\\(tmpApp.CalendarState.AnchorDate + 'T12:00:00'\\);\n\t\tlet tmpToday = new Date\\(\\);\n\t\tlet tmpTodayStr = tmpToday.getFullYear\\(\\) + '-' + String\\(tmpToday.getMonth\\(\\) + 1\\).padStart\\(2, '0'\\) + '-' + String\\(tmpToday.getDate\\(\\)\\).padStart\\(2, '0'\\);\n\n\t\tlet tmpEventMap = {};\n\t\tlet tmpAllEvents = tmpApp.AllEvents || [];\n\t\tfor \\(let i = 0; i < tmpAllEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpAllEvents[i];\n\t\t\tif \\(!tmpE.EventDate\\) { continue; }\n\t\t\tlet tmpDateStr = tmpE.EventDate.split\\('T'\\)[0];\n\t\t\tif \\(!tmpEventMap[tmpDateStr]\\) { tmpEventMap[tmpDateStr] = []; }\n\t\t\ttmpEventMap[tmpDateStr].push\\(tmpE\\);\n\t\t}\n\n\t\t// Find Monday of this week\n\t\tlet tmpMonday = new Date\\(tmpAnchor\\);\n\t\tlet tmpDow = tmpMonday.getDay\\(\\);\n\t\tlet tmpOffset = \\(tmpDow === 0\\) ? -6 : \\(1 - tmpDow\\);\n\t\ttmpMonday.setDate\\(tmpMonday.getDate\\(\\) + tmpOffset\\);\n\n\t\tlet tmpSunday = new Date\\(tmpMonday\\);\n\t\ttmpSunday.setDate\\(tmpSunday.getDate\\(\\) + 6\\);\n\n\t\tlet tmpWeekLabel = tmpPictApp.formatDate\\(tmpMonday.toISOString\\(\\)\\) + ' — ' + tmpPictApp.formatDate\\(tmpSunday.toISOString\\(\\)\\);\n\n\t\tlet tmpTitleEl = document.getElementById\\('doom-week-title'\\);\n\t\tif \\(tmpTitleEl\\) { tmpTitleEl.textContent = tmpWeekLabel; }\n\n\t\tlet tmpRows = '';\n\t\tlet tmpDay = new Date\\(tmpMonday\\);\n\t\tfor \\(let d = 0; d < 7; d++\\)\n\t\t{\n\t\t\tlet tmpDateStr = tmpDay.getFullYear\\(\\) + '-' + String\\(tmpDay.getMonth\\(\\) + 1\\).padStart\\(2, '0'\\) + '-' + String\\(tmpDay.getDate\\(\\)\\).padStart\\(2, '0'\\);\n\t\t\tlet tmpEvents = tmpEventMap[tmpDateStr] || [];\n\t\t\tlet tmpIsToday = \\(tmpDateStr === tmpTodayStr\\);\n\t\t\tlet tmpRowClass = tmpIsToday ? 'doom-tr doom-row-today' : 'doom-tr';\n\t\t\tlet tmpDayName = tmpApp.DayNames[tmpDay.getDay\\(\\)];\n\t\t\tlet tmpDayJP = tmpApp.DayNamesJP[tmpDay.getDay\\(\\)];\n\n\t\t\tlet tmpEventList = '';\n\t\t\tfor \\(let e = 0; e < tmpEvents.length; e++\\)\n\t\t\t{\n\t\t\t\tlet tmpEvt = tmpEvents[e];\n\t\t\t\tlet tmpBadge = \\(tmpEvt.Status === 'Complete'\\) ? 'doom-badge-success' : 'doom-badge-default';\n\t\t\t\ttmpEventList += '<div class=\"doom-week-event\" onclick=\"Pict.PictApplication.viewEvent\\(' + tmpEvt.IDEvent + '\\)\">'\n\t\t\t\t\t+ '<span class=\"doom-badge ' + tmpBadge + ' doom-badge-sm\">' + \\(tmpEvt.Status || ''\\) + '</span> '\n\t\t\t\t\t+ \\(tmpEvt.Title || ''\\) + ' '\n\t\t\t\t\t+ '<span class=\"doom-muted-text\">' + tmpPictApp.formatTime\\(tmpEvt.EventDate\\) + '</span>'\n\t\t\t\t\t+ '</div>';\n\t\t\t}\n\n\t\t\tif \\(tmpEvents.length === 0\\)\n\t\t\t{\n\t\t\t\ttmpEventList = '<span class=\"doom-muted-text\">The void is silent</span>';\n\t\t\t}\n\n\t\t\ttmpRows += '<tr class=\"' + tmpRowClass + '\">'\n\t\t\t\t+ '<td class=\"doom-td doom-td-day\">' + tmpDayName + ' <span class=\"doom-jp-small\">' + tmpDayJP + '</span></td>'\n\t\t\t\t+ '<td class=\"doom-td doom-td-date\">' + tmpPictApp.formatDate\\(tmpDay.toISOString\\(\\)\\) + '</td>'\n\t\t\t\t+ '<td class=\"doom-td\">' + tmpEventList + '</td>'\n\t\t\t\t+ '<td class=\"doom-td doom-td-count\">' + tmpEvents.length + '</td>'\n\t\t\t\t+ '</tr>';\n\n\t\t\ttmpDay.setDate\\(tmpDay.getDate\\(\\) + 1\\);\n\t\t}\n\n\t\tlet tmpTbody = document.getElementById\\('doom-week-tbody'\\);\n\t\tif \\(tmpTbody\\) { tmpTbody.innerHTML = tmpRows; }\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewWeekView;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
131
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/calendar/View-DayView.cjs << 'ENDOFFILE'\n/**\n * View-DayView — A single day of doom, hour by hour\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-DayView',\n\tDefaultRenderable: 'CalendarOfDoom-DayView-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-DayView-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-calendar-panel\">\n\t<div class=\"doom-cal-header\">\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(-1,'day'\\)\">← Prev</button>\n\t\t<h2 class=\"doom-cal-title\" id=\"doom-day-title\"></h2>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(1,'day'\\)\">Next →</button>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-accent\" onclick=\"{~P~}.PictApplication.calendarToday\\(\\)\">Today</button>\n\t</div>\n\t<div class=\"doom-day-events\" id=\"doom-day-events\"></div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-DayView-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-DayView-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewDayView extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\t\tlet tmpAnchor = new Date\\(tmpApp.CalendarState.AnchorDate + 'T12:00:00'\\);\n\t\tlet tmpDateStr = tmpAnchor.getFullYear\\(\\) + '-' + String\\(tmpAnchor.getMonth\\(\\) + 1\\).padStart\\(2, '0'\\) + '-' + String\\(tmpAnchor.getDate\\(\\)\\).padStart\\(2, '0'\\);\n\t\tlet tmpDayName = tmpApp.DayNames[tmpAnchor.getDay\\(\\)];\n\t\tlet tmpDayJP = tmpApp.DayNamesJP[tmpAnchor.getDay\\(\\)];\n\t\tlet tmpToday = new Date\\(\\);\n\t\tlet tmpTodayStr = tmpToday.getFullYear\\(\\) + '-' + String\\(tmpToday.getMonth\\(\\) + 1\\).padStart\\(2, '0'\\) + '-' + String\\(tmpToday.getDate\\(\\)\\).padStart\\(2, '0'\\);\n\t\tlet tmpIsToday = \\(tmpDateStr === tmpTodayStr\\);\n\n\t\t// Set title\n\t\tlet tmpTodayBadge = tmpIsToday ? ' <span class=\"doom-badge doom-badge-accent doom-badge-sm\">TODAY</span>' : '';\n\t\tlet tmpTitleEl = document.getElementById\\('doom-day-title'\\);\n\t\tif \\(tmpTitleEl\\)\n\t\t{\n\t\t\ttmpTitleEl.innerHTML = tmpDayName + ' <span class=\"doom-cal-jp\">' + tmpDayJP + '</span> — '\n\t\t\t\t+ tmpPictApp.formatDate\\(tmpAnchor.toISOString\\(\\)\\) + tmpTodayBadge;\n\t\t}\n\n\t\t// Find events for this day\n\t\tlet tmpDayEvents = [];\n\t\tlet tmpAllEvents = tmpApp.AllEvents || [];\n\t\tfor \\(let i = 0; i < tmpAllEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpAllEvents[i];\n\t\t\tif \\(!tmpE.EventDate\\) { continue; }\n\t\t\tif \\(tmpE.EventDate.split\\('T'\\)[0] === tmpDateStr\\)\n\t\t\t{\n\t\t\t\ttmpDayEvents.push\\(tmpE\\);\n\t\t\t}\n\t\t}\n\n\t\ttmpDayEvents.sort\\(function\\(a, b\\) { return \\(a.EventDate || ''\\).localeCompare\\(b.EventDate || ''\\); }\\);\n\n\t\tlet tmpEventCards = '';\n\t\tfor \\(let i = 0; i < tmpDayEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpDayEvents[i];\n\t\t\tlet tmpStatusClass = \\(tmpE.Status === 'Complete'\\) ? 'doom-badge-success' : 'doom-badge-default';\n\t\t\tlet tmpTime = tmpPictApp.formatTime\\(tmpE.EventDate\\);\n\t\t\tlet tmpEndTime = tmpPictApp.formatTime\\(tmpE.EventEndDate\\);\n\n\t\t\ttmpEventCards += ''\n\t\t\t\t+ '<div class=\"doom-day-event-card\" onclick=\"Pict.PictApplication.viewEvent\\(' + tmpE.IDEvent + '\\)\">'\n\t\t\t\t+ ' <div class=\"doom-day-event-time\">' + tmpTime + \\(tmpEndTime ? ' — ' + tmpEndTime : ''\\) + '</div>'\n\t\t\t\t+ ' <div class=\"doom-day-event-title\">' + \\(tmpE.Title || ''\\) + '</div>'\n\t\t\t\t+ ' <div class=\"doom-day-event-meta\">'\n\t\t\t\t+ ' <span class=\"doom-badge ' + tmpStatusClass + ' doom-badge-sm\">' + \\(tmpE.Status || 'Pending'\\) + '</span>'\n\t\t\t\t+ ' <span class=\"doom-muted-text\">' + \\(tmpE.Location || ''\\) + '</span>'\n\t\t\t\t+ ' </div>'\n\t\t\t\t+ ' <div class=\"doom-day-event-desc\">' + \\(tmpE.Description || ''\\).substring\\(0, 120\\) + '</div>'\n\t\t\t\t+ '</div>';\n\t\t}\n\n\t\tif \\(tmpDayEvents.length === 0\\)\n\t\t{\n\t\t\ttmpEventCards = '<div class=\"doom-empty-state\">No events haunt this day. The void is peaceful... for now.</div>';\n\t\t}\n\n\t\tlet tmpEventsEl = document.getElementById\\('doom-day-events'\\);\n\t\tif \\(tmpEventsEl\\) { tmpEventsEl.innerHTML = tmpEventCards; }\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewDayView;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
132
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/calendar/View-YearView.cjs << 'ENDOFFILE'\n/**\n * View-YearView — 12 months of impending doom at a glance\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-YearView',\n\tDefaultRenderable: 'CalendarOfDoom-YearView-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-YearView-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-calendar-panel\">\n\t<div class=\"doom-cal-header\">\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(-1,'year'\\)\">← Prev</button>\n\t\t<h2 class=\"doom-cal-title\" id=\"doom-year-title\"></h2>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(1,'year'\\)\">Next →</button>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-accent\" onclick=\"{~P~}.PictApplication.calendarToday\\(\\)\">Today</button>\n\t</div>\n\t<div id=\"doom-year-grid\" class=\"doom-year-grid\"></div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-YearView-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-YearView-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewYearView extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpAnchor = new Date\\(tmpApp.CalendarState.AnchorDate + 'T12:00:00'\\);\n\t\tlet tmpYear = tmpAnchor.getFullYear\\(\\);\n\t\tlet tmpToday = new Date\\(\\);\n\t\tlet tmpCurrentMonth = tmpToday.getMonth\\(\\);\n\t\tlet tmpCurrentYear = tmpToday.getFullYear\\(\\);\n\n\t\t// Set title\n\t\tlet tmpTitleEl = document.getElementById\\('doom-year-title'\\);\n\t\tif \\(tmpTitleEl\\)\n\t\t{\n\t\t\ttmpTitleEl.innerHTML = tmpYear + ' <span class=\"doom-cal-jp\">' + tmpYear + '年</span>';\n\t\t}\n\n\t\tlet tmpMonthCounts = {};\n\t\tlet tmpAllEvents = tmpApp.AllEvents || [];\n\t\tfor \\(let i = 0; i < tmpAllEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpAllEvents[i];\n\t\t\tif \\(!tmpE.EventDate\\) { continue; }\n\t\t\tlet tmpD = new Date\\(tmpE.EventDate\\);\n\t\t\tif \\(tmpD.getFullYear\\(\\) !== tmpYear\\) { continue; }\n\t\t\tlet tmpM = tmpD.getMonth\\(\\);\n\t\t\tif \\(!tmpMonthCounts[tmpM]\\) { tmpMonthCounts[tmpM] = { total: 0, complete: 0, open: 0 }; }\n\t\t\ttmpMonthCounts[tmpM].total++;\n\t\t\tif \\(tmpE.Status === 'Complete'\\) { tmpMonthCounts[tmpM].complete++; }\n\t\t\telse { tmpMonthCounts[tmpM].open++; }\n\t\t}\n\n\t\tlet tmpGrid = document.getElementById\\('doom-year-grid'\\);\n\t\tif \\(!tmpGrid\\) { return super.onAfterRender\\(\\); }\n\n\t\tlet tmpHTML = '';\n\t\tfor \\(let m = 0; m < 12; m++\\)\n\t\t{\n\t\t\tlet tmpCounts = tmpMonthCounts[m] || { total: 0, complete: 0, open: 0 };\n\t\t\tlet tmpIsCurrent = \\(tmpYear === tmpCurrentYear && m === tmpCurrentMonth\\);\n\t\t\tlet tmpCardClass = tmpIsCurrent ? 'doom-year-card doom-year-card-current' : 'doom-year-card';\n\n\t\t\ttmpHTML += '<div class=\"' + tmpCardClass + '\" onclick=\"Pict.AppData.CalendarOfDoom.CalendarState.AnchorDate=\\\\'' + tmpYear + '-' + String\\(m + 1\\).padStart\\(2, '0'\\) + '-01\\\\';Pict.PictApplication.showCalendarView\\(\\\\'CalendarOfDoom-MonthView\\\\'\\)\">'\n\t\t\t\t+ '<div class=\"doom-year-card-title\">' + tmpApp.MonthNames[m] + '</div>'\n\t\t\t\t+ '<div class=\"doom-year-card-stats\">'\n\t\t\t\t+ ' <span class=\"doom-badge doom-badge-default doom-badge-sm\">' + tmpCounts.total + ' events</span>'\n\t\t\t\t+ ' <span class=\"doom-badge doom-badge-success doom-badge-sm\">' + tmpCounts.complete + ' done</span>'\n\t\t\t\t+ ' <span class=\"doom-badge doom-badge-danger doom-badge-sm\">' + tmpCounts.open + ' open</span>'\n\t\t\t\t+ '</div>'\n\t\t\t\t+ '</div>';\n\t\t}\n\n\t\ttmpGrid.innerHTML = tmpHTML;\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewYearView;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
133
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/calendar/View-DecadeView.cjs << 'ENDOFFILE'\n/**\n * View-DecadeView — Ten years of doom. Long range planning for the truly ambitious.\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-DecadeView',\n\tDefaultRenderable: 'CalendarOfDoom-DecadeView-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-DecadeView-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-calendar-panel\">\n\t<div class=\"doom-cal-header\">\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(-1,'decade'\\)\">← Prev</button>\n\t\t<h2 class=\"doom-cal-title\" id=\"doom-decade-title\"></h2>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-secondary\" onclick=\"{~P~}.PictApplication.calendarNavigate\\(1,'decade'\\)\">Next →</button>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-accent\" onclick=\"{~P~}.PictApplication.calendarToday\\(\\)\">Today</button>\n\t</div>\n\t<div class=\"doom-decade-grid\" id=\"doom-decade-grid\"></div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-DecadeView-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-DecadeView-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewDecadeView extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpAnchor = new Date\\(tmpApp.CalendarState.AnchorDate + 'T12:00:00'\\);\n\t\tlet tmpYear = tmpAnchor.getFullYear\\(\\);\n\t\tlet tmpDecadeStart = tmpYear - \\(tmpYear % 10\\);\n\t\tlet tmpDecadeEnd = tmpDecadeStart + 9;\n\t\tlet tmpCurrentYear = new Date\\(\\).getFullYear\\(\\);\n\n\t\t// Set title\n\t\tlet tmpTitleEl = document.getElementById\\('doom-decade-title'\\);\n\t\tif \\(tmpTitleEl\\)\n\t\t{\n\t\t\ttmpTitleEl.innerHTML = tmpDecadeStart + ' — ' + tmpDecadeEnd + ' <span class=\"doom-cal-jp\">十年</span>';\n\t\t}\n\n\t\tlet tmpYearCounts = {};\n\t\tlet tmpAllEvents = tmpApp.AllEvents || [];\n\t\tfor \\(let i = 0; i < tmpAllEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpAllEvents[i];\n\t\t\tif \\(!tmpE.EventDate\\) { continue; }\n\t\t\tlet tmpY = new Date\\(tmpE.EventDate\\).getFullYear\\(\\);\n\t\t\tif \\(tmpY < tmpDecadeStart || tmpY > tmpDecadeEnd\\) { continue; }\n\t\t\tif \\(!tmpYearCounts[tmpY]\\) { tmpYearCounts[tmpY] = { total: 0, complete: 0, open: 0 }; }\n\t\t\ttmpYearCounts[tmpY].total++;\n\t\t\tif \\(tmpE.Status === 'Complete'\\) { tmpYearCounts[tmpY].complete++; }\n\t\t\telse { tmpYearCounts[tmpY].open++; }\n\t\t}\n\n\t\tlet tmpGrid = document.getElementById\\('doom-decade-grid'\\);\n\t\tif \\(!tmpGrid\\) { return super.onAfterRender\\(\\); }\n\n\t\tlet tmpCards = '';\n\t\tfor \\(let y = tmpDecadeStart; y <= tmpDecadeEnd; y++\\)\n\t\t{\n\t\t\tlet tmpCounts = tmpYearCounts[y] || { total: 0, complete: 0, open: 0 };\n\t\t\tlet tmpIsCurrent = \\(y === tmpCurrentYear\\);\n\t\t\tlet tmpCardClass = tmpIsCurrent ? 'doom-decade-card doom-decade-card-current' : 'doom-decade-card';\n\n\t\t\ttmpCards += '<div class=\"' + tmpCardClass + '\" onclick=\"Pict.AppData.CalendarOfDoom.CalendarState.AnchorDate=\\\\'' + y + '-01-01\\\\';Pict.PictApplication.showCalendarView\\(\\\\'CalendarOfDoom-YearView\\\\'\\)\">'\n\t\t\t\t+ '<div class=\"doom-decade-year\">' + y + '</div>'\n\t\t\t\t+ '<div class=\"doom-decade-stats\">'\n\t\t\t\t+ \\(tmpCounts.total > 0 ? '<span class=\"doom-badge doom-badge-default doom-badge-sm\">' + tmpCounts.total + '</span>' : '<span class=\"doom-muted-text\">—</span>'\\)\n\t\t\t\t+ '</div>'\n\t\t\t\t+ '</div>';\n\t\t}\n\n\t\ttmpGrid.innerHTML = tmpCards;\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewDecadeView;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
134
+ "Bash(/Users/stevenvelozo/Code/retold/calendar/web-client/source/views/calendar/View-ContinuousView.cjs << 'ENDOFFILE'\n/**\n * View-ContinuousView — An infinite scroll of doom events, chronologically\n */\nconst libPictView = require\\('pict-view'\\);\n\nconst _ViewConfiguration =\n{\n\tViewIdentifier: 'CalendarOfDoom-ContinuousView',\n\tDefaultRenderable: 'CalendarOfDoom-ContinuousView-Content',\n\tDefaultDestinationAddress: '#Doom-Content',\n\tAutoRender: false,\n\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'CalendarOfDoom-ContinuousView-Template',\n\t\t\tTemplate: /*html*/`\n<div class=\"doom-panel doom-calendar-panel\">\n\t<div class=\"doom-cal-header\">\n\t\t<h2 class=\"doom-cal-title\">Continuous Stream <span class=\"doom-cal-jp\">連続</span></h2>\n\t\t<button class=\"doom-btn doom-btn-sm doom-btn-accent\" onclick=\"{~P~}.PictApplication.calendarToday\\(\\)\">Today</button>\n\t</div>\n\t<div class=\"doom-continuous-stream\" id=\"doom-continuous-stream\"></div>\n</div>\n`\n\t\t}\n\t],\n\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'CalendarOfDoom-ContinuousView-Content',\n\t\t\tTemplateHash: 'CalendarOfDoom-ContinuousView-Template',\n\t\t\tDestinationAddress: '#Doom-Content',\n\t\t\tRenderMethod: 'replace'\n\t\t}\n\t]\n};\n\nclass ViewContinuousView extends libPictView\n{\n\tconstructor\\(pFable, pOptions, pServiceHash\\)\n\t{\n\t\tsuper\\(pFable, pOptions, pServiceHash\\);\n\t}\n\n\tonAfterRender\\(\\)\n\t{\n\t\tlet tmpApp = this.pict.AppData.CalendarOfDoom;\n\t\tlet tmpPictApp = this.pict.PictApplication;\n\t\tlet tmpAllEvents = tmpApp.AllEvents || [];\n\t\tlet tmpToday = new Date\\(\\);\n\t\tlet tmpTodayStr = tmpToday.getFullYear\\(\\) + '-' + String\\(tmpToday.getMonth\\(\\) + 1\\).padStart\\(2, '0'\\) + '-' + String\\(tmpToday.getDate\\(\\)\\).padStart\\(2, '0'\\);\n\n\t\t// Group events by date\n\t\tlet tmpDateGroups = {};\n\t\tlet tmpDateOrder = [];\n\t\tfor \\(let i = 0; i < tmpAllEvents.length; i++\\)\n\t\t{\n\t\t\tlet tmpE = tmpAllEvents[i];\n\t\t\tif \\(!tmpE.EventDate\\) { continue; }\n\t\t\tlet tmpDateStr = tmpE.EventDate.split\\('T'\\)[0];\n\t\t\tif \\(!tmpDateGroups[tmpDateStr]\\)\n\t\t\t{\n\t\t\t\ttmpDateGroups[tmpDateStr] = [];\n\t\t\t\ttmpDateOrder.push\\(tmpDateStr\\);\n\t\t\t}\n\t\t\ttmpDateGroups[tmpDateStr].push\\(tmpE\\);\n\t\t}\n\n\t\ttmpDateOrder.sort\\(\\);\n\n\t\tlet tmpContent = '';\n\t\tfor \\(let d = 0; d < tmpDateOrder.length; d++\\)\n\t\t{\n\t\t\tlet tmpDateStr = tmpDateOrder[d];\n\t\t\tlet tmpEvents = tmpDateGroups[tmpDateStr];\n\t\t\tlet tmpIsToday = \\(tmpDateStr === tmpTodayStr\\);\n\t\t\tlet tmpDateLabel = tmpPictApp.formatDate\\(tmpDateStr + 'T12:00:00'\\);\n\t\t\tlet tmpDayOfWeek = tmpApp.DayNames[new Date\\(tmpDateStr + 'T12:00:00'\\).getDay\\(\\)];\n\t\t\tlet tmpDayJP = tmpApp.DayNamesJP[new Date\\(tmpDateStr + 'T12:00:00'\\).getDay\\(\\)];\n\n\t\t\tlet tmpGroupClass = tmpIsToday ? 'doom-continuous-group doom-continuous-today' : 'doom-continuous-group';\n\t\t\tlet tmpTodayBadge = tmpIsToday ? ' <span class=\"doom-badge doom-badge-accent doom-badge-sm\">TODAY</span>' : '';\n\n\t\t\ttmpContent += '<div class=\"' + tmpGroupClass + '\" id=\"doom-date-' + tmpDateStr + '\">';\n\t\t\ttmpContent += '<div class=\"doom-continuous-date\">' + tmpDayOfWeek + ' <span class=\"doom-cal-jp\">' + tmpDayJP + '</span> — ' + tmpDateLabel + tmpTodayBadge + '</div>';\n\n\t\t\tfor \\(let e = 0; e < tmpEvents.length; e++\\)\n\t\t\t{\n\t\t\t\tlet tmpE = tmpEvents[e];\n\t\t\t\tlet tmpStatusClass = \\(tmpE.Status === 'Complete'\\) ? 'doom-badge-success' : 'doom-badge-default';\n\t\t\t\tlet tmpTime = tmpPictApp.formatTime\\(tmpE.EventDate\\);\n\n\t\t\t\ttmpContent += '<div class=\"doom-continuous-event\" onclick=\"Pict.PictApplication.viewEvent\\(' + tmpE.IDEvent + '\\)\">'\n\t\t\t\t\t+ '<span class=\"doom-continuous-time\">' + tmpTime + '</span>'\n\t\t\t\t\t+ '<span class=\"doom-continuous-title\">' + \\(tmpE.Title || ''\\) + '</span>'\n\t\t\t\t\t+ '<span class=\"doom-badge ' + tmpStatusClass + ' doom-badge-sm\">' + \\(tmpE.Status || 'Pending'\\) + '</span>'\n\t\t\t\t\t+ '</div>';\n\t\t\t}\n\n\t\t\ttmpContent += '</div>';\n\t\t}\n\n\t\tif \\(tmpDateOrder.length === 0\\)\n\t\t{\n\t\t\ttmpContent = '<div class=\"doom-empty-state\">The timeline is empty. No events exist in any dimension.</div>';\n\t\t}\n\n\t\tlet tmpStream = document.getElementById\\('doom-continuous-stream'\\);\n\t\tif \\(tmpStream\\) { tmpStream.innerHTML = tmpContent; }\n\n\t\t// Scroll to today if it exists\n\t\tlet tmpEl = document.getElementById\\('doom-date-' + tmpTodayStr\\);\n\t\tif \\(tmpEl\\)\n\t\t{\n\t\t\ttmpEl.scrollIntoView\\({ behavior: 'smooth', block: 'start' }\\);\n\t\t}\n\n\t\treturn super.onAfterRender\\(\\);\n\t}\n}\n\nmodule.exports = ViewContinuousView;\nmodule.exports.default_configuration = _ViewConfiguration;\nENDOFFILE)",
135
+ "Bash(git status:*)",
136
+ "Bash(git -C /Users/stevenvelozo/Code/retold log --oneline -20)",
137
+ "Bash(git -C /Users/stevenvelozo/Code/retold diff modules/Include-Retold-Module-List.sh)",
138
+ "Bash(git -C /Users/stevenvelozo/Code/retold log -p modules/Include-Retold-Module-List.sh)",
139
+ "WebFetch(domain:bundlephobia.com)",
140
+ "Bash(node source/Quackage-Run.js:*)",
141
+ "Bash(for dir in /Users/stevenvelozo/Code/retold/modules/pict/pict-section-*)",
142
+ "Bash(do)",
143
+ "Bash([ -f \"$dir/README.md\" ])",
144
+ "Bash(node /Users/stevenvelozo/Code/retold/modules/pict/pict-section-markdowneditor/example_applications/markdown_editor/build-codemirror-bundle.js:*)",
145
+ "Bash(npx quack build)",
146
+ "Bash(node build-codemirror-bundle.js:*)",
147
+ "Bash(xxd:*)",
148
+ "Bash(node source/bin/browse.js:*)",
149
+ "Bash(python3 -c:*)",
150
+ "Bash(timeout 3 node:*)",
151
+ "Bash(npx quack copy)",
152
+ "Bash(node source/cli/ContentSystem-CLI-Run.js:*)",
153
+ "Bash(timeout 5 npm start:*)",
154
+ "Bash(node build-codejar-bundle.js:*)",
155
+ "Bash(npm run build-all:*)",
156
+ "Bash(npx:*)",
157
+ "Bash(RETOLD_HASHED_FILENAMES=true node:*)",
158
+ "Bash(magick:*)",
159
+ "Bash(ffprobe:*)",
160
+ "Bash(ffmpeg:*)",
161
+ "mcp__Claude_Preview__preview_start",
162
+ "Bash(/Users/stevenvelozo/Code/retold/modules/utility/quackage/source/Quackage-CLIProgram.js coverage)",
163
+ "Bash(then)",
164
+ "Bash(fi)",
165
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/fable/fable-operationstep log --oneline -3)",
166
+ "Bash(changed_dirs=\"$changed_dirs $dir\")",
167
+ "Bash(ncu)",
168
+ "Bash(npm publish)",
169
+ "Bash(source ./Include-Retold-Module-List.sh)",
170
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/pict/pict-section-formeditor diff --stat)",
171
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/utility/quackage diff --stat)",
172
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/apps/retold-content-system diff --stat)",
173
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/meadow/retold-harness diff --stat)",
174
+ "Bash(git -C /Users/stevenvelozo/Code/retold diff --stat -- package.json)",
175
+ "Bash(git -C /Users/stevenvelozo/Code/retold/modules/apps/retold-remote diff --stat)"
118
176
  ]
119
177
  }
120
178
  }
package/CLAUDE.md CHANGED
@@ -4,13 +4,14 @@ A suite of ~50 JavaScript/Node.js modules for building web applications and APIs
4
4
 
5
5
  ## Architecture
6
6
 
7
- Five module groups, each in `modules/<group>/`:
7
+ Six module groups, each in `modules/<group>/`:
8
8
 
9
9
  - **Fable** — Core ecosystem: dependency injection (service provider pattern), configuration, logging, UUID generation, expression parser, REST client, template engine
10
10
  - **Meadow** — Data access layer: ORM, query DSL (FoxHound), schema definitions (Stricture), DB connectors (MySQL, MSSQL, SQLite), RESTful endpoint generation
11
11
  - **Orator** — API server: Restify wrapper, static file serving, HTTP proxy, WebSocket support (Tidings)
12
12
  - **Pict** — MVC tools: views, templates, providers, application lifecycle, form builders, TUI grid, CLI utilities
13
13
  - **Utility** — Build tools (Quackage), manifest management (Manyfest), documentation (Indoctrinate), process supervision (Ultravisor)
14
+ - **Apps** — Full-stack applications: content management (retold-content-system), remote access (retold-remote)
14
15
 
15
16
  ## Repository Structure
16
17
 
@@ -25,7 +26,8 @@ retold/
25
26
  │ ├── meadow/ # 13 modules
26
27
  │ ├── orator/ # 6 modules
27
28
  │ ├── pict/ # 15 modules
28
- └── utility/ # 10+ modules
29
+ ├── utility/ # 10+ modules
30
+ │ └── apps/ # 2 applications
29
31
  ```
30
32
 
31
33
  ## Code Style
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > A story-obsessed application suite.
4
4
 
5
- Retold is a collection of ~50 JavaScript/Node.js modules for building web applications and APIs. The modules span five groups — from core dependency injection up through data access, API serving, and full MVC — all designed to compose together through a shared service provider pattern. Plain JavaScript, no TypeScript. MIT licensed.
5
+ Retold is a collection of ~50 JavaScript/Node.js modules for building web applications and APIs. The modules span six groups — from core dependency injection up through data access, API serving, full MVC, and complete applications — all designed to compose together through a shared service provider pattern. Plain JavaScript, no TypeScript. MIT licensed.
6
6
 
7
7
  ## Module Groups
8
8
 
@@ -13,6 +13,7 @@ Retold is a collection of ~50 JavaScript/Node.js modules for building web applic
13
13
  | **Orator** | API server: HTTP server abstraction over Restify, static file serving, reverse proxy, WebSocket reporting |
14
14
  | **Pict** | MVC tools: views, templates, providers, application lifecycle — for browser, terminal, or any text-based UI |
15
15
  | **Utility** | Build tools (Quackage), manifest management (Manyfest), documentation generation (Indoctrinate), process supervision (Ultravisor) |
16
+ | **Apps** | Full-stack applications built on Retold: content management (retold-content-system), remote access (retold-remote) |
16
17
 
17
18
  ## The Service Provider Pattern
18
19
 
@@ -95,7 +96,8 @@ retold/
95
96
  ├── meadow/ # Data access (~13 modules)
96
97
  ├── orator/ # API server (~7 modules)
97
98
  ├── pict/ # MVC tools (~15 modules)
98
- └── utility/ # Build & docs (~10 modules)
99
+ ├── utility/ # Build & docs (~10 modules)
100
+ └── apps/ # Applications (~2 apps)
99
101
  ```
100
102
 
101
103
  ## Documentation