@hustle-together/api-dev-tools 3.12.16 → 4.5.3

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 (180) hide show
  1. package/.claude/adr-requests/.gitkeep +10 -0
  2. package/.claude/agents/adr-researcher.md +109 -0
  3. package/.claude/agents/visual-analyzer.md +183 -0
  4. package/.claude/api-dev-state.json +10 -0
  5. package/.claude/documentation-audit.json +114 -0
  6. package/.claude/registry.json +289 -0
  7. package/.claude/settings.json +45 -1
  8. package/.claude/settings.local.json +1 -7
  9. package/.claude/workflow-logs/None.json +49 -0
  10. package/.claude/workflow-logs/session-20251230-143727.json +106 -0
  11. package/.skills/adr-deep-research/SKILL.md +351 -0
  12. package/.skills/api-create/SKILL.md +34 -20
  13. package/.skills/api-research/SKILL.md +130 -0
  14. package/.skills/docs-update/SKILL.md +205 -0
  15. package/.skills/hustle-brand/SKILL.md +368 -0
  16. package/.skills/hustle-build/SKILL.md +365 -38
  17. package/.skills/parallel-spawn/SKILL.md +212 -0
  18. package/.skills/ralph-continue/SKILL.md +151 -0
  19. package/.skills/ralph-loop/SKILL.md +341 -0
  20. package/.skills/ralph-status/SKILL.md +87 -0
  21. package/.skills/refactor/SKILL.md +59 -0
  22. package/.skills/shadcn/SKILL.md +522 -0
  23. package/.skills/test-all/SKILL.md +210 -0
  24. package/.skills/test-builds/SKILL.md +208 -0
  25. package/.skills/test-debug/SKILL.md +212 -0
  26. package/.skills/test-e2e/SKILL.md +168 -0
  27. package/.skills/test-review/SKILL.md +707 -0
  28. package/.skills/test-unit/SKILL.md +143 -0
  29. package/.skills/test-visual/SKILL.md +301 -0
  30. package/.skills/token-report/SKILL.md +132 -0
  31. package/CHANGELOG.md +488 -0
  32. package/README.md +346 -53
  33. package/bin/cli.js +359 -123
  34. package/hooks/__pycache__/api-workflow-check.cpython-314.pyc +0 -0
  35. package/hooks/__pycache__/auto-answer.cpython-314.pyc +0 -0
  36. package/hooks/__pycache__/cache-research.cpython-314.pyc +0 -0
  37. package/hooks/__pycache__/check-api-routes.cpython-314.pyc +0 -0
  38. package/hooks/__pycache__/check-playwright-setup.cpython-314.pyc +0 -0
  39. package/hooks/__pycache__/check-storybook-setup.cpython-314.pyc +0 -0
  40. package/hooks/__pycache__/check-update.cpython-314.pyc +0 -0
  41. package/hooks/__pycache__/completion-promise-detector.cpython-314.pyc +0 -0
  42. package/hooks/__pycache__/context-capacity-warning.cpython-314.pyc +0 -0
  43. package/hooks/__pycache__/detect-interruption.cpython-314.pyc +0 -0
  44. package/hooks/__pycache__/docs-update-check.cpython-314.pyc +0 -0
  45. package/hooks/__pycache__/enforce-a11y-audit.cpython-314.pyc +0 -0
  46. package/hooks/__pycache__/enforce-brand-guide.cpython-314.pyc +0 -0
  47. package/hooks/__pycache__/enforce-component-type-confirm.cpython-314.pyc +0 -0
  48. package/hooks/__pycache__/enforce-deep-research.cpython-314.pyc +0 -0
  49. package/hooks/__pycache__/enforce-disambiguation.cpython-314.pyc +0 -0
  50. package/hooks/__pycache__/enforce-documentation.cpython-314.pyc +0 -0
  51. package/hooks/__pycache__/enforce-dry-run.cpython-314.pyc +0 -0
  52. package/hooks/__pycache__/enforce-environment.cpython-314.pyc +0 -0
  53. package/hooks/__pycache__/enforce-external-research.cpython-314.pyc +0 -0
  54. package/hooks/__pycache__/enforce-freshness.cpython-314.pyc +0 -0
  55. package/hooks/__pycache__/enforce-interview.cpython-314.pyc +0 -0
  56. package/hooks/__pycache__/enforce-page-components.cpython-314.pyc +0 -0
  57. package/hooks/__pycache__/enforce-page-data-schema.cpython-314.pyc +0 -0
  58. package/hooks/__pycache__/enforce-questions-sourced.cpython-314.pyc +0 -0
  59. package/hooks/__pycache__/enforce-refactor.cpython-314.pyc +0 -0
  60. package/hooks/__pycache__/enforce-research.cpython-314.pyc +0 -0
  61. package/hooks/__pycache__/enforce-schema-from-interview.cpython-314.pyc +0 -0
  62. package/hooks/__pycache__/enforce-schema.cpython-314.pyc +0 -0
  63. package/hooks/__pycache__/enforce-scope.cpython-314.pyc +0 -0
  64. package/hooks/__pycache__/enforce-tdd-red.cpython-314.pyc +0 -0
  65. package/hooks/__pycache__/enforce-ui-disambiguation.cpython-314.pyc +0 -0
  66. package/hooks/__pycache__/enforce-ui-interview.cpython-314.pyc +0 -0
  67. package/hooks/__pycache__/enforce-verify.cpython-314.pyc +0 -0
  68. package/hooks/__pycache__/generate-adr-options.cpython-314.pyc +0 -0
  69. package/hooks/__pycache__/generate-manifest-entry.cpython-314.pyc +0 -0
  70. package/hooks/__pycache__/hook_utils.cpython-314.pyc +0 -0
  71. package/hooks/__pycache__/notify-input-needed.cpython-314.pyc +0 -0
  72. package/hooks/__pycache__/notify-phase-complete.cpython-314.pyc +0 -0
  73. package/hooks/__pycache__/ntfy-on-question.cpython-314.pyc +0 -0
  74. package/hooks/__pycache__/orchestrator-completion.cpython-314.pyc +0 -0
  75. package/hooks/__pycache__/orchestrator-handoff.cpython-314.pyc +0 -0
  76. package/hooks/__pycache__/orchestrator-session-startup.cpython-314.pyc +0 -0
  77. package/hooks/__pycache__/parallel-orchestrator.cpython-314.pyc +0 -0
  78. package/hooks/__pycache__/periodic-reground.cpython-314.pyc +0 -0
  79. package/hooks/__pycache__/project-document-prompt.cpython-314.pyc +0 -0
  80. package/hooks/__pycache__/remote-question-proxy.cpython-314.pyc +0 -0
  81. package/hooks/__pycache__/remote-question-server.cpython-314.pyc +0 -0
  82. package/hooks/__pycache__/run-code-review.cpython-314.pyc +0 -0
  83. package/hooks/__pycache__/run-visual-qa.cpython-314.pyc +0 -0
  84. package/hooks/__pycache__/session-logger.cpython-314.pyc +0 -0
  85. package/hooks/__pycache__/session-startup.cpython-314.pyc +0 -0
  86. package/hooks/__pycache__/track-scope-coverage.cpython-314.pyc +0 -0
  87. package/hooks/__pycache__/track-token-usage.cpython-314.pyc +0 -0
  88. package/hooks/__pycache__/track-tool-use.cpython-314.pyc +0 -0
  89. package/hooks/__pycache__/update-adr-decision.cpython-314.pyc +0 -0
  90. package/hooks/__pycache__/update-api-showcase.cpython-314.pyc +0 -0
  91. package/hooks/__pycache__/update-registry.cpython-314.pyc +0 -0
  92. package/hooks/__pycache__/update-ui-showcase.cpython-314.pyc +0 -0
  93. package/hooks/__pycache__/verify-after-green.cpython-314.pyc +0 -0
  94. package/hooks/__pycache__/verify-implementation.cpython-314.pyc +0 -0
  95. package/hooks/api-workflow-check.py +34 -0
  96. package/hooks/auto-answer.py +97 -20
  97. package/{.claude/hooks → hooks}/completion-promise-detector.py +0 -0
  98. package/{.claude/hooks → hooks}/context-capacity-warning.py +0 -0
  99. package/{.claude/hooks → hooks}/docs-update-check.py +0 -0
  100. package/{.claude/hooks → hooks}/enforce-dry-run.py +0 -0
  101. package/hooks/enforce-external-research.py +25 -0
  102. package/hooks/enforce-interview.py +20 -0
  103. package/{.claude/hooks → hooks}/generate-adr-options.py +0 -0
  104. package/{.claude/hooks → hooks}/hook_utils.py +0 -0
  105. package/hooks/ntfy-on-question.py +15 -2
  106. package/hooks/orchestrator-handoff.py +81 -3
  107. package/{.claude/hooks → hooks}/parallel-orchestrator.py +0 -0
  108. package/hooks/periodic-reground.py +40 -0
  109. package/{.claude/hooks → hooks}/remote-question-server.py +0 -0
  110. package/hooks/run-code-review.py +176 -29
  111. package/{.claude/hooks → hooks}/run-visual-qa.py +0 -0
  112. package/hooks/session-logger.py +27 -1
  113. package/hooks/session-startup.py +113 -0
  114. package/{.claude/hooks → hooks}/update-adr-decision.py +0 -0
  115. package/package.json +1 -1
  116. package/templates/.skills/hustle-interview/SKILL.md +174 -0
  117. package/templates/adr-viewer/_components/ADRViewer.tsx +326 -0
  118. package/templates/api-dev-state.json +33 -1
  119. package/templates/brand-page/page.tsx +645 -0
  120. package/templates/component/Component.visual.spec.ts +30 -24
  121. package/templates/eslint-plugin-zod-schema/index.js +446 -0
  122. package/templates/eslint-plugin-zod-schema/package.json +26 -0
  123. package/templates/github-workflows/security.yml +274 -0
  124. package/templates/hustle-build-defaults.json +53 -1
  125. package/templates/page/page.e2e.test.ts +30 -26
  126. package/templates/performance-budgets.json +63 -5
  127. package/templates/registry.json +279 -3
  128. package/templates/review-dashboard/page.tsx +510 -0
  129. package/templates/settings.json +74 -7
  130. package/templates/ui-showcase/_components/UIShowcase.tsx +47 -0
  131. package/templates/ui-showcase/_components/VisualTestingDashboard.tsx +579 -0
  132. package/.claude/commands/hustle-combine.md +0 -1089
  133. package/.claude/commands/hustle-ui-create-page.md +0 -1078
  134. package/.claude/commands/hustle-ui-create.md +0 -1058
  135. package/.claude/hooks/auto-answer.py +0 -305
  136. package/.claude/hooks/cache-research.py +0 -337
  137. package/.claude/hooks/check-api-routes.py +0 -168
  138. package/.claude/hooks/check-playwright-setup.py +0 -103
  139. package/.claude/hooks/check-storybook-setup.py +0 -81
  140. package/.claude/hooks/check-update.py +0 -132
  141. package/.claude/hooks/detect-interruption.py +0 -165
  142. package/.claude/hooks/enforce-a11y-audit.py +0 -202
  143. package/.claude/hooks/enforce-brand-guide.py +0 -241
  144. package/.claude/hooks/enforce-component-type-confirm.py +0 -97
  145. package/.claude/hooks/enforce-freshness.py +0 -184
  146. package/.claude/hooks/enforce-page-components.py +0 -186
  147. package/.claude/hooks/enforce-page-data-schema.py +0 -155
  148. package/.claude/hooks/enforce-questions-sourced.py +0 -146
  149. package/.claude/hooks/enforce-schema-from-interview.py +0 -248
  150. package/.claude/hooks/enforce-ui-disambiguation.py +0 -108
  151. package/.claude/hooks/enforce-ui-interview.py +0 -130
  152. package/.claude/hooks/generate-manifest-entry.py +0 -1161
  153. package/.claude/hooks/lib/__init__.py +0 -1
  154. package/.claude/hooks/lib/greptile.py +0 -355
  155. package/.claude/hooks/lib/ntfy.py +0 -209
  156. package/.claude/hooks/notify-input-needed.py +0 -73
  157. package/.claude/hooks/notify-phase-complete.py +0 -90
  158. package/.claude/hooks/ntfy-on-question.py +0 -240
  159. package/.claude/hooks/orchestrator-completion.py +0 -313
  160. package/.claude/hooks/orchestrator-handoff.py +0 -267
  161. package/.claude/hooks/orchestrator-session-startup.py +0 -146
  162. package/.claude/hooks/run-code-review.py +0 -393
  163. package/.claude/hooks/session-logger.py +0 -323
  164. package/.claude/hooks/test-orchestrator-reground.py +0 -248
  165. package/.claude/hooks/track-scope-coverage.py +0 -220
  166. package/.claude/hooks/track-token-usage.py +0 -121
  167. package/.claude/hooks/update-api-showcase.py +0 -161
  168. package/.claude/hooks/update-registry.py +0 -352
  169. package/.claude/hooks/update-ui-showcase.py +0 -224
  170. package/.claude/test-auto-answer-bot.py +0 -183
  171. package/.claude/test-completion-detector.py +0 -263
  172. package/.claude/test-orchestrator-state.json +0 -20
  173. package/.claude/test-orchestrator.sh +0 -271
  174. /package/{.claude/commands → commands}/hustle-build.md +0 -0
  175. /package/{.claude/hooks → hooks}/lib/__pycache__/__init__.cpython-314.pyc +0 -0
  176. /package/{.claude/hooks → hooks}/lib/__pycache__/greptile.cpython-314.pyc +0 -0
  177. /package/{.claude/hooks → hooks}/lib/__pycache__/ntfy.cpython-314.pyc +0 -0
  178. /package/{.claude/hooks → hooks}/project-document-prompt.py +0 -0
  179. /package/{.claude/hooks → hooks}/remote-question-proxy.py +0 -0
  180. /package/{.claude/hooks → hooks}/update-testing-checklist.py +0 -0
@@ -1,7 +1,96 @@
1
1
  {
2
- "version": "1.0.0",
2
+ "version": "1.5.0",
3
3
  "updated_at": "",
4
- "description": "Central registry tracking all APIs, components, and pages created through Hustle Dev Tools",
4
+ "description": "Central registry tracking all APIs, components, pages, hooks, utilities, types, routes, environment variables, external services, ADRs, and brand guide created through Hustle Dev Tools",
5
+
6
+ "adrs": {
7
+ "_description": "Architecture Decision Records - significant decisions with context and reasoning. Created during research, updated during interview.",
8
+ "_example": {
9
+ "0001-database-choice": {
10
+ "number": 1,
11
+ "title": "Database Choice",
12
+ "status": "accepted",
13
+ "date": "2025-12-30",
14
+ "phase": "interview",
15
+ "endpoint": "todo-app",
16
+ "category": "database",
17
+ "decision": "supabase",
18
+ "options_considered": ["supabase", "firebase", "postgres"],
19
+ "file": ".claude/adrs/0001-database-choice.md",
20
+ "decided_at": "2025-12-30T10:15:00Z"
21
+ }
22
+ }
23
+ },
24
+
25
+ "brand_guide": {
26
+ "_description": "Brand guide configuration tracking. Single source of truth for all UI styling decisions.",
27
+ "created_at": null,
28
+ "last_updated": null,
29
+ "version": 0,
30
+ "interview_completed": false,
31
+ "file": ".claude/BRAND_GUIDE.md",
32
+ "brand_page": "src/app/brand/page.tsx",
33
+ "theme_file": "src/lib/theme.ts",
34
+ "sections": {
35
+ "colors": false,
36
+ "typography": false,
37
+ "spacing": false,
38
+ "animations": false,
39
+ "voice": false,
40
+ "custom_elements": false
41
+ },
42
+ "custom_elements": [],
43
+ "_custom_elements_options": [
44
+ "terminal-animation",
45
+ "gradient-text",
46
+ "typing-effect",
47
+ "parallax-scroll",
48
+ "particle-background",
49
+ "three-js-scene",
50
+ "gsap-animations",
51
+ "lottie-animations",
52
+ "glassmorphism",
53
+ "neumorphism"
54
+ ],
55
+ "voice": {
56
+ "tone": null,
57
+ "_tone_options": ["professional", "friendly", "technical", "playful", "custom"],
58
+ "terminology": {},
59
+ "dos": [],
60
+ "donts": []
61
+ },
62
+ "colors": {
63
+ "primary": null,
64
+ "secondary": null,
65
+ "accent": null,
66
+ "background": null,
67
+ "foreground": null,
68
+ "muted": null,
69
+ "destructive": null,
70
+ "gradients": []
71
+ },
72
+ "typography": {
73
+ "font_sans": null,
74
+ "font_mono": null,
75
+ "font_heading": null,
76
+ "scale": "default"
77
+ },
78
+ "motion": {
79
+ "style": null,
80
+ "_style_options": ["snappy", "smooth", "bouncy", "minimal", "none"],
81
+ "duration_fast": "150ms",
82
+ "duration_normal": "300ms",
83
+ "duration_slow": "500ms",
84
+ "easing": "ease-out",
85
+ "library": null,
86
+ "_library_options": ["css", "framer-motion", "gsap", "none"]
87
+ },
88
+ "shadcn": {
89
+ "initialized": false,
90
+ "components_installed": [],
91
+ "theme_configured": false
92
+ }
93
+ },
5
94
 
6
95
  "apis": {},
7
96
 
@@ -9,5 +98,192 @@
9
98
 
10
99
  "pages": {},
11
100
 
12
- "combined": {}
101
+ "combined": {},
102
+
103
+ "routes": {
104
+ "_description": "All application routes - API routes, page routes, middleware. Enables dead route detection and navigation planning.",
105
+ "_example": {
106
+ "/api/users": {
107
+ "file": "src/app/api/users/route.ts",
108
+ "methods": ["GET", "POST"],
109
+ "auth_required": true,
110
+ "rate_limited": true,
111
+ "description": "User CRUD operations"
112
+ },
113
+ "/api/users/[id]": {
114
+ "file": "src/app/api/users/[id]/route.ts",
115
+ "methods": ["GET", "PUT", "DELETE"],
116
+ "auth_required": true,
117
+ "params": ["id"],
118
+ "description": "Single user operations"
119
+ },
120
+ "/dashboard": {
121
+ "file": "src/app/dashboard/page.tsx",
122
+ "type": "page",
123
+ "auth_required": true,
124
+ "layout": "src/app/dashboard/layout.tsx"
125
+ }
126
+ }
127
+ },
128
+
129
+ "env_vars": {
130
+ "_description": "Environment variables required by the application. Enables /api-env validation and deployment checklists.",
131
+ "_example": {
132
+ "DATABASE_URL": {
133
+ "required": true,
134
+ "description": "PostgreSQL connection string",
135
+ "used_by": ["prisma", "src/lib/db.ts"],
136
+ "format": "postgresql://user:pass@host:5432/db",
137
+ "sensitive": true
138
+ },
139
+ "NEXT_PUBLIC_API_URL": {
140
+ "required": true,
141
+ "description": "Public API base URL",
142
+ "used_by": ["src/lib/api-client.ts"],
143
+ "public": true,
144
+ "sensitive": false
145
+ },
146
+ "STRIPE_SECRET_KEY": {
147
+ "required": false,
148
+ "description": "Stripe API secret key",
149
+ "used_by": ["src/app/api/payments/route.ts"],
150
+ "sensitive": true,
151
+ "docs": "https://stripe.com/docs/keys"
152
+ }
153
+ }
154
+ },
155
+
156
+ "services": {
157
+ "_description": "External services and APIs the application depends on. Enables dependency tracking and outage awareness.",
158
+ "_example": {
159
+ "stripe": {
160
+ "name": "Stripe",
161
+ "type": "payment",
162
+ "sdk": "@stripe/stripe-js",
163
+ "env_vars": ["STRIPE_SECRET_KEY", "STRIPE_PUBLISHABLE_KEY", "STRIPE_WEBHOOK_SECRET"],
164
+ "endpoints_used": ["/v1/customers", "/v1/subscriptions", "/v1/checkout/sessions"],
165
+ "webhooks": ["/api/webhooks/stripe"],
166
+ "docs": "https://stripe.com/docs/api",
167
+ "status_page": "https://status.stripe.com"
168
+ },
169
+ "supabase": {
170
+ "name": "Supabase",
171
+ "type": "database",
172
+ "sdk": "@supabase/supabase-js",
173
+ "env_vars": ["SUPABASE_URL", "SUPABASE_ANON_KEY", "SUPABASE_SERVICE_KEY"],
174
+ "features_used": ["auth", "database", "storage"],
175
+ "docs": "https://supabase.com/docs",
176
+ "status_page": "https://status.supabase.com"
177
+ },
178
+ "openai": {
179
+ "name": "OpenAI",
180
+ "type": "ai",
181
+ "sdk": "openai",
182
+ "env_vars": ["OPENAI_API_KEY"],
183
+ "models_used": ["gpt-4", "gpt-3.5-turbo"],
184
+ "docs": "https://platform.openai.com/docs",
185
+ "status_page": "https://status.openai.com"
186
+ }
187
+ }
188
+ },
189
+
190
+ "webhooks": {
191
+ "_description": "Incoming webhook endpoints and their configurations. Critical for security auditing.",
192
+ "_example": {
193
+ "/api/webhooks/stripe": {
194
+ "file": "src/app/api/webhooks/stripe/route.ts",
195
+ "service": "stripe",
196
+ "signature_header": "stripe-signature",
197
+ "signature_secret_env": "STRIPE_WEBHOOK_SECRET",
198
+ "events_handled": ["checkout.session.completed", "customer.subscription.updated"],
199
+ "idempotency": true
200
+ },
201
+ "/api/webhooks/github": {
202
+ "file": "src/app/api/webhooks/github/route.ts",
203
+ "service": "github",
204
+ "signature_header": "x-hub-signature-256",
205
+ "signature_secret_env": "GITHUB_WEBHOOK_SECRET",
206
+ "events_handled": ["push", "pull_request"]
207
+ }
208
+ }
209
+ },
210
+
211
+ "hooks": {
212
+ "_description": "Custom React hooks - tracked to prevent duplication and enable reuse",
213
+ "_example": {
214
+ "useAuth": {
215
+ "file": "src/hooks/useAuth.ts",
216
+ "returns": "{ user: User | null, login: Function, logout: Function }",
217
+ "description": "Authentication hook with login/logout methods"
218
+ }
219
+ }
220
+ },
221
+
222
+ "utils": {
223
+ "_description": "Utility functions - tracked to prevent duplication",
224
+ "_example": {
225
+ "formatCurrency": {
226
+ "file": "src/lib/utils/format.ts",
227
+ "signature": "(amount: number, currency?: string) => string",
228
+ "description": "Format number as currency with locale support"
229
+ }
230
+ }
231
+ },
232
+
233
+ "types": {
234
+ "_description": "Shared TypeScript types - tracked for schema consistency",
235
+ "_example": {
236
+ "User": {
237
+ "file": "src/types/user.ts",
238
+ "definition": "{ id: string, email: string, name: string }",
239
+ "used_by": ["useAuth", "UserProfile", "api/users"]
240
+ }
241
+ }
242
+ },
243
+
244
+ "providers": {
245
+ "_description": "React Context providers - tracked to show app structure",
246
+ "_example": {
247
+ "AuthProvider": {
248
+ "file": "src/providers/AuthProvider.tsx",
249
+ "context": "AuthContext",
250
+ "provides": "{ user, login, logout }",
251
+ "wraps": "entire app"
252
+ }
253
+ }
254
+ },
255
+
256
+ "orchestrator_defaults": {
257
+ "description": "Shared decisions from /hustle-build orchestrator interviews - applied to all sub-workflows",
258
+ "error_handling": {
259
+ "style": null,
260
+ "options": ["try-catch-rethrow", "error-boundary", "result-type", "error-codes"]
261
+ },
262
+ "authentication": {
263
+ "method": null,
264
+ "options": ["jwt", "session", "api-key", "oauth", "none"]
265
+ },
266
+ "logging": {
267
+ "level": null,
268
+ "options": ["verbose", "standard", "minimal", "none"]
269
+ },
270
+ "api_versioning": {
271
+ "strategy": null,
272
+ "options": ["url-prefix", "header", "query-param", "none"]
273
+ },
274
+ "testing": {
275
+ "coverage_threshold": null,
276
+ "visual_viewports": ["mobile-portrait", "mobile-notch", "mobile-landscape", "tablet-portrait", "tablet-landscape", "small-desktop", "desktop"]
277
+ },
278
+ "styling": {
279
+ "approach": null,
280
+ "options": ["tailwind", "css-modules", "styled-components", "emotion", "vanilla"]
281
+ }
282
+ },
283
+
284
+ "visual_test_results": {
285
+ "description": "Results from /test-visual runs - populated by visual-analyzer agent",
286
+ "last_run": null,
287
+ "elements": {}
288
+ }
13
289
  }