pattyeng 1.0.4 → 1.0.6

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 (99) hide show
  1. package/README.md +98 -44
  2. package/bin/pattyeng.js +20 -14
  3. package/lib/skills.js +170 -0
  4. package/lib/upgrade.js +46 -0
  5. package/package.json +5 -3
  6. package/skills/.system/.codex-system-skills.marker +1 -0
  7. package/skills/.system/imagegen/LICENSE.txt +201 -0
  8. package/skills/.system/imagegen/SKILL.md +356 -0
  9. package/skills/.system/imagegen/agents/openai.yaml +6 -0
  10. package/skills/.system/imagegen/assets/imagegen-small.svg +5 -0
  11. package/skills/.system/imagegen/assets/imagegen.png +0 -0
  12. package/skills/.system/imagegen/references/cli.md +242 -0
  13. package/skills/.system/imagegen/references/codex-network.md +33 -0
  14. package/skills/.system/imagegen/references/image-api.md +90 -0
  15. package/skills/.system/imagegen/references/prompting.md +118 -0
  16. package/skills/.system/imagegen/references/sample-prompts.md +433 -0
  17. package/skills/.system/imagegen/scripts/image_gen.py +995 -0
  18. package/skills/.system/imagegen/scripts/remove_chroma_key.py +440 -0
  19. package/skills/.system/openai-docs/LICENSE.txt +201 -0
  20. package/skills/.system/openai-docs/SKILL.md +167 -0
  21. package/skills/.system/openai-docs/agents/openai.yaml +14 -0
  22. package/skills/.system/openai-docs/assets/openai-small.svg +3 -0
  23. package/skills/.system/openai-docs/assets/openai.png +0 -0
  24. package/skills/.system/openai-docs/references/latest-model.md +37 -0
  25. package/skills/.system/openai-docs/references/prompting-guide.md +244 -0
  26. package/skills/.system/openai-docs/references/upgrade-guide.md +181 -0
  27. package/skills/.system/openai-docs/scripts/fetch-codex-manual.mjs +598 -0
  28. package/skills/.system/openai-docs/scripts/resolve-latest-model-info.js +147 -0
  29. package/skills/.system/plugin-creator/SKILL.md +243 -0
  30. package/skills/.system/plugin-creator/agents/openai.yaml +6 -0
  31. package/skills/.system/plugin-creator/assets/plugin-creator-small.svg +3 -0
  32. package/skills/.system/plugin-creator/assets/plugin-creator.png +0 -0
  33. package/skills/.system/plugin-creator/references/installing-and-updating.md +143 -0
  34. package/skills/.system/plugin-creator/references/plugin-json-spec.md +194 -0
  35. package/skills/.system/plugin-creator/scripts/create_basic_plugin.py +324 -0
  36. package/skills/.system/plugin-creator/scripts/read_marketplace_name.py +48 -0
  37. package/skills/.system/plugin-creator/scripts/update_plugin_cachebuster.py +78 -0
  38. package/skills/.system/plugin-creator/scripts/validate_plugin.py +586 -0
  39. package/skills/.system/skill-creator/SKILL.md +416 -0
  40. package/skills/.system/skill-creator/agents/openai.yaml +5 -0
  41. package/skills/.system/skill-creator/assets/skill-creator-small.svg +3 -0
  42. package/skills/.system/skill-creator/assets/skill-creator.png +0 -0
  43. package/skills/.system/skill-creator/license.txt +202 -0
  44. package/skills/.system/skill-creator/references/openai_yaml.md +49 -0
  45. package/skills/.system/skill-creator/scripts/generate_openai_yaml.py +226 -0
  46. package/skills/.system/skill-creator/scripts/init_skill.py +400 -0
  47. package/skills/.system/skill-creator/scripts/quick_validate.py +101 -0
  48. package/skills/.system/skill-installer/LICENSE.txt +202 -0
  49. package/skills/.system/skill-installer/SKILL.md +58 -0
  50. package/skills/.system/skill-installer/agents/openai.yaml +5 -0
  51. package/skills/.system/skill-installer/assets/skill-installer-small.svg +3 -0
  52. package/skills/.system/skill-installer/assets/skill-installer.png +0 -0
  53. package/skills/.system/skill-installer/scripts/github_utils.py +21 -0
  54. package/skills/.system/skill-installer/scripts/install-skill-from-github.py +308 -0
  55. package/skills/.system/skill-installer/scripts/list-skills.py +107 -0
  56. package/skills/cap/SKILL.md +77 -0
  57. package/skills/caveman/SKILL.md +49 -0
  58. package/skills/code-review/SKILL.md +46 -0
  59. package/skills/codebook/SKILL.md +184 -0
  60. package/skills/doc-review/SKILL.md +147 -0
  61. package/skills/feature-research/SKILL.md +34 -0
  62. package/skills/file-op/SKILL.md +116 -0
  63. package/skills/grill-me/SKILL.md +10 -0
  64. package/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  65. package/skills/grill-with-docs/CONTEXT-FORMAT.md +60 -0
  66. package/skills/grill-with-docs/SKILL.md +88 -0
  67. package/skills/handoff/SKILL.md +17 -0
  68. package/skills/improve-codebase/SKILL.md +79 -0
  69. package/skills/linear/SKILL.md +107 -0
  70. package/skills/next-step/SKILL.md +61 -0
  71. package/skills/no-reinvent/SKILL.md +131 -0
  72. package/skills/no-wall/SKILL.md +146 -0
  73. package/skills/online/SKILL.md +54 -0
  74. package/skills/plan-review/SKILL.md +55 -0
  75. package/skills/professional/SKILL.md +111 -0
  76. package/skills/promise-tracking/SKILL.md +131 -0
  77. package/skills/prove/SKILL.md +135 -0
  78. package/skills/read-before-write/SKILL.md +123 -0
  79. package/skills/review/SKILL.md +78 -0
  80. package/skills/review-mp/SKILL.md +78 -0
  81. package/skills/scope-boundary/SKILL.md +121 -0
  82. package/skills/semble-search/SKILL.md +40 -0
  83. package/skills/sitrep/SKILL.md +126 -0
  84. package/skills/structure-code/SKILL.md +116 -0
  85. package/skills/surface-assumptions/SKILL.md +139 -0
  86. package/skills/teach/GLOSSARY-FORMAT.md +35 -0
  87. package/skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
  88. package/skills/teach/MISSION-FORMAT.md +31 -0
  89. package/skills/teach/RESOURCES-FORMAT.md +32 -0
  90. package/skills/teach/SKILL.md +131 -0
  91. package/skills/team-protocol/SKILL.md +172 -0
  92. package/skills/tech-lead/SKILL.md +332 -0
  93. package/skills/to-issues/SKILL.md +83 -0
  94. package/skills/to-prd/SKILL.md +74 -0
  95. package/skills/vectorbt-expert/SKILL.md +253 -0
  96. package/skills/verify-done/SKILL.md +128 -0
  97. package/skills/work-log/SKILL.md +141 -0
  98. package/skills/work-log/template.html +496 -0
  99. package/skills/zoom-out/SKILL.md +7 -0
@@ -0,0 +1,496 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Work Log — {{TITLE}}</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
10
+ <style>
11
+ /* ─── Design Tokens ─── */
12
+ :root {
13
+ --bg-deep: #0d0c0b;
14
+ --bg: #141312;
15
+ --bg-elevated: #1c1a18;
16
+ --bg-card: #211f1c;
17
+ --bg-card-hover: #2a2723;
18
+ --border: rgba(255, 235, 200, 0.07);
19
+ --border-accent: rgba(232, 178, 80, 0.25);
20
+ --text: #d4cfc7;
21
+ --text-secondary: #9e978c;
22
+ --text-muted: #6b655b;
23
+ --text-heading: #f2ece2;
24
+ --accent: #e8b250;
25
+ --accent-glow: rgba(232, 178, 80, 0.15);
26
+ --accent-dim: rgba(232, 178, 80, 0.08);
27
+ --accent-bright: #f5c96a;
28
+ --success: #7ec87e;
29
+ --success-bg: rgba(126, 200, 126, 0.08);
30
+ --warning: #e8a64e;
31
+ --danger: #d46b6b;
32
+ --danger-bg: rgba(212, 107, 107, 0.08);
33
+ --code-bg: #181614;
34
+ --code-text: #e8b250;
35
+ --tag-bg: rgba(232, 178, 80, 0.1);
36
+ --tag-border: rgba(232, 178, 80, 0.2);
37
+ --tag-text: #e8b250;
38
+ --font-display: 'DM Serif Display', Georgia, 'Times New Roman', serif;
39
+ --font-body: 'DM Sans', system-ui, -apple-system, sans-serif;
40
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, monospace;
41
+ --radius-sm: 6px;
42
+ --radius-md: 10px;
43
+ --radius-lg: 14px;
44
+ --shadow-ambient: 0 1px 3px rgba(0,0,0,0.3), 0 8px 24px rgba(0,0,0,0.15);
45
+ --shadow-elevated: 0 4px 12px rgba(0,0,0,0.35), 0 16px 40px rgba(0,0,0,0.25);
46
+ --transition-fast: 0.15s ease;
47
+ --transition-smooth: 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
48
+ }
49
+
50
+ /* ─── Reset & Base ─── */
51
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
52
+
53
+ html {
54
+ font-size: 16px;
55
+ -webkit-font-smoothing: antialiased;
56
+ -moz-osx-font-smoothing: grayscale;
57
+ }
58
+
59
+ body {
60
+ font-family: var(--font-body);
61
+ background: var(--bg-deep);
62
+ color: var(--text);
63
+ line-height: 1.75;
64
+ min-height: 100vh;
65
+ overflow-x: hidden;
66
+ }
67
+
68
+ /* ─── Ambient Background ─── */
69
+ body::before {
70
+ content: '';
71
+ position: fixed;
72
+ inset: 0;
73
+ background:
74
+ radial-gradient(ellipse 60% 50% at 20% 0%, rgba(232, 178, 80, 0.04) 0%, transparent 70%),
75
+ radial-gradient(ellipse 40% 40% at 80% 100%, rgba(232, 178, 80, 0.03) 0%, transparent 60%);
76
+ pointer-events: none;
77
+ z-index: 0;
78
+ }
79
+
80
+ /* Noise texture overlay */
81
+ body::after {
82
+ content: '';
83
+ position: fixed;
84
+ inset: 0;
85
+ opacity: 0.025;
86
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
87
+ background-size: 200px;
88
+ pointer-events: none;
89
+ z-index: 0;
90
+ }
91
+
92
+ /* ─── Page Layout ─── */
93
+ .page {
94
+ position: relative;
95
+ z-index: 1;
96
+ max-width: 56rem;
97
+ margin: 0 auto;
98
+ padding: 3rem 2rem 6rem;
99
+ }
100
+
101
+ /* ─── Header ─── */
102
+ .header {
103
+ margin-bottom: 3rem;
104
+ animation: fadeSlideDown 0.6s ease both;
105
+ }
106
+
107
+ .header-label {
108
+ display: inline-flex;
109
+ align-items: center;
110
+ gap: 0.5rem;
111
+ font-family: var(--font-mono);
112
+ font-size: 0.7rem;
113
+ font-weight: 500;
114
+ text-transform: uppercase;
115
+ letter-spacing: 0.12em;
116
+ color: var(--accent);
117
+ margin-bottom: 1rem;
118
+ }
119
+
120
+ .header-label::before {
121
+ content: '';
122
+ width: 20px;
123
+ height: 1px;
124
+ background: var(--accent);
125
+ }
126
+
127
+ .header h1 {
128
+ font-family: var(--font-display);
129
+ font-size: clamp(2rem, 5vw, 3rem);
130
+ font-weight: 400;
131
+ color: var(--text-heading);
132
+ line-height: 1.15;
133
+ letter-spacing: -0.01em;
134
+ margin-bottom: 1.25rem;
135
+ }
136
+
137
+ .meta {
138
+ display: flex;
139
+ flex-wrap: wrap;
140
+ gap: 0.5rem;
141
+ align-items: center;
142
+ }
143
+
144
+ .meta-tag {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ gap: 0.35rem;
148
+ padding: 0.3rem 0.75rem;
149
+ background: var(--tag-bg);
150
+ border: 1px solid var(--tag-border);
151
+ border-radius: 999px;
152
+ font-size: 0.78rem;
153
+ font-weight: 500;
154
+ color: var(--tag-text);
155
+ font-family: var(--font-mono);
156
+ }
157
+
158
+ .meta-tag.date {
159
+ background: var(--success-bg);
160
+ border-color: rgba(126, 200, 126, 0.2);
161
+ color: var(--success);
162
+ }
163
+
164
+ .meta-divider {
165
+ width: 1px;
166
+ height: 16px;
167
+ background: var(--border);
168
+ }
169
+
170
+ /* ─── Summary Banner ─── */
171
+ .summary {
172
+ position: relative;
173
+ padding: 1.25rem 1.5rem;
174
+ background: var(--accent-dim);
175
+ border-left: 3px solid var(--accent);
176
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
177
+ font-size: 0.95rem;
178
+ color: var(--text-heading);
179
+ line-height: 1.7;
180
+ margin-bottom: 3rem;
181
+ animation: fadeSlideDown 0.6s ease 0.1s both;
182
+ }
183
+
184
+ .summary::before {
185
+ content: '';
186
+ position: absolute;
187
+ inset: 0;
188
+ border-radius: inherit;
189
+ background: linear-gradient(135deg, rgba(232, 178, 80, 0.06), transparent 60%);
190
+ pointer-events: none;
191
+ }
192
+
193
+ /* ─── Sections ─── */
194
+ .section {
195
+ margin-bottom: 2.5rem;
196
+ animation: fadeSlideUp 0.5s ease both;
197
+ }
198
+
199
+ .section:nth-child(1) { animation-delay: 0.15s; }
200
+ .section:nth-child(2) { animation-delay: 0.25s; }
201
+ .section:nth-child(3) { animation-delay: 0.35s; }
202
+ .section:nth-child(4) { animation-delay: 0.45s; }
203
+
204
+ .section-header {
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 0.6rem;
208
+ margin-bottom: 1.25rem;
209
+ padding-bottom: 0.75rem;
210
+ border-bottom: 1px solid var(--border);
211
+ }
212
+
213
+ .section-icon {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ width: 28px;
218
+ height: 28px;
219
+ border-radius: var(--radius-sm);
220
+ background: var(--accent-dim);
221
+ font-size: 0.85rem;
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .section h2 {
226
+ font-family: var(--font-display);
227
+ font-size: 1.35rem;
228
+ font-weight: 400;
229
+ color: var(--text-heading);
230
+ letter-spacing: -0.01em;
231
+ }
232
+
233
+ /* ─── Content Cards ─── */
234
+ .content-card {
235
+ background: var(--bg-card);
236
+ border: 1px solid var(--border);
237
+ border-radius: var(--radius-lg);
238
+ padding: 1.25rem 1.5rem;
239
+ transition: border-color var(--transition-smooth);
240
+ }
241
+
242
+ .content-card:hover {
243
+ border-color: rgba(255, 235, 200, 0.12);
244
+ }
245
+
246
+ .findings-card {
247
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(232, 178, 80, 0.03) 100%);
248
+ border-color: var(--border-accent);
249
+ }
250
+
251
+ .next-steps-card {
252
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(126, 200, 126, 0.03) 100%);
253
+ border-color: rgba(126, 200, 126, 0.15);
254
+ }
255
+
256
+ /* ─── Lists ─── */
257
+ ul, ol {
258
+ padding-left: 1.25rem;
259
+ }
260
+
261
+ li {
262
+ margin-bottom: 0.5rem;
263
+ color: var(--text);
264
+ line-height: 1.7;
265
+ }
266
+
267
+ li:last-child {
268
+ margin-bottom: 0;
269
+ }
270
+
271
+ li::marker {
272
+ color: var(--text-muted);
273
+ }
274
+
275
+ ul li::marker {
276
+ content: '→ ';
277
+ font-size: 0.85em;
278
+ }
279
+
280
+ ol li::marker {
281
+ color: var(--accent);
282
+ font-weight: 600;
283
+ font-family: var(--font-mono);
284
+ font-size: 0.82em;
285
+ }
286
+
287
+ /* Nested list styling */
288
+ li ul, li ol {
289
+ margin-top: 0.35rem;
290
+ padding-left: 1.1rem;
291
+ }
292
+
293
+ li ul li::marker {
294
+ content: '◦ ';
295
+ color: var(--text-muted);
296
+ font-size: 0.8em;
297
+ }
298
+
299
+ /* ─── Inline Elements ─── */
300
+ code {
301
+ background: var(--code-bg);
302
+ border: 1px solid var(--border);
303
+ padding: 0.12rem 0.45rem;
304
+ border-radius: 4px;
305
+ font-size: 0.85em;
306
+ font-family: var(--font-mono);
307
+ font-weight: 500;
308
+ color: var(--code-text);
309
+ }
310
+
311
+ strong {
312
+ color: var(--text-heading);
313
+ font-weight: 600;
314
+ }
315
+
316
+ a {
317
+ color: var(--accent);
318
+ text-decoration: none;
319
+ border-bottom: 1px solid rgba(232, 178, 80, 0.3);
320
+ transition: border-color var(--transition-fast);
321
+ }
322
+
323
+ a:hover {
324
+ border-color: var(--accent);
325
+ }
326
+
327
+ /* File path references */
328
+ .file-ref, code.file-ref {
329
+ color: var(--text-muted);
330
+ font-family: var(--font-mono);
331
+ font-size: 0.84em;
332
+ }
333
+
334
+ /* Status indicators */
335
+ .status-ok { color: var(--success); }
336
+ .status-warn { color: var(--warning); }
337
+ .status-bad { color: var(--danger); }
338
+
339
+ /* ─── Footer ─── */
340
+ .footer {
341
+ margin-top: 4rem;
342
+ padding-top: 1.5rem;
343
+ border-top: 1px solid var(--border);
344
+ display: flex;
345
+ justify-content: space-between;
346
+ align-items: center;
347
+ animation: fadeSlideUp 0.5s ease 0.55s both;
348
+ }
349
+
350
+ .footer-text {
351
+ font-family: var(--font-mono);
352
+ font-size: 0.72rem;
353
+ color: var(--text-muted);
354
+ letter-spacing: 0.03em;
355
+ }
356
+
357
+ .footer-line {
358
+ width: 40px;
359
+ height: 2px;
360
+ background: linear-gradient(90deg, var(--accent), transparent);
361
+ border-radius: 1px;
362
+ }
363
+
364
+ /* ─── Animations ─── */
365
+ @keyframes fadeSlideDown {
366
+ from {
367
+ opacity: 0;
368
+ transform: translateY(-12px);
369
+ }
370
+ to {
371
+ opacity: 1;
372
+ transform: translateY(0);
373
+ }
374
+ }
375
+
376
+ @keyframes fadeSlideUp {
377
+ from {
378
+ opacity: 0;
379
+ transform: translateY(16px);
380
+ }
381
+ to {
382
+ opacity: 1;
383
+ transform: translateY(0);
384
+ }
385
+ }
386
+
387
+ /* Respect reduced motion preference */
388
+ @media (prefers-reduced-motion: reduce) {
389
+ *, *::before, *::after {
390
+ animation-duration: 0.01ms !important;
391
+ animation-delay: 0ms !important;
392
+ transition-duration: 0.01ms !important;
393
+ }
394
+ }
395
+
396
+ /* ─── Responsive ─── */
397
+ @media (max-width: 640px) {
398
+ .page {
399
+ padding: 2rem 1.25rem 4rem;
400
+ }
401
+
402
+ .header h1 {
403
+ font-size: 1.75rem;
404
+ }
405
+
406
+ .summary {
407
+ padding: 1rem 1.25rem;
408
+ }
409
+
410
+ .content-card {
411
+ padding: 1rem 1.25rem;
412
+ }
413
+
414
+ .footer {
415
+ flex-direction: column;
416
+ gap: 0.75rem;
417
+ align-items: flex-start;
418
+ }
419
+ }
420
+
421
+ /* ─── Print styles ─── */
422
+ @media print {
423
+ body::before, body::after { display: none; }
424
+ .page { max-width: 100%; padding: 0; }
425
+ .content-card { break-inside: avoid; }
426
+ }
427
+ </style>
428
+ </head>
429
+ <body>
430
+
431
+ <div class="page">
432
+
433
+ <!-- HEADER -->
434
+ <header class="header">
435
+ <div class="header-label">Work Log</div>
436
+ <h1>{{TITLE}}</h1>
437
+ <div class="meta">
438
+ <span class="meta-tag date">{{DATE}}</span>
439
+ <span class="meta-divider"></span>
440
+ <span class="meta-tag">{{TIME}}</span>
441
+ </div>
442
+ </header>
443
+
444
+ <!-- SUMMARY -->
445
+ <div class="summary">{{SUMMARY}}</div>
446
+
447
+ <!-- WHAT WE DID -->
448
+ <div class="section">
449
+ <div class="section-header">
450
+ <span class="section-icon">✏️</span>
451
+ <h2>What We Did</h2>
452
+ </div>
453
+ {{WHAT_WE_DID}}
454
+ </div>
455
+
456
+ <!-- KEY FINDINGS -->
457
+ <div class="section">
458
+ <div class="section-header">
459
+ <span class="section-icon">🔍</span>
460
+ <h2>Key Findings</h2>
461
+ </div>
462
+ <div class="content-card findings-card">
463
+ {{KEY_FINDINGS}}
464
+ </div>
465
+ </div>
466
+
467
+ <!-- CURRENT STATE -->
468
+ <div class="section">
469
+ <div class="section-header">
470
+ <span class="section-icon">📍</span>
471
+ <h2>Current State</h2>
472
+ </div>
473
+ {{CURRENT_STATE}}
474
+ </div>
475
+
476
+ <!-- NEXT STEPS -->
477
+ <div class="section">
478
+ <div class="section-header">
479
+ <span class="section-icon">➡️</span>
480
+ <h2>Next Steps</h2>
481
+ </div>
482
+ <div class="content-card next-steps-card">
483
+ {{NEXT_STEPS}}
484
+ </div>
485
+ </div>
486
+
487
+ <!-- FOOTER -->
488
+ <div class="footer">
489
+ <span class="footer-text">Generated on {{DATE}} at {{TIME}}</span>
490
+ <span class="footer-line"></span>
491
+ </div>
492
+
493
+ </div>
494
+
495
+ </body>
496
+ </html>
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: zoom-out
3
+ description: Tell the agent to zoom out and give broader context or a higher-level perspective. Use when you're unfamiliar with a section of code or need to understand how it fits into the bigger picture.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ I don't know this area of code well. Go up a layer of abstraction. Give me a map of all the relevant modules and callers, using the project's domain glossary vocabulary.