plutonium 0.51.0 → 0.52.0

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium-app/SKILL.md +2 -0
  3. data/.claude/skills/plutonium-auth/SKILL.md +6 -4
  4. data/.claude/skills/plutonium-behavior/SKILL.md +1 -1
  5. data/.claude/skills/plutonium-tenancy/SKILL.md +25 -6
  6. data/.claude/skills/plutonium-testing/SKILL.md +3 -1
  7. data/.claude/skills/plutonium-ui/SKILL.md +3 -3
  8. data/CHANGELOG.md +17 -0
  9. data/app/assets/plutonium.css +1 -1
  10. data/app/assets/plutonium.js +1 -0
  11. data/app/assets/plutonium.js.map +3 -3
  12. data/app/assets/plutonium.min.js +1 -1
  13. data/app/assets/plutonium.min.js.map +3 -3
  14. data/docs/.vitepress/config.ts +1 -2
  15. data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +53 -0
  16. data/docs/.vitepress/theme/components/HomeCta.vue +108 -0
  17. data/docs/.vitepress/theme/components/HomeHero.vue +70 -0
  18. data/docs/.vitepress/theme/components/HomeInTheBox.vue +74 -0
  19. data/docs/.vitepress/theme/components/HomePillars.vue +42 -0
  20. data/docs/.vitepress/theme/components/HomeStopWriting.vue +49 -0
  21. data/docs/.vitepress/theme/components/HomeWalkthrough.vue +111 -0
  22. data/docs/.vitepress/theme/components/SectionLanding.vue +115 -0
  23. data/docs/.vitepress/theme/custom.css +144 -0
  24. data/docs/.vitepress/theme/index.ts +58 -1
  25. data/docs/getting-started/index.md +33 -50
  26. data/docs/getting-started/tutorial/02-first-resource.md +17 -8
  27. data/docs/getting-started/tutorial/03-authentication.md +31 -23
  28. data/docs/getting-started/tutorial/05-custom-actions.md +9 -4
  29. data/docs/getting-started/tutorial/06-nested-resources.md +7 -1
  30. data/docs/getting-started/tutorial/07-author-portal.md +8 -0
  31. data/docs/getting-started/tutorial/08-customizing-ui.md +4 -0
  32. data/docs/guides/authentication.md +10 -5
  33. data/docs/guides/authorization.md +3 -3
  34. data/docs/guides/creating-packages.md +8 -11
  35. data/docs/guides/custom-actions.md +6 -1
  36. data/docs/guides/customizing-ui.md +258 -0
  37. data/docs/guides/index.md +49 -32
  38. data/docs/guides/multi-tenancy.md +10 -2
  39. data/docs/guides/nested-resources.md +69 -0
  40. data/docs/guides/search-filtering.md +6 -0
  41. data/docs/guides/testing.md +5 -1
  42. data/docs/guides/theming.md +13 -0
  43. data/docs/guides/user-invites.md +10 -4
  44. data/docs/guides/user-profile.md +8 -0
  45. data/docs/index.md +10 -219
  46. data/docs/public/asciinema/home-scaffold.cast +305 -0
  47. data/docs/public/images/guides/custom-actions-bulk.png +0 -0
  48. data/docs/public/images/guides/multi-tenancy-dashboard.png +0 -0
  49. data/docs/public/images/guides/multi-tenancy-welcome.png +0 -0
  50. data/docs/public/images/guides/nested-inputs.png +0 -0
  51. data/docs/public/images/guides/nested-resources-tab.png +0 -0
  52. data/docs/public/images/guides/search-filtering-index.png +0 -0
  53. data/docs/public/images/guides/search-filtering-panel.png +0 -0
  54. data/docs/public/images/guides/theming-after.png +0 -0
  55. data/docs/public/images/guides/theming-before.png +0 -0
  56. data/docs/public/images/guides/user-invites-landing.png +0 -0
  57. data/docs/public/images/guides/user-profile-edit.png +0 -0
  58. data/docs/public/images/guides/user-profile-show.png +0 -0
  59. data/docs/public/images/home-index.png +0 -0
  60. data/docs/public/images/home-new.png +0 -0
  61. data/docs/public/images/home-show.png +0 -0
  62. data/docs/public/images/tutorial/02-empty-index.png +0 -0
  63. data/docs/public/images/tutorial/02-index-with-posts.png +0 -0
  64. data/docs/public/images/tutorial/02-new-form-modal.png +0 -0
  65. data/docs/public/images/tutorial/02-new-form.png +0 -0
  66. data/docs/public/images/tutorial/03-create-account.png +0 -0
  67. data/docs/public/images/tutorial/03-login.png +0 -0
  68. data/docs/public/images/tutorial/04-admin-index.png +0 -0
  69. data/docs/public/images/tutorial/05-actions-menu.png +0 -0
  70. data/docs/public/images/tutorial/05-row-actions.png +0 -0
  71. data/docs/public/images/tutorial/06-comments-tab.png +0 -0
  72. data/docs/public/images/tutorial/06-post-with-comments.png +0 -0
  73. data/docs/public/images/tutorial/07-author-dashboard.png +0 -0
  74. data/docs/public/images/tutorial/07-author-portal.png +0 -0
  75. data/docs/public/images/tutorial/08-customized-index.png +0 -0
  76. data/docs/reference/app/generators.md +4 -4
  77. data/docs/reference/auth/accounts.md +6 -7
  78. data/docs/reference/auth/index.md +1 -1
  79. data/docs/reference/behavior/policies.md +1 -1
  80. data/docs/reference/index.md +67 -55
  81. data/docs/reference/resource/definition.md +1 -1
  82. data/docs/reference/tenancy/entity-scoping.md +8 -1
  83. data/docs/reference/tenancy/index.md +1 -1
  84. data/docs/reference/tenancy/invites.md +12 -5
  85. data/docs/reference/ui/tables.md +8 -4
  86. data/docs/superpowers/plans/2026-05-15-public-pages-overhaul.md +1648 -0
  87. data/docs/superpowers/plans/2026-05-15-public-pages-overhaul.md.tasks.json +109 -0
  88. data/docs/superpowers/specs/2026-05-15-public-pages-overhaul-design.md +263 -0
  89. data/gemfiles/rails_7.gemfile.lock +1 -1
  90. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  91. data/gemfiles/rails_8.1.gemfile.lock +1 -1
  92. data/lib/generators/pu/core/assets/assets_generator.rb +10 -0
  93. data/lib/generators/pu/invites/install_generator.rb +44 -0
  94. data/lib/generators/pu/invites/templates/packages/invites/app/controllers/invites/user_invitations_controller.rb.tt +1 -0
  95. data/lib/generators/pu/profile/conn_generator.rb +2 -2
  96. data/lib/generators/pu/res/conn/conn_generator.rb +33 -6
  97. data/lib/generators/pu/res/model/templates/model.rb.tt +4 -0
  98. data/lib/generators/pu/rodauth/account_generator.rb +2 -1
  99. data/lib/generators/pu/rodauth/admin_generator.rb +0 -2
  100. data/lib/generators/pu/rodauth/migration_generator.rb +0 -2
  101. data/lib/generators/pu/rodauth/views_generator.rb +0 -2
  102. data/lib/generators/pu/saas/membership/USAGE +4 -1
  103. data/lib/generators/pu/saas/setup_generator.rb +16 -4
  104. data/lib/generators/pu/saas/welcome/templates/app/controllers/welcome_controller.rb.tt +1 -1
  105. data/lib/plutonium/helpers/turbo_helper.rb +19 -0
  106. data/lib/plutonium/resource/controllers/crud_actions.rb +4 -4
  107. data/lib/plutonium/resource/controllers/interactive_actions.rb +3 -3
  108. data/lib/plutonium/ui/component/methods.rb +1 -0
  109. data/lib/plutonium/ui/form/base.rb +17 -1
  110. data/lib/plutonium/ui/form/components/secure_association.rb +11 -6
  111. data/lib/plutonium/ui/form/interaction.rb +1 -1
  112. data/lib/plutonium/ui/form/theme.rb +1 -1
  113. data/lib/plutonium/ui/page/edit.rb +1 -1
  114. data/lib/plutonium/ui/page/new.rb +1 -1
  115. data/lib/plutonium/ui/table/components/filter_form.rb +12 -4
  116. data/lib/plutonium/version.rb +1 -1
  117. data/package.json +4 -1
  118. data/src/js/controllers/form_controller.js +5 -4
  119. data/yarn.lock +108 -1
  120. metadata +45 -3
data/docs/index.md CHANGED
@@ -1,228 +1,19 @@
1
1
  ---
2
- layout: home
3
- hero:
4
- name: Plutonium
5
- text: Ship Rails Apps 10x Faster
6
- tagline: Build production-ready Rails applications in minutes, not days. Convention-driven, fully customizable. Built for the AI era.
7
- image:
8
- src: /plutonium.png
9
- alt: Plutonium
10
- actions:
11
- - theme: brand
12
- text: Get Started →
13
- link: /getting-started/
14
- - theme: alt
15
- text: GitHub
16
- link: https://github.com/radioactive-labs/plutonium-core
2
+ layout: page
3
+ sidebar: false
4
+ aside: false
17
5
  ---
18
6
 
19
- <div class="landing-content">
7
+ <HomeHero />
20
8
 
21
- <section class="before-after">
22
- <h2>The Old Way vs The Plutonium Way</h2>
23
- <div class="comparison">
24
- <div class="before">
25
- <h3>Without Plutonium</h3>
26
- <div class="file-tree">
27
- <div class="file">app/controllers/posts_controller.rb</div>
28
- <div class="file">app/controllers/comments_controller.rb</div>
29
- <div class="file">app/views/posts/index.html.erb</div>
30
- <div class="file">app/views/posts/show.html.erb</div>
31
- <div class="file">app/views/posts/new.html.erb</div>
32
- <div class="file">app/views/posts/edit.html.erb</div>
33
- <div class="file">app/views/posts/_form.html.erb</div>
34
- <div class="file dim">...12 more files</div>
35
- </div>
36
- <div class="stats">
37
- <span>~200 lines</span>
38
- <span>30+ minutes</span>
39
- <span>No auth yet</span>
40
- </div>
41
- </div>
42
- <div class="arrow">→</div>
43
- <div class="after">
44
- <h3>With Plutonium</h3>
9
+ <HomeStopWriting />
45
10
 
46
- ```bash
47
- rails g pu:res:scaffold Post \
48
- title:string body:text
11
+ <HomePillars />
49
12
 
50
- rails g pu:res:conn Post \
51
- --dest=admin_portal
52
- ```
13
+ <HomeWalkthrough />
53
14
 
54
- <div class="stats success">
55
- <span>2 commands</span>
56
- <span>30 seconds</span>
57
- <span>Auth included</span>
58
- </div>
59
- </div>
60
- </div>
61
- </section>
15
+ <HomeAudienceSplit />
62
16
 
63
- <section class="ai-section">
64
- <h2>Built for the AI Era</h2>
65
- <p class="ai-intro">Plutonium is the first Rails framework designed from the ground up for AI-assisted development. Every pattern, every convention, every file structure is optimized for AI comprehension.</p>
17
+ <HomeInTheBox />
66
18
 
67
- <div class="ai-features">
68
- <div class="ai-feature">
69
- <div class="ai-icon">🧠</div>
70
- <h3>Claude Code Skills</h3>
71
- <p>Built-in skills teach AI assistants your app's patterns. Resources, policies, definitions, interactions — Claude understands them all.</p>
72
- </div>
73
- <div class="ai-feature">
74
- <div class="ai-icon">⚡</div>
75
- <h3>Predictable Patterns</h3>
76
- <p>Convention-heavy architecture means AI can accurately predict file locations, naming, and relationships. Less hallucination, more precision.</p>
77
- </div>
78
- <div class="ai-feature">
79
- <div class="ai-icon">🔄</div>
80
- <h3>Generate & Iterate</h3>
81
- <p>Tell Claude what you need. It generates the scaffold, policy, and definition. You refine. Ship in minutes what used to take hours.</p>
82
- </div>
83
- </div>
84
-
85
- <div class="ai-example">
86
- <div class="ai-prompt">
87
- <span class="prompt-label">You say:</span>
88
- <p>"Add a blog with posts and comments. Posts belong to users. Only authors can edit their posts. Add a publish action."</p>
89
- </div>
90
- <div class="ai-result">
91
- <span class="result-label">Claude generates:</span>
92
- <p>Model, migration, policy, definition, interaction, and connects it to your portal. Ready to customize.</p>
93
- </div>
94
- </div>
95
- </section>
96
-
97
- <section class="features-detailed">
98
- <h2>Everything You Need, Nothing You Don't</h2>
99
-
100
- <div class="feature-row">
101
- <div class="feature-text">
102
- <h3>Resources Are Your Foundation</h3>
103
- <p>Just ActiveRecord. Associations, scopes, validations you already know. No new ORM to learn.</p>
104
- </div>
105
- <div class="feature-code">
106
-
107
- ```ruby
108
- class Post < ApplicationRecord
109
- include Plutonium::Resource::Record
110
-
111
- belongs_to :author, class_name: "User"
112
- has_many :comments
113
-
114
- scope :published, -> { where.not(published_at: nil) }
115
- scope :drafts, -> { where(published_at: nil) }
116
- end
117
- ```
118
-
119
- </div>
120
- </div>
121
-
122
- <div class="feature-row reverse">
123
- <div class="feature-text">
124
- <h3>Definitions Control UI</h3>
125
- <p>Declare how fields render. Add search, filters, scopes. Custom actions. All in one place.</p>
126
- </div>
127
- <div class="feature-code">
128
-
129
- ```ruby
130
- class PostDefinition < ResourceDefinition
131
- input :body, as: :markdown
132
-
133
- search do |scope, query|
134
- scope.where("title ILIKE ?", "%#{query}%")
135
- end
136
-
137
- scope :published
138
- scope :drafts
139
-
140
- action :publish, interaction: PublishPost
141
- end
142
- ```
143
-
144
- </div>
145
- </div>
146
-
147
- <div class="feature-row">
148
- <div class="feature-text">
149
- <h3>Interactions Encapsulate Logic</h3>
150
- <p>Complex actions become simple classes. Validated inputs. Clear outcomes. Easy to test.</p>
151
- </div>
152
- <div class="feature-code">
153
-
154
- ```ruby
155
- class PublishPost < ResourceInteraction
156
- attribute :resource
157
- attribute :publish_at, :datetime
158
-
159
- def execute
160
- resource.published_at = publish_at
161
- if resource.save
162
- succeed(resource).with_message("Published!")
163
- else
164
- failed(resource.errors)
165
- end
166
- end
167
- end
168
- ```
169
-
170
- </div>
171
- </div>
172
-
173
- <div class="feature-row reverse">
174
- <div class="feature-text">
175
- <h3>Policies Control Access</h3>
176
- <p>Define who can do what. Attribute-level permissions. Automatic scoping. No more <code>if current_user.admin?</code> scattered everywhere.</p>
177
- </div>
178
- <div class="feature-code">
179
-
180
- ```ruby
181
- class PostPolicy < ResourcePolicy
182
- def update?
183
- record.author == user || user.admin?
184
- end
185
-
186
- def permitted_attributes_for_create
187
- %i[title body]
188
- end
189
- end
190
- ```
191
-
192
- </div>
193
- </div>
194
- </section>
195
-
196
- <section class="feature-grid">
197
- <div class="grid-item">
198
- <div class="icon">📦</div>
199
- <h3>Modular Packages</h3>
200
- <p>Split your app into Feature Packages and Portals. Each isolated, testable, and reusable.</p>
201
- </div>
202
- <div class="grid-item">
203
- <div class="icon">🔐</div>
204
- <h3>Auth Built In</h3>
205
- <p>Rodauth integration with login, registration, 2FA, and password reset. Ready in one command.</p>
206
- </div>
207
- <div class="grid-item">
208
- <div class="icon">🏢</div>
209
- <h3>Multi-Tenancy</h3>
210
- <p>Entity scoping works out of the box. Path-based or custom strategies. Data isolation guaranteed.</p>
211
- </div>
212
- <div class="grid-item">
213
- <div class="icon">🎨</div>
214
- <h3>Fully Customizable</h3>
215
- <p>Override any layer. Custom views with Phlex. Your CSS. No black boxes.</p>
216
- </div>
217
- </section>
218
-
219
- <section class="cta-section">
220
- <h2>Ready to Build Faster?</h2>
221
- <p>Get a complete admin interface running in under 5 minutes.</p>
222
- <div class="cta-buttons">
223
- <a href="./getting-started/" class="cta-primary">Get Started</a>
224
- <a href="./getting-started/tutorial/" class="cta-secondary">Follow the Tutorial</a>
225
- </div>
226
- </section>
227
-
228
- </div>
19
+ <HomeCta />
@@ -0,0 +1,305 @@
1
+ {"version": 2, "width": 113, "height": 39, "timestamp": 1779212205, "idle_time_limit": 2.0, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}, "title": "Plutonium scaffold"}
2
+ [1.192754, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
3
+ [1.193966, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo\u0007\u001b]1;..lutonium-demo\u0007"]
4
+ [1.197488, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo\u001b\\"]
5
+ [1.214029, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mplutonium-demo\u001b[00m \u001b[K"]
6
+ [1.214221, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
7
+ [2.128758, "o", "c"]
8
+ [2.129442, "o", "\bcd"]
9
+ [2.130133, "o", " b"]
10
+ [2.130577, "o", "l"]
11
+ [2.130969, "o", "o"]
12
+ [2.132341, "o", "g"]
13
+ [2.132549, "o", "\b\b\b\b\b\b\b\u001b[7mc\u001b[7md\u001b[7m \u001b[7mb\u001b[7ml\u001b[7mo\u001b[7mg\u001b[27m"]
14
+ [2.711151, "o", "\b\b\b\b\b\b\b\u001b[27mc\u001b[27md\u001b[27m \u001b[27mb\u001b[27ml\u001b[27mo\u001b[27mg"]
15
+ [2.717305, "o", "\b\b\b\b\b\b\b\u001b[32mc\u001b[32md\u001b[39m \u001b[4mb\u001b[4ml\u001b[4mo\u001b[4mg\u001b[24m"]
16
+ [2.717832, "o", "\u001b[?1l\u001b>"]
17
+ [2.718157, "o", "\u001b[?2004l"]
18
+ [2.720955, "o", "\r\r\n"]
19
+ [2.722326, "o", "\u001b]2;cd blog\u0007\u001b]1;cd\u0007"]
20
+ [2.733953, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
21
+ [2.734571, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo/blog\u0007\u001b]1;..ium-demo/blog\u0007"]
22
+ [2.736038, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo/blog\u001b\\"]
23
+ [2.745393, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[K"]
24
+ [2.745447, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
25
+ [2.773472, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[01;34mgit:(\u001b[31mmain\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"]
26
+ [6.557113, "o", "r"]
27
+ [6.558746, "o", "\bra"]
28
+ [6.559807, "o", "i"]
29
+ [6.56066, "o", "l"]
30
+ [6.561405, "o", "s"]
31
+ [6.562203, "o", " g"]
32
+ [6.563913, "o", " p"]
33
+ [6.564629, "o", "u"]
34
+ [6.565341, "o", ":"]
35
+ [6.565944, "o", "r"]
36
+ [6.566497, "o", "e"]
37
+ [6.567019, "o", "s"]
38
+ [6.567528, "o", ":"]
39
+ [6.568072, "o", "s"]
40
+ [6.568483, "o", "c"]
41
+ [6.568943, "o", "a"]
42
+ [6.569368, "o", "f"]
43
+ [6.569746, "o", "f"]
44
+ [6.570129, "o", "o"]
45
+ [6.570499, "o", "l"]
46
+ [6.570902, "o", "d"]
47
+ [6.571371, "o", " P"]
48
+ [6.571812, "o", "o"]
49
+ [6.572283, "o", "s"]
50
+ [6.572896, "o", "t"]
51
+ [6.573436, "o", " t"]
52
+ [6.574039, "o", "i"]
53
+ [6.574515, "o", "t"]
54
+ [6.57494, "o", "l"]
55
+ [6.575315, "o", "e"]
56
+ [6.575691, "o", ":"]
57
+ [6.576056, "o", "s"]
58
+ [6.576381, "o", "t"]
59
+ [6.576725, "o", "r"]
60
+ [6.577219, "o", "i"]
61
+ [6.577676, "o", "n"]
62
+ [6.57809, "o", "g"]
63
+ [6.57861, "o", " b"]
64
+ [6.579192, "o", "o"]
65
+ [6.579631, "o", "d"]
66
+ [6.580083, "o", "y"]
67
+ [6.580262, "o", ":"]
68
+ [6.580404, "o", "t"]
69
+ [6.580555, "o", "e"]
70
+ [6.580685, "o", "x"]
71
+ [6.580812, "o", "t"]
72
+ [6.580948, "o", " p"]
73
+ [6.581074, "o", "u"]
74
+ [6.581207, "o", "b"]
75
+ [6.581339, "o", "l"]
76
+ [6.581469, "o", "i"]
77
+ [6.581601, "o", "s"]
78
+ [6.581923, "o", "h"]
79
+ [6.582151, "o", "e"]
80
+ [6.582359, "o", "d"]
81
+ [6.582637, "o", "_"]
82
+ [6.583036, "o", "a"]
83
+ [6.583209, "o", "t"]
84
+ [6.583697, "o", ":"]
85
+ [6.583846, "o", "d"]
86
+ [6.584007, "o", "a"]
87
+ [6.584291, "o", "t"]
88
+ [6.584446, "o", "e"]
89
+ [6.584578, "o", "t"]
90
+ [6.584715, "o", "i"]
91
+ [6.584847, "o", "m"]
92
+ [6.584981, "o", "e"]
93
+ [6.585117, "o", " -"]
94
+ [6.585246, "o", "-"]
95
+ [6.585388, "o", "d"]
96
+ [6.585507, "o", "e"]
97
+ [6.585633, "o", "s"]
98
+ [6.58576, "o", "t"]
99
+ [6.58612, "o", "="]
100
+ [6.586251, "o", "m"]
101
+ [6.586382, "o", "a"]
102
+ [6.586509, "o", "i"]
103
+ [6.586676, "o", "n"]
104
+ [6.586782, "o", "_"]
105
+ [6.586903, "o", "a"]
106
+ [6.587061, "o", "p"]
107
+ [6.587208, "o", "p"]
108
+ [6.587382, "o", "\u001b[89D\u001b[7mr\u001b[7ma\u001b[7mi\u001b[7ml\u001b[7ms\u001b[7m \u001b[7mg\u001b[7m \u001b[7mp\u001b[7mu\u001b[7m:\u001b[7mr\u001b[7me\u001b[7ms\u001b[7m:\u001b[7ms\u001b[7mc\u001b[7ma\u001b[7mf\u001b[7mf\u001b[7mo\u001b[7ml\u001b[7md\u001b[7m \u001b[7mP\u001b[7mo\u001b[7ms\u001b[7mt\u001b[7m \u001b[7mt\u001b[7mi\u001b[7mt\u001b[7ml\u001b[7me\u001b[7m:\u001b[7ms\u001b[7mt\u001b[7mr\u001b[7mi\u001b[7mn\u001b[7mg\u001b[7m \u001b[7mb\u001b[7mo\u001b[7md\u001b[7my\u001b[7m:\u001b[7mt\u001b[7me\u001b[7mx\u001b[7mt\u001b[7m \u001b[7mp\u001b[7mu\u001b[7mb\u001b[7ml\u001b[7mi\u001b[7ms\u001b[7mh\u001b[7me\u001b[7md\u001b[7m_\u001b[7ma\u001b[7mt\u001b[7m:\u001b[7md\u001b[7ma\u001b[7mt\u001b[7me\u001b[7mt\u001b[7mi\u001b[7mm\u001b[7me\u001b[7m \u001b[7m-\u001b[7m-\u001b[7md\u001b[7me\u001b[7ms\u001b[7mt\u001b[7m=\u001b[7mm\u001b[7ma\u001b[7mi\u001b[7mn\u001b[7m_\u001b[7ma\u001b[7mp\u001b[7mp\u001b[27m\r\r\n\u001b[K"]
109
+ [6.943584, "o", "\u001b[A\u001b[21C\u001b[27mr\u001b[27ma\u001b[27mi\u001b[27ml\u001b[27ms\u001b[27m \u001b[27mg\u001b[27m \u001b[27mp\u001b[27mu\u001b[27m:\u001b[27mr\u001b[27me\u001b[27ms\u001b[27m:\u001b[27ms\u001b[27mc\u001b[27ma\u001b[27mf\u001b[27mf\u001b[27mo\u001b[27ml\u001b[27md\u001b[27m \u001b[27mP\u001b[27mo\u001b[27ms\u001b[27mt\u001b[27m \u001b[27mt\u001b[27mi\u001b[27mt\u001b[27ml\u001b[27me\u001b[27m:\u001b[27ms\u001b[27mt\u001b[27mr\u001b[27mi\u001b[27mn\u001b[27mg\u001b[27m \u001b[27mb\u001b[27mo\u001b[27md\u001b[27my\u001b[27m:\u001b[27mt\u001b[27me\u001b[27mx\u001b[27mt\u001b[27m \u001b[27mp\u001b[27mu\u001b[27mb\u001b[27ml\u001b[27mi\u001b[27ms\u001b[27mh\u001b[27me\u001b[27md\u001b[27m_\u001b[27ma\u001b[27mt\u001b[27m:\u001b[27md\u001b[27ma\u001b[27mt\u001b[27me\u001b[27mt\u001b[27mi\u001b[27mm\u001b[27me\u001b[27m \u001b[27m-\u001b[27m-\u001b[27md\u001b[27me\u001b[27ms\u001b[27mt\u001b[27m=\u001b[27mm\u001b[27ma\u001b[27mi\u001b[27mn\u001b[27m_\u001b[27ma\u001b[27mp\u001b[27mp\u001b[1B\r\u001b[K"]
110
+ [6.95506, "o", "\u001b[A\u001b[21C\u001b[32mr\u001b[32ma\u001b[32mi\u001b[32ml\u001b[32ms\u001b[39m\u001b[1B\r"]
111
+ [6.955463, "o", "\u001b[?1l\u001b>"]
112
+ [6.955611, "o", "\u001b[?2004l"]
113
+ [6.962369, "o", "\r\r\n"]
114
+ [6.963372, "o", "\u001b]2;_rails_command g pu:res:scaffold Post title:string body:text --dest=main_app\u0007\u001b]1;rails\u0007"]
115
+ [9.302854, "o", "=> [plutonium] starting reloader\r\n"]
116
+ [9.428731, "o", "\u001b[1m\u001b[32m create\u001b[0m /private/tmp/plutonium-demo/blog/app/models/post.rb\r\n"]
117
+ [9.429701, "o", "\u001b[1m\u001b[32m create\u001b[0m /private/tmp/plutonium-demo/blog/db/migrate/20260519173655_create_posts.rb\r\n"]
118
+ [9.430216, "o", "\u001b[1m\u001b[32m create\u001b[0m /private/tmp/plutonium-demo/blog/app/controllers/posts_controller.rb\r\n"]
119
+ [9.430594, "o", "\u001b[1m\u001b[32m create\u001b[0m /private/tmp/plutonium-demo/blog/app/policies/post_policy.rb\r\n"]
120
+ [9.431291, "o", "\u001b[1m\u001b[32m create\u001b[0m /private/tmp/plutonium-demo/blog/app/definitions/post_definition.rb\r\n"]
121
+ [9.447257, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
122
+ [9.448522, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo/blog\u0007\u001b]1;..ium-demo/blog\u0007"]
123
+ [9.450447, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo/blog\u001b\\"]
124
+ [9.466732, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[01;34mgit:(\u001b[31mmain\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"]
125
+ [9.466793, "o", "\u001b[?1h\u001b="]
126
+ [9.467347, "o", "\u001b[?2004h"]
127
+ [10.938701, "o", "r"]
128
+ [10.939356, "o", "\bra"]
129
+ [10.940116, "o", "i"]
130
+ [10.940876, "o", "l"]
131
+ [10.941536, "o", "s"]
132
+ [10.942374, "o", " g"]
133
+ [10.943062, "o", " p"]
134
+ [10.943572, "o", "u"]
135
+ [10.944362, "o", ":"]
136
+ [10.944963, "o", "p"]
137
+ [10.945345, "o", "k"]
138
+ [10.945733, "o", "g"]
139
+ [10.946229, "o", ":"]
140
+ [10.946614, "o", "p"]
141
+ [10.946963, "o", "o"]
142
+ [10.947314, "o", "r"]
143
+ [10.947651, "o", "t"]
144
+ [10.947982, "o", "a"]
145
+ [10.948315, "o", "l"]
146
+ [10.948661, "o", " a"]
147
+ [10.94897, "o", "d"]
148
+ [10.949263, "o", "m"]
149
+ [10.949569, "o", "i"]
150
+ [10.949901, "o", "n"]
151
+ [10.950347, "o", " -"]
152
+ [10.950666, "o", "-"]
153
+ [10.950997, "o", "p"]
154
+ [10.951316, "o", "u"]
155
+ [10.951625, "o", "b"]
156
+ [10.951933, "o", "l"]
157
+ [10.952349, "o", "i"]
158
+ [10.952709, "o", "c"]
159
+ [10.952943, "o", "\u001b[36D\u001b[7mr\u001b[7ma\u001b[7mi\u001b[7ml\u001b[7ms\u001b[7m \u001b[7mg\u001b[7m \u001b[7mp\u001b[7mu\u001b[7m:\u001b[7mp\u001b[7mk\u001b[7mg\u001b[7m:\u001b[7mp\u001b[7mo\u001b[7mr\u001b[7mt\u001b[7ma\u001b[7ml\u001b[7m \u001b[7ma\u001b[7md\u001b[7mm\u001b[7mi\u001b[7mn\u001b[7m \u001b[7m-\u001b[7m-\u001b[7mp\u001b[7mu\u001b[7mb\u001b[7ml\u001b[7mi\u001b[7mc\u001b[27m\r\r\n\u001b[K"]
160
+ [12.323583, "o", "\u001b[A\u001b[21C\u001b[27mr\u001b[27ma\u001b[27mi\u001b[27ml\u001b[27ms\u001b[27m \u001b[27mg\u001b[27m \u001b[27mp\u001b[27mu\u001b[27m:\u001b[27mp\u001b[27mk\u001b[27mg\u001b[27m:\u001b[27mp\u001b[27mo\u001b[27mr\u001b[27mt\u001b[27ma\u001b[27ml\u001b[27m \u001b[27ma\u001b[27md\u001b[27mm\u001b[27mi\u001b[27mn\u001b[27m \u001b[27m-\u001b[27m-\u001b[27mp\u001b[27mu\u001b[27mb\u001b[27ml\u001b[27mi\u001b[27mc\u001b[1B\r\u001b[K"]
161
+ [12.334612, "o", "\u001b[A\u001b[21C\u001b[32mr\u001b[32ma\u001b[32mi\u001b[32ml\u001b[32ms\u001b[39m\u001b[1B\r"]
162
+ [12.335045, "o", "\u001b[?1l\u001b>"]
163
+ [12.335203, "o", "\u001b[?2004l"]
164
+ [12.33974, "o", "\r\r\n"]
165
+ [12.341257, "o", "\u001b]2;_rails_command g pu:pkg:portal admin --public\u0007\u001b]1;rails\u0007"]
166
+ [13.82518, "o", "=> [plutonium] starting reloader\r\n"]
167
+ [13.88003, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/lib/engine.rb\r\n"]
168
+ [13.880611, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/config/routes.rb\r\n"]
169
+ [13.881152, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/controllers/admin_portal/concerns/controller.rb\r\n"]
170
+ [13.881455, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/controllers/admin_portal/plutonium_controller.rb\r\n"]
171
+ [13.882003, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/controllers/admin_portal/resource_controller.rb\r\n"]
172
+ [13.882323, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/controllers/admin_portal/dashboard_controller.rb\r\n"]
173
+ [13.882548, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/views/admin_portal/dashboard/index.html.erb\r\n"]
174
+ [13.88269, "o", "\u001b[1m\u001b[34m exist\u001b[0m packages/admin_portal/app/policies/admin_portal\r\n"]
175
+ [13.88318, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/policies/admin_portal/resource_policy.rb\r\n"]
176
+ [13.88325, "o", "\u001b[1m\u001b[34m exist\u001b[0m packages/admin_portal/app/definitions/admin_portal\r\n"]
177
+ [13.883652, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/definitions/admin_portal/resource_definition.rb\r\n"]
178
+ [13.883758, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/views/admin_portal/.keep\r\n"]
179
+ [13.886381, "o", "\u001b[1m\u001b[32m info\u001b[0m Copied /Users/stefan/.frum/versions/3.3.5/lib/ruby/gems/3.3.0/gems/plutonium-0.51.0/app/views/plutonium/_resource_header.html.erb to /private/tmp/plutonium-demo/blog/packages/admin_portal/app/views/plutonium/_resource_header.html.erb\r\n"]
180
+ [13.886674, "o", "\u001b[1m\u001b[32m info\u001b[0m Copied /Users/stefan/.frum/versions/3.3.5/lib/ruby/gems/3.3.0/gems/plutonium-0.51.0/app/views/plutonium/_resource_sidebar.html.erb to /private/tmp/plutonium-demo/blog/packages/admin_portal/app/views/plutonium/_resource_sidebar.html.erb\r\n"]
181
+ [13.896157, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
182
+ [13.896875, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo/blog\u0007"]
183
+ [13.897007, "o", "\u001b]1;..ium-demo/blog\u0007"]
184
+ [13.898716, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo/blog\u001b\\"]
185
+ [13.908071, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[01;34mgit:(\u001b[31mmain\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"]
186
+ [13.908186, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
187
+ [16.092247, "o", "r"]
188
+ [16.093041, "o", "\bra"]
189
+ [16.093792, "o", "i"]
190
+ [16.094515, "o", "l"]
191
+ [16.095231, "o", "s"]
192
+ [16.095874, "o", " g"]
193
+ [16.096407, "o", " p"]
194
+ [16.096921, "o", "u"]
195
+ [16.097439, "o", ":"]
196
+ [16.098005, "o", "r"]
197
+ [16.098559, "o", "e"]
198
+ [16.099085, "o", "s"]
199
+ [16.099609, "o", ":"]
200
+ [16.100345, "o", "c"]
201
+ [16.101148, "o", "o"]
202
+ [16.101732, "o", "n"]
203
+ [16.102273, "o", "n"]
204
+ [16.103048, "o", " P"]
205
+ [16.103684, "o", "o"]
206
+ [16.104134, "o", "s"]
207
+ [16.104558, "o", "t"]
208
+ [16.104985, "o", " -"]
209
+ [16.105611, "o", "-"]
210
+ [16.10628, "o", "d"]
211
+ [16.106912, "o", "e"]
212
+ [16.107363, "o", "s"]
213
+ [16.10786, "o", "t"]
214
+ [16.109261, "o", "="]
215
+ [16.109801, "o", "a"]
216
+ [16.110191, "o", "d"]
217
+ [16.110569, "o", "m"]
218
+ [16.11094, "o", "i"]
219
+ [16.111296, "o", "n"]
220
+ [16.111612, "o", "_"]
221
+ [16.111904, "o", "p"]
222
+ [16.112191, "o", "o"]
223
+ [16.112543, "o", "r"]
224
+ [16.112992, "o", "t"]
225
+ [16.11339, "o", "a"]
226
+ [16.113805, "o", "l"]
227
+ [16.113952, "o", "\u001b[44D\u001b[7mr\u001b[7ma\u001b[7mi\u001b[7ml\u001b[7ms\u001b[7m \u001b[7mg\u001b[7m \u001b[7mp\u001b[7mu\u001b[7m:\u001b[7mr\u001b[7me\u001b[7ms\u001b[7m:\u001b[7mc\u001b[7mo\u001b[7mn\u001b[7mn\u001b[7m \u001b[7mP\u001b[7mo\u001b[7ms\u001b[7mt\u001b[7m \u001b[7m-\u001b[7m-\u001b[7md\u001b[7me\u001b[7ms\u001b[7mt\u001b[7m=\u001b[7ma\u001b[7md\u001b[7mm\u001b[7mi\u001b[7mn\u001b[7m_\u001b[7mp\u001b[7mo\u001b[7mr\u001b[7mt\u001b[7ma\u001b[7ml\u001b[27m\r\r\n\u001b[K"]
228
+ [16.481211, "o", "\u001b[A\u001b[21C\u001b[27mr\u001b[27ma\u001b[27mi\u001b[27ml\u001b[27ms\u001b[27m \u001b[27mg\u001b[27m \u001b[27mp\u001b[27mu\u001b[27m:\u001b[27mr\u001b[27me\u001b[27ms\u001b[27m:\u001b[27mc\u001b[27mo\u001b[27mn\u001b[27mn\u001b[27m \u001b[27mP\u001b[27mo\u001b[27ms\u001b[27mt\u001b[27m \u001b[27m-\u001b[27m-\u001b[27md\u001b[27me\u001b[27ms\u001b[27mt\u001b[27m=\u001b[27ma\u001b[27md\u001b[27mm\u001b[27mi\u001b[27mn\u001b[27m_\u001b[27mp\u001b[27mo\u001b[27mr\u001b[27mt\u001b[27ma\u001b[27ml\u001b[1B\r\u001b[K"]
229
+ [16.494512, "o", "\u001b[A\u001b[21C\u001b[32mr\u001b[32ma\u001b[32mi\u001b[32ml\u001b[32ms\u001b[39m\u001b[1B\r"]
230
+ [16.49605, "o", "\u001b[?1l\u001b>"]
231
+ [16.496559, "o", "\u001b[?2004l"]
232
+ [16.503962, "o", "\r\r\n"]
233
+ [16.504822, "o", "\u001b]2;_rails_command g pu:res:conn Post --dest=admin_portal\u0007\u001b]1;rails\u0007"]
234
+ [17.855805, "o", "=> [plutonium] starting reloader\r\n"]
235
+ [18.010122, "o", "\u001b[1m\u001b[32m create\u001b[0m packages/admin_portal/app/controllers/admin_portal/posts_controller.rb\r\n"]
236
+ [18.010572, "o", "\u001b[1m\u001b[32m insert\u001b[0m packages/admin_portal/config/routes.rb\r\n"]
237
+ [18.020656, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
238
+ [18.0214, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo/blog\u0007\u001b]1;..ium-demo/blog\u0007"]
239
+ [18.023658, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo/blog\u001b\\"]
240
+ [18.033749, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[01;34mgit:(\u001b[31mmain\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"]
241
+ [18.033874, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
242
+ [20.278418, "o", "r"]
243
+ [20.279383, "o", "\bra"]
244
+ [20.280139, "o", "i"]
245
+ [20.280903, "o", "l"]
246
+ [20.281627, "o", "s"]
247
+ [20.282376, "o", " d"]
248
+ [20.283073, "o", "b"]
249
+ [20.283578, "o", ":"]
250
+ [20.284151, "o", "m"]
251
+ [20.284715, "o", "i"]
252
+ [20.28522, "o", "g"]
253
+ [20.285865, "o", "r"]
254
+ [20.286457, "o", "a"]
255
+ [20.28705, "o", "t"]
256
+ [20.287601, "o", "e"]
257
+ [20.287872, "o", "\u001b[16D\u001b[7mr\u001b[7ma\u001b[7mi\u001b[7ml\u001b[7ms\u001b[7m \u001b[7md\u001b[7mb\u001b[7m:\u001b[7mm\u001b[7mi\u001b[7mg\u001b[7mr\u001b[7ma\u001b[7mt\u001b[7me\u001b[27m\r\r\n\u001b[K"]
258
+ [21.067587, "o", "\u001b[A\u001b[21C\u001b[27mr\u001b[27ma\u001b[27mi\u001b[27ml\u001b[27ms\u001b[27m \u001b[27md\u001b[27mb\u001b[27m:\u001b[27mm\u001b[27mi\u001b[27mg\u001b[27mr\u001b[27ma\u001b[27mt\u001b[27me\u001b[1B\r\u001b[K"]
259
+ [21.075315, "o", "\u001b[A\u001b[21C\u001b[32mr\u001b[32ma\u001b[32mi\u001b[32ml\u001b[32ms\u001b[39m\u001b[1B\r"]
260
+ [21.075817, "o", "\u001b[?1l\u001b>"]
261
+ [21.076011, "o", "\u001b[?2004l"]
262
+ [21.080055, "o", "\r\r\n"]
263
+ [21.081791, "o", "\u001b]2;_rails_command db:migrate\u0007\u001b]1;rails\u0007"]
264
+ [22.470555, "o", "=> [plutonium] starting reloader\r\n"]
265
+ [22.553108, "o", "== 20260519173655 CreatePosts: migrating ======================================\r\n"]
266
+ [22.553344, "o", "-- create_table(:posts)\r\n"]
267
+ [22.559557, "o", " -> 0.0062s\r\n== 20260519173655 CreatePosts: migrated (0.0063s) =============================\r\n\r\n"]
268
+ [22.610661, "o", "Annotated (1): /private/tmp/plutonium-demo/blog/app/models/post.rb\r\n"]
269
+ [22.619863, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
270
+ [22.620483, "o", "\u001b]2;stefan@Stefans-MacBook-Pro:/private/tmp/plutonium-demo/blog\u0007\u001b]1;..ium-demo/blog\u0007"]
271
+ [22.621869, "o", "\u001b]7;file://Stefans-MacBook-Pro.local/private/tmp/plutonium-demo/blog\u001b\\"]
272
+ [22.630603, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mblog\u001b[00m \u001b[01;34mgit:(\u001b[31mmain\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"]
273
+ [22.630714, "o", "\u001b[?1h\u001b="]
274
+ [22.63083, "o", "\u001b[?2004h"]
275
+ [25.140997, "o", "b"]
276
+ [25.141014, "o", "\bbi"]
277
+ [25.141311, "o", "n"]
278
+ [25.141435, "o", "/"]
279
+ [25.141553, "o", "d"]
280
+ [25.141681, "o", "e"]
281
+ [25.14241, "o", "v"]
282
+ [25.142532, "o", "\b\b\b\b\b\b\b\u001b[7mb\u001b[7mi\u001b[7mn\u001b[7m/\u001b[7md\u001b[7me\u001b[7mv\u001b[27m"]
283
+ [25.526045, "o", "\b\b\b\b\b\b\b\u001b[27mb\u001b[27mi\u001b[27mn\u001b[27m/\u001b[27md\u001b[27me\u001b[27mv"]
284
+ [25.538832, "o", "\b\b\b\b\b\b\b\u001b[32mb\u001b[32mi\u001b[32mn\u001b[32m/\u001b[32md\u001b[32me\u001b[32mv\u001b[39m"]
285
+ [25.539151, "o", "\u001b[?1l\u001b>"]
286
+ [25.539273, "o", "\u001b[?2004l"]
287
+ [25.540667, "o", "\r\r\n"]
288
+ [25.541578, "o", "\u001b]2;bin/dev\u0007\u001b]1;bin/dev\u0007"]
289
+ [26.457207, "o", "\u001b[36m17:37:12 web.1 | \u001b[0mstarted with pid 33115\r\n\u001b[33m17:37:12 js.1 | \u001b[0mstarted with pid 33116\r\n\u001b[32m17:37:12 css.1 | \u001b[0mstarted with pid 33117\r\n"]
290
+ [26.476138, "o", "\u001b[32m17:37:12 css.1 | \u001b[0m$ postcss ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --watch\r\n"]
291
+ [26.746197, "o", "\u001b[33m17:37:12 js.1 | \u001b[0myarn run v1.22.22\r\n"]
292
+ [26.777767, "o", "\u001b[33m17:37:12 js.1 | \u001b[0m$ esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets --watch\r\n"]
293
+ [27.618967, "o", "\u001b[33m17:37:13 js.1 | \u001b[0m[watch] build finished, watching for changes...\r\n"]
294
+ [27.886248, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m=> Booting Puma\r\n\u001b[36m17:37:13 web.1 | \u001b[0m=> Rails 8.1.3 application starting in development \r\n"]
295
+ [27.886358, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m=> Run `bin/rails server --help` for more startup options\r\n"]
296
+ [28.00111, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m=> [plutonium] starting reloader\r\n"]
297
+ [28.019815, "o", "\u001b[36m17:37:13 web.1 | \u001b[0mPuma starting in single mode...\r\n"]
298
+ [28.020275, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* Puma version: 8.0.1 (\"Into the Arena\")\r\n"]
299
+ [28.020359, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* Ruby version: ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [arm64-darwin23]\r\n"]
300
+ [28.020441, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* Min threads: 3\r\n"]
301
+ [28.021415, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* Max threads: 3\r\n"]
302
+ [28.021777, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* Environment: development\r\n"]
303
+ [28.021871, "o", "\u001b[36m17:37:13 web.1 | \u001b[0m* PID: 33115\r\n\u001b[36m17:37:13 web.1 | \u001b[0m* Listening on http://127.0.0.1:3000\r\n\u001b[36m17:37:13 web.1 | \u001b[0m* Listening on http://[::1]:3000\r\n"]
304
+ [28.038583, "o", "\u001b[36m17:37:13 web.1 | \u001b[0mUse Ctrl-C to stop\r\n"]
305
+ [29.555747, "o", "^D\b\b"]
Binary file
Binary file
Binary file