@noego/app 0.0.24 → 0.0.26

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.
@@ -0,0 +1,799 @@
1
+ name: Handle Ticket
2
+ version: 1
3
+ defaults:
4
+ engine: anthropic
5
+ model: claude-sonnet-4-5
6
+ loopLimits:
7
+ perPhase: 3
8
+ total: 10
9
+ git:
10
+ branchPattern: "bashly/issue-{{number}}"
11
+ entry: learn
12
+
13
+ phases:
14
+ # Phase 1: Learn the repository
15
+ - name: learn
16
+ systemPrompt: |
17
+ You will see the GitHub issue but do not focus on it yet. Focus only on learning the repository.
18
+ Read markdown files (NOEGO_FRAMEWORK_GUIDE.md, instructions/forge-testing.md),
19
+ examine the project structure, understand testing patterns, coding style,
20
+ and architectural decisions. Summarize the key standards that must be
21
+ followed when making changes.
22
+ readOnly: true
23
+ preActions:
24
+ - git.clone
25
+ next: classify_issue
26
+
27
+ # Phase 2: Classify the type of issue
28
+ - name: classify_issue
29
+ type: decision
30
+ prompt: |
31
+ Classify this GitHub issue by its primary nature. Score 0-1:
32
+
33
+ **Bug investigation (0.0-0.2):**
34
+ - Something is broken and needs debugging
35
+ - Unexpected behavior reported
36
+ - Error messages or stack traces mentioned
37
+ - Regression from a previous change
38
+
39
+ **Database/migration (0.2-0.4):**
40
+ - Requires new tables, columns, or schema changes
41
+ - Mentions database, migration, schema, or SQL
42
+ - Needs proper CLI migrations
43
+ - Data model changes
44
+
45
+ **Code change (0.4-1.0):**
46
+ - New feature, enhancement, or refactor
47
+ - UI changes, API changes, styling
48
+ - Documentation-only changes
49
+ - Test additions without code changes
50
+ - Any implementation work that doesn't involve debugging or migrations
51
+
52
+ Consider:
53
+ - Is the issue about something broken vs something new?
54
+ - Does it mention database tables, columns, or schema?
55
+ - Is the primary work investigation or implementation?
56
+ options: ["bug_investigate", "migration_plan", "code_change_triage"]
57
+ thresholds: [0.2, 0.5]
58
+ aiConfig:
59
+ model: claude-sonnet-4-5
60
+
61
+ # ============================================================
62
+ # CODE CHANGE TRIAGE (bridge to complexity decision)
63
+ # ============================================================
64
+
65
+ - name: code_change_triage
66
+ systemPrompt: |
67
+ This issue has been classified as a code change (not a bug or migration).
68
+ Briefly summarize the scope of work needed so the next phase can assess complexity.
69
+ readOnly: true
70
+ next: assess_complexity
71
+ aiConfig:
72
+ model: claude-haiku-4-5
73
+
74
+ # ============================================================
75
+ # BUG INVESTIGATION FLOW
76
+ # ============================================================
77
+
78
+ - name: bug_investigate
79
+ systemPrompt: |
80
+ Read the GitHub issue carefully. This is a bug report. Your goal is to:
81
+ 1. Understand the reported symptoms and expected behavior
82
+ 2. Trace through the relevant code paths to identify the root cause
83
+ 3. Reproduce the issue by reading tests or running the app if possible
84
+ 4. Document the root cause clearly
85
+
86
+ Do not fix the bug yet. Focus on understanding and documenting.
87
+ readOnly: true
88
+ input:
89
+ type: object
90
+ properties:
91
+ rootCause:
92
+ type: string
93
+ description: Clear explanation of the root cause
94
+ affectedFiles:
95
+ type: array
96
+ items:
97
+ type: string
98
+ description: Files involved in the bug
99
+ reproductionSteps:
100
+ type: array
101
+ items:
102
+ type: string
103
+ description: Steps to reproduce the issue
104
+ required:
105
+ - rootCause
106
+ - affectedFiles
107
+ next: bug_plan
108
+ aiConfig:
109
+ model: claude-opus-4-5
110
+
111
+ - name: bug_plan
112
+ systemPrompt: |
113
+ Based on the root cause analysis, create a plan to fix the bug.
114
+ Identify the minimal set of changes needed. Plan regression tests
115
+ to prevent this bug from recurring. Do not write code yet.
116
+
117
+ Categorize each file as: create (new), modify (existing), or delete (remove).
118
+ List files to read for context with a reason for each.
119
+ readOnly: true
120
+ input:
121
+ type: object
122
+ properties:
123
+ filesToCreate:
124
+ type: array
125
+ items:
126
+ type: object
127
+ properties:
128
+ path:
129
+ type: string
130
+ purpose:
131
+ type: string
132
+ required:
133
+ - path
134
+ - purpose
135
+ description: New files to create
136
+ filesToModify:
137
+ type: array
138
+ items:
139
+ type: object
140
+ properties:
141
+ path:
142
+ type: string
143
+ changes:
144
+ type: string
145
+ required:
146
+ - path
147
+ - changes
148
+ description: Existing files to modify and what changes are needed
149
+ filesToDelete:
150
+ type: array
151
+ items:
152
+ type: object
153
+ properties:
154
+ path:
155
+ type: string
156
+ reason:
157
+ type: string
158
+ required:
159
+ - path
160
+ - reason
161
+ description: Files to remove
162
+ filesToRead:
163
+ type: array
164
+ items:
165
+ type: object
166
+ properties:
167
+ path:
168
+ type: string
169
+ reason:
170
+ type: string
171
+ required:
172
+ - path
173
+ - reason
174
+ description: Files to read for additional context before implementing
175
+ approach:
176
+ type: string
177
+ testCases:
178
+ type: array
179
+ items:
180
+ type: object
181
+ properties:
182
+ name:
183
+ type: string
184
+ type:
185
+ type: string
186
+ required:
187
+ - name
188
+ - type
189
+ required:
190
+ - filesToModify
191
+ - approach
192
+ - testCases
193
+ next: bug_fix
194
+ aiConfig:
195
+ model: claude-opus-4-5
196
+
197
+ - name: bug_fix
198
+ systemPrompt: |
199
+ Execute the fix plan. First read any files listed in filesToRead to gather context.
200
+ Then implement the minimal changes to resolve the bug and write regression tests.
201
+ Follow all repository standards.
202
+ next: bug_test
203
+ aiConfig:
204
+ model: claude-opus-4-5
205
+
206
+ - name: bug_test
207
+ systemPrompt: |
208
+ Run the tests to verify the bug fix. Ensure the regression tests pass
209
+ and no existing tests are broken. Report the results.
210
+ readOnly: true
211
+ next: bug_review
212
+ aiConfig:
213
+ model: claude-opus-4-5
214
+
215
+ - name: bug_review
216
+ type: loop
217
+ prompt: Are all tests passing and is the bug fully resolved with regression tests?
218
+ threshold: 0.9
219
+ loopTarget: bug_fix
220
+ next: check_svelte
221
+ aiConfig:
222
+ model: claude-opus-4-5
223
+
224
+ # ============================================================
225
+ # DATABASE / MIGRATION FLOW
226
+ # ============================================================
227
+
228
+ - name: migration_plan
229
+ systemPrompt: |
230
+ Read the GitHub issue carefully. This involves database schema changes.
231
+ Plan the migration(s) needed:
232
+ 1. What tables/columns need to be created, altered, or dropped
233
+ 2. What the up and down migrations should contain
234
+ 3. How this affects existing repository classes, services, and controllers
235
+ 4. What seed data changes are needed (if any)
236
+
237
+ Use the proper CLI to create migrations (never create migration files manually).
238
+ Do not write code yet.
239
+
240
+ Categorize each file as: create (new), modify (existing), or delete (remove).
241
+ List files to read for context with a reason for each.
242
+ readOnly: true
243
+ input:
244
+ type: object
245
+ properties:
246
+ migrations:
247
+ type: array
248
+ items:
249
+ type: object
250
+ properties:
251
+ name:
252
+ type: string
253
+ description:
254
+ type: string
255
+ required:
256
+ - name
257
+ - description
258
+ description: Migrations to create
259
+ filesToCreate:
260
+ type: array
261
+ items:
262
+ type: object
263
+ properties:
264
+ path:
265
+ type: string
266
+ purpose:
267
+ type: string
268
+ required:
269
+ - path
270
+ - purpose
271
+ description: New files to create (repos, services, SQL files, tests)
272
+ filesToModify:
273
+ type: array
274
+ items:
275
+ type: object
276
+ properties:
277
+ path:
278
+ type: string
279
+ changes:
280
+ type: string
281
+ required:
282
+ - path
283
+ - changes
284
+ description: Existing files to modify and what changes are needed
285
+ filesToDelete:
286
+ type: array
287
+ items:
288
+ type: object
289
+ properties:
290
+ path:
291
+ type: string
292
+ reason:
293
+ type: string
294
+ required:
295
+ - path
296
+ - reason
297
+ description: Files to remove
298
+ filesToRead:
299
+ type: array
300
+ items:
301
+ type: object
302
+ properties:
303
+ path:
304
+ type: string
305
+ reason:
306
+ type: string
307
+ required:
308
+ - path
309
+ - reason
310
+ description: Files to read for additional context before implementing
311
+ approach:
312
+ type: string
313
+ testCases:
314
+ type: array
315
+ items:
316
+ type: object
317
+ properties:
318
+ name:
319
+ type: string
320
+ type:
321
+ type: string
322
+ required:
323
+ - name
324
+ - type
325
+ required:
326
+ - migrations
327
+ - approach
328
+ next: migration_implement
329
+ aiConfig:
330
+ model: claude-opus-4-5
331
+
332
+ - name: migration_implement
333
+ systemPrompt: |
334
+ Execute the migration plan. First read any files listed in filesToRead to gather context.
335
+ Then:
336
+ 1. Create migrations using the proper CLI tool
337
+ 2. Update repository classes with new queries
338
+ 3. Update services and controllers as needed
339
+ 4. Write tests for the new data layer
340
+ Follow all repository standards.
341
+ next: migration_test
342
+ aiConfig:
343
+ model: claude-opus-4-5
344
+
345
+ - name: migration_test
346
+ systemPrompt: |
347
+ Run the tests to verify the migration and related changes.
348
+ Ensure migrations run cleanly up and down. Check that all new
349
+ and existing tests pass. Report the results.
350
+ readOnly: true
351
+ next: migration_review
352
+ aiConfig:
353
+ model: claude-opus-4-5
354
+
355
+ - name: migration_review
356
+ type: loop
357
+ prompt: Are all tests passing, migrations running cleanly, and does the implementation fully address the issue?
358
+ threshold: 0.85
359
+ loopTarget: migration_implement
360
+ next: check_svelte
361
+ aiConfig:
362
+ model: claude-opus-4-5
363
+
364
+ # ============================================================
365
+ # CODE CHANGE FLOW — complexity routing
366
+ # ============================================================
367
+
368
+ - name: assess_complexity
369
+ type: decision
370
+ prompt: |
371
+ Analyze the complexity of this code change and score it 0-1:
372
+
373
+ **Simple (0.0-0.3):**
374
+ - Documentation updates, README changes
375
+ - Simple styling tweaks (colors, margins, font sizes)
376
+ - Typo fixes, renaming variables
377
+ - Adding comments or simple logging
378
+ - Straightforward single-file changes with no logic
379
+
380
+ **Medium (0.4-0.6):**
381
+ - Adding new components or routes with basic logic
382
+ - Simple form handling or validation
383
+ - Basic API endpoint changes (1-2 files)
384
+ - Moderate styling with some conditional logic
385
+ - Integration of existing patterns (2-3 files)
386
+
387
+ **Complex (0.7-1.0):**
388
+ - Touches 4+ files across multiple layers
389
+ - State management, complex business rules
390
+ - Async operations, race conditions
391
+ - Multi-layer changes (controller + service + repository + SQL)
392
+ - Multi-component coordination across server/client
393
+ - Performance optimization
394
+ - Integration of multiple systems
395
+ - New full-stack features (route + controller + service + repo + tests)
396
+ - Changes that ripple across many dependents
397
+
398
+ Consider:
399
+ - How many files will need to change? (4+ files = likely complex)
400
+ - Does it span multiple layers (API, service, repository, SQL, UI)?
401
+ - Does it require understanding the NoEgo framework deeply?
402
+ - Will it need multiple types of tests?
403
+ - Could a change in one file break behavior in several others?
404
+ options: ["easy_plan", "medium_plan", "hard_plan"]
405
+ thresholds: [0.4, 0.7]
406
+ aiConfig:
407
+ model: claude-sonnet-4-5
408
+
409
+ # === Easy path: All Haiku ===
410
+ - name: easy_plan
411
+ systemPrompt: |
412
+ Read the GitHub issue carefully. Based on the issue and repository standards,
413
+ create a brief implementation plan. Do not write code yet.
414
+
415
+ Categorize each file as: create (new), modify (existing), or delete (remove).
416
+ List files to read for context with a reason for each.
417
+ readOnly: true
418
+ input:
419
+ type: object
420
+ properties:
421
+ filesToCreate:
422
+ type: array
423
+ items:
424
+ type: object
425
+ properties:
426
+ path:
427
+ type: string
428
+ purpose:
429
+ type: string
430
+ required:
431
+ - path
432
+ - purpose
433
+ filesToModify:
434
+ type: array
435
+ items:
436
+ type: object
437
+ properties:
438
+ path:
439
+ type: string
440
+ changes:
441
+ type: string
442
+ required:
443
+ - path
444
+ - changes
445
+ filesToDelete:
446
+ type: array
447
+ items:
448
+ type: object
449
+ properties:
450
+ path:
451
+ type: string
452
+ reason:
453
+ type: string
454
+ required:
455
+ - path
456
+ - reason
457
+ filesToRead:
458
+ type: array
459
+ items:
460
+ type: object
461
+ properties:
462
+ path:
463
+ type: string
464
+ reason:
465
+ type: string
466
+ required:
467
+ - path
468
+ - reason
469
+ approach:
470
+ type: string
471
+ required:
472
+ - approach
473
+ next: easy_implement
474
+ aiConfig:
475
+ model: claude-haiku-4-5
476
+
477
+ - name: easy_implement
478
+ systemPrompt: |
479
+ Execute the plan. First read any files listed in filesToRead to gather context.
480
+ Then implement the changes as designed.
481
+ Follow all repository standards learned in the first phase.
482
+ next: check_svelte
483
+ aiConfig:
484
+ model: claude-haiku-4-5
485
+
486
+ # === Medium path: Haiku plan, Sonnet implement ===
487
+ - name: medium_plan
488
+ systemPrompt: |
489
+ Read the GitHub issue carefully. Based on the issue and repository standards,
490
+ create a detailed implementation plan. Plan what tests are needed.
491
+ Do not write code yet.
492
+
493
+ Categorize each file as: create (new), modify (existing), or delete (remove).
494
+ List files to read for context with a reason for each.
495
+ readOnly: true
496
+ input:
497
+ type: object
498
+ properties:
499
+ filesToCreate:
500
+ type: array
501
+ items:
502
+ type: object
503
+ properties:
504
+ path:
505
+ type: string
506
+ purpose:
507
+ type: string
508
+ required:
509
+ - path
510
+ - purpose
511
+ filesToModify:
512
+ type: array
513
+ items:
514
+ type: object
515
+ properties:
516
+ path:
517
+ type: string
518
+ changes:
519
+ type: string
520
+ required:
521
+ - path
522
+ - changes
523
+ filesToDelete:
524
+ type: array
525
+ items:
526
+ type: object
527
+ properties:
528
+ path:
529
+ type: string
530
+ reason:
531
+ type: string
532
+ required:
533
+ - path
534
+ - reason
535
+ filesToRead:
536
+ type: array
537
+ items:
538
+ type: object
539
+ properties:
540
+ path:
541
+ type: string
542
+ reason:
543
+ type: string
544
+ required:
545
+ - path
546
+ - reason
547
+ approach:
548
+ type: string
549
+ testCases:
550
+ type: array
551
+ items:
552
+ type: object
553
+ properties:
554
+ name:
555
+ type: string
556
+ type:
557
+ type: string
558
+ required:
559
+ - name
560
+ - type
561
+ required:
562
+ - approach
563
+ next: medium_implement
564
+ aiConfig:
565
+ model: claude-haiku-4-5
566
+
567
+ - name: medium_implement
568
+ systemPrompt: |
569
+ Execute the plan. First read any files listed in filesToRead to gather context.
570
+ Then implement the changes and write tests as designed.
571
+ Follow all repository standards learned in the first phase.
572
+ next: medium_test
573
+ aiConfig:
574
+ model: claude-sonnet-4-5
575
+
576
+ - name: medium_test
577
+ systemPrompt: |
578
+ Run the tests to verify the implementation. Check that all new and existing
579
+ tests pass. Report the results.
580
+ readOnly: true
581
+ next: medium_review
582
+ aiConfig:
583
+ model: claude-sonnet-4-5
584
+
585
+ - name: medium_review
586
+ type: loop
587
+ prompt: Are all tests passing and does the implementation fully address the issue?
588
+ threshold: 0.85
589
+ loopTarget: medium_implement
590
+ next: check_svelte
591
+ aiConfig:
592
+ model: claude-sonnet-4-5
593
+
594
+ # === Hard path: All Opus ===
595
+ - name: hard_plan
596
+ systemPrompt: |
597
+ Read the GitHub issue carefully. Understand the requirements, acceptance
598
+ criteria, and any context provided. Based on the issue and the repository
599
+ standards you learned, create a detailed implementation plan.
600
+ Identify risks and edge cases. Do not write code yet.
601
+
602
+ Categorize each file as: create (new), modify (existing), or delete (remove).
603
+ List files to read for context with a reason for each.
604
+ readOnly: true
605
+ input:
606
+ type: object
607
+ properties:
608
+ filesToCreate:
609
+ type: array
610
+ items:
611
+ type: object
612
+ properties:
613
+ path:
614
+ type: string
615
+ purpose:
616
+ type: string
617
+ required:
618
+ - path
619
+ - purpose
620
+ description: New files to create
621
+ filesToModify:
622
+ type: array
623
+ items:
624
+ type: object
625
+ properties:
626
+ path:
627
+ type: string
628
+ changes:
629
+ type: string
630
+ required:
631
+ - path
632
+ - changes
633
+ description: Existing files to modify and what changes are needed
634
+ filesToDelete:
635
+ type: array
636
+ items:
637
+ type: object
638
+ properties:
639
+ path:
640
+ type: string
641
+ reason:
642
+ type: string
643
+ required:
644
+ - path
645
+ - reason
646
+ description: Files to remove
647
+ filesToRead:
648
+ type: array
649
+ items:
650
+ type: object
651
+ properties:
652
+ path:
653
+ type: string
654
+ reason:
655
+ type: string
656
+ required:
657
+ - path
658
+ - reason
659
+ description: Files to read for additional context before implementing
660
+ approach:
661
+ type: string
662
+ risks:
663
+ type: array
664
+ items:
665
+ type: string
666
+ required:
667
+ - approach
668
+ next: hard_plan_tests
669
+ aiConfig:
670
+ model: claude-opus-4-5
671
+
672
+ - name: hard_plan_tests
673
+ systemPrompt: |
674
+ Based on the implementation plan, design a testing strategy. Determine which
675
+ types of tests are needed (unit, integration, API, visual), what test cases
676
+ to cover, and how to verify the fix. Follow the repository's existing test patterns.
677
+ readOnly: true
678
+ input:
679
+ type: object
680
+ properties:
681
+ testTypes:
682
+ type: array
683
+ items:
684
+ type: string
685
+ enum:
686
+ - unit
687
+ - integration
688
+ - api
689
+ - visual
690
+ testCases:
691
+ type: array
692
+ items:
693
+ type: object
694
+ properties:
695
+ name:
696
+ type: string
697
+ type:
698
+ type: string
699
+ file:
700
+ type: string
701
+ required:
702
+ - name
703
+ - type
704
+ required:
705
+ - testTypes
706
+ - testCases
707
+ next: hard_implement
708
+ aiConfig:
709
+ model: claude-opus-4-5
710
+
711
+ - name: hard_implement
712
+ systemPrompt: |
713
+ Execute the plan. First read any files listed in filesToRead to gather context.
714
+ Then implement the changes and write the tests as designed.
715
+ Follow all repository standards learned in the first phase.
716
+ next: hard_test
717
+ aiConfig:
718
+ model: claude-opus-4-5
719
+
720
+ - name: hard_test
721
+ systemPrompt: |
722
+ Run the tests to verify the implementation. Check that all new and existing
723
+ tests pass. Report the results.
724
+ readOnly: true
725
+ next: hard_review
726
+ aiConfig:
727
+ model: claude-opus-4-5
728
+
729
+ - name: hard_review
730
+ type: loop
731
+ prompt: Are all tests passing and does the implementation fully address the issue?
732
+ threshold: 0.85
733
+ loopTarget: hard_implement
734
+ next: check_svelte
735
+ aiConfig:
736
+ model: claude-opus-4-5
737
+
738
+ # ============================================================
739
+ # SHARED: Visual check + Ship
740
+ # ============================================================
741
+
742
+ - name: check_svelte
743
+ type: decision
744
+ prompt: |
745
+ Check if any .svelte files were created or modified during this task.
746
+ Run: git diff --name-only HEAD $(git merge-base HEAD main)
747
+ Also check git status for untracked .svelte files.
748
+
749
+ Score 0-1:
750
+ **No .svelte changes (0.0-0.4):** No Svelte components were touched.
751
+ **Has .svelte changes (0.5-1.0):** One or more .svelte files were created or modified.
752
+ options: ["ship", "visual_test"]
753
+ thresholds: [0.5]
754
+ aiConfig:
755
+ model: claude-haiku-4-5
756
+
757
+ - name: visual_test
758
+ systemPrompt: |
759
+ Svelte files were changed in this task. You must run Forge visual tests to
760
+ verify the UI looks correct.
761
+
762
+ Read instructions/forge-testing.md for the full guide.
763
+
764
+ Steps:
765
+ 1. Identify which pages/routes are affected by the .svelte changes
766
+ 2. Check if visual tests already exist in test/ui/ for those pages
767
+ 3. If tests exist, run them: npx forge test/ui/<feature>.forge.ts
768
+ 4. If no tests exist, create them following the pattern in instructions/forge-testing.md:
769
+ - Use createImageRenderer with outputDir, stitchConfig, componentDir, template
770
+ - Capture at desktop (1920x1080), tablet (768x1024), mobile (375x812)
771
+ - Test relevant states (empty, loaded, error)
772
+ - Use mock data from test/helpers/mock_data.ts
773
+ 5. Review the screenshots in test/output/screenshots/ to verify the design looks correct
774
+ 6. If anything looks wrong, fix the Svelte components and re-run
775
+
776
+ Run all visual tests for affected pages and report results.
777
+ next: visual_review
778
+ aiConfig:
779
+ model: claude-sonnet-4-5
780
+
781
+ - name: visual_review
782
+ type: loop
783
+ prompt: Do the visual screenshots look correct? Are all Forge visual tests passing and do the pages render properly at all resolutions?
784
+ threshold: 0.85
785
+ loopTarget: visual_test
786
+ next: ship
787
+ aiConfig:
788
+ model: claude-sonnet-4-5
789
+
790
+ - name: ship
791
+ systemPrompt: |
792
+ Create a pull request with a clear description of the changes, linking back
793
+ to the issue. Comment on the issue summarizing what was done.
794
+ readOnly: true
795
+ postActions:
796
+ - pr.create
797
+ - issue.comment
798
+ aiConfig:
799
+ model: claude-sonnet-4-5
@@ -0,0 +1,6 @@
1
+ git:
2
+ branchPattern: bashlite/task-{issueNumber}
3
+ cleanup: true
4
+ defaults:
5
+ engine: anthropic
6
+ model: claude-sonnet-4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noego/app",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "Production build tool for Dinner/Forge apps.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -33,7 +33,7 @@
33
33
  "license": "MIT",
34
34
  "author": "App Build CLI",
35
35
  "dependencies": {
36
- "@noego/logger": "^0.0.1",
36
+ "@noego/logger": "^0.0.2",
37
37
  "deepmerge": "^4.3.1",
38
38
  "glob-parent": "^6.0.2",
39
39
  "http-proxy": "^1.18.1",
@@ -506,7 +506,7 @@ async function runSplitServeWithWatch(context, tsxExecutable, tsxArgs, baseEnv,
506
506
  logger.info(` Shared: ${sharedPatterns.length} patterns`);
507
507
  logger.info(` Backend: ${backendPatterns.length} patterns`);
508
508
  logger.info(` Frontend: ${frontendPatterns.length} patterns`);
509
- logger.info(` Watch targets (${watchTargets.size}): ${JSON.stringify(Array.from(watchTargets), null, 2)}`);
509
+ logger.info(` Watch targets (${watchTargets.size}): ${JSON.stringify(Array.from(watchTargets))}`);
510
510
 
511
511
  // Create matchers
512
512
  const sharedMatcher = sharedPatterns.length > 0 ? picomatch(sharedPatterns) : null;
@@ -1112,8 +1112,8 @@ async function runSplitServeWithWatch(context, tsxExecutable, tsxArgs, baseEnv,
1112
1112
  // Create watcher
1113
1113
  // Use cwd with relative patterns for proper glob support
1114
1114
  logger.info(`[WATCHER] Creating watcher with cwd: ${root}`);
1115
- logger.info(`[WATCHER] Patterns (classification only): ${JSON.stringify(allPatterns, null, 2)}`);
1116
- logger.info(`[WATCHER] Concrete targets: ${JSON.stringify(Array.from(watchTargets), null, 2)}`);
1115
+ logger.info(`[WATCHER] Patterns (classification only): ${JSON.stringify(allPatterns)}`);
1116
+ logger.info(`[WATCHER] Concrete targets: ${JSON.stringify(Array.from(watchTargets))}`);
1117
1117
 
1118
1118
  let watcher;
1119
1119
  try {
@@ -1270,7 +1270,7 @@ async function createWatcher(context, yamlConfig, configFilePath) {
1270
1270
  }
1271
1271
 
1272
1272
  logger.info('Watching for changes to restart server...');
1273
- logger.info(`[WATCHER] Concrete targets: ${JSON.stringify(Array.from(watchTargets), null, 2)}`);
1273
+ logger.info(`[WATCHER] Concrete targets: ${JSON.stringify(Array.from(watchTargets))}`);
1274
1274
  // Use cwd with relative targets for proper glob support
1275
1275
  let watcher;
1276
1276
  try {