oh-my-til 0.7.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.
package/manifest.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "oh-my-til",
3
+ "name": "Oh My TIL",
4
+ "version": "0.7.0",
5
+ "minAppVersion": "1.5.0",
6
+ "description": "Embedded Claude Code terminal for TIL learning workflows",
7
+ "author": "SongYunSeop",
8
+ "authorUrl": "https://github.com/SongYunSeop",
9
+ "isDesktopOnly": true
10
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "oh-my-til",
3
+ "version": "0.7.0",
4
+ "description": "Oh My TIL — Claude Code plugin for TIL learning workflow, with Obsidian integration",
5
+ "main": "main.js",
6
+ "bin": {
7
+ "oh-my-til": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "main.js",
12
+ "manifest.json",
13
+ "styles.css"
14
+ ],
15
+ "scripts": {
16
+ "dev": "node esbuild.config.mjs",
17
+ "build": "node esbuild.config.mjs production && node esbuild.cli.mjs",
18
+ "build:obsidian": "node esbuild.config.mjs production",
19
+ "build:cli": "node esbuild.cli.mjs",
20
+ "rebuild-pty": "npx @electron/rebuild -m node_modules/node-pty -v ${ELECTRON_VERSION:?'ELECTRON_VERSION 환경변수를 설정하세요 (예: ELECTRON_VERSION=37.10.2 npm run rebuild-pty)'}",
21
+ "deploy": "bash scripts/deploy.sh",
22
+ "check": "vitest run && node esbuild.config.mjs production && tsc --noEmit",
23
+ "test": "vitest run",
24
+ "migrate-links": "npx tsx scripts/migrate-links.ts"
25
+ },
26
+ "keywords": [
27
+ "claude",
28
+ "claude-code",
29
+ "til",
30
+ "learning",
31
+ "mcp",
32
+ "obsidian",
33
+ "obsidian-plugin",
34
+ "terminal"
35
+ ],
36
+ "author": "SongYunSeop",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/SongYunSeop/oh-my-til.git"
41
+ },
42
+ "homepage": "https://github.com/SongYunSeop/oh-my-til",
43
+ "bugs": {
44
+ "url": "https://github.com/SongYunSeop/oh-my-til/issues"
45
+ },
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.26.0",
48
+ "@xterm/addon-fit": "^0.10.0",
49
+ "@xterm/xterm": "^5.5.0",
50
+ "yaml": "^2.8.2",
51
+ "zod": "^4.3.6"
52
+ },
53
+ "devDependencies": {
54
+ "@electron/rebuild": "^3.6.0",
55
+ "@types/node": "^20.0.0",
56
+ "builtin-modules": "^3.3.0",
57
+ "esbuild": "^0.20.0",
58
+ "node-pty": "^1.0.0",
59
+ "obsidian": "^1.5.0",
60
+ "typescript": "^5.0.0",
61
+ "vitest": "^4.0.18"
62
+ }
63
+ }
package/styles.css ADDED
@@ -0,0 +1,664 @@
1
+ /* xterm.js core styles */
2
+
3
+ .xterm {
4
+ cursor: text;
5
+ position: relative;
6
+ user-select: none;
7
+ -ms-user-select: none;
8
+ -webkit-user-select: none;
9
+ }
10
+
11
+ .xterm.focus,
12
+ .xterm:focus {
13
+ outline: none;
14
+ }
15
+
16
+ .xterm .xterm-helpers {
17
+ position: absolute;
18
+ top: 0;
19
+ z-index: 5;
20
+ }
21
+
22
+ .xterm .xterm-helper-textarea {
23
+ padding: 0;
24
+ border: 0;
25
+ margin: 0;
26
+ position: absolute;
27
+ opacity: 0;
28
+ left: -9999em;
29
+ top: 0;
30
+ width: 0;
31
+ height: 0;
32
+ z-index: -5;
33
+ white-space: nowrap;
34
+ overflow: hidden;
35
+ resize: none;
36
+ }
37
+
38
+ .xterm .composition-view {
39
+ background: #000;
40
+ color: #FFF;
41
+ display: none;
42
+ position: absolute;
43
+ white-space: nowrap;
44
+ z-index: 1;
45
+ }
46
+
47
+ .xterm .composition-view.active {
48
+ display: block;
49
+ }
50
+
51
+ .xterm .xterm-viewport {
52
+ background-color: #000;
53
+ overflow-y: scroll;
54
+ cursor: default;
55
+ position: absolute;
56
+ right: 0;
57
+ left: 0;
58
+ top: 0;
59
+ bottom: 0;
60
+ }
61
+
62
+ .xterm .xterm-screen {
63
+ position: relative;
64
+ }
65
+
66
+ .xterm .xterm-screen canvas {
67
+ position: absolute;
68
+ left: 0;
69
+ top: 0;
70
+ }
71
+
72
+ .xterm .xterm-scroll-area {
73
+ visibility: hidden;
74
+ }
75
+
76
+ .xterm-char-measure-element {
77
+ display: inline-block;
78
+ visibility: hidden;
79
+ position: absolute;
80
+ top: 0;
81
+ left: -9999em;
82
+ line-height: normal;
83
+ }
84
+
85
+ .xterm.enable-mouse-events {
86
+ cursor: default;
87
+ }
88
+
89
+ .xterm.xterm-cursor-pointer,
90
+ .xterm .xterm-cursor-pointer {
91
+ cursor: pointer;
92
+ }
93
+
94
+ .xterm.column-select.focus {
95
+ cursor: crosshair;
96
+ }
97
+
98
+ .xterm .xterm-accessibility:not(.debug),
99
+ .xterm .xterm-message {
100
+ position: absolute;
101
+ left: 0;
102
+ top: 0;
103
+ bottom: 0;
104
+ right: 0;
105
+ z-index: 10;
106
+ color: transparent;
107
+ pointer-events: none;
108
+ }
109
+
110
+ .xterm .xterm-accessibility-tree:not(.debug) *::selection {
111
+ color: transparent;
112
+ }
113
+
114
+ .xterm .xterm-accessibility-tree {
115
+ user-select: text;
116
+ white-space: pre;
117
+ }
118
+
119
+ .xterm .live-region {
120
+ position: absolute;
121
+ left: -9999px;
122
+ width: 1px;
123
+ height: 1px;
124
+ overflow: hidden;
125
+ }
126
+
127
+ .xterm-dim {
128
+ opacity: 1 !important;
129
+ }
130
+
131
+ .xterm-underline-1 { text-decoration: underline; }
132
+ .xterm-underline-2 { text-decoration: double underline; }
133
+ .xterm-underline-3 { text-decoration: wavy underline; }
134
+ .xterm-underline-4 { text-decoration: dotted underline; }
135
+ .xterm-underline-5 { text-decoration: dashed underline; }
136
+
137
+ .xterm-overline {
138
+ text-decoration: overline;
139
+ }
140
+
141
+ .xterm-strikethrough {
142
+ text-decoration: line-through;
143
+ }
144
+
145
+ .xterm-screen .xterm-decoration-container .xterm-decoration {
146
+ z-index: 6;
147
+ position: absolute;
148
+ }
149
+
150
+ .xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer {
151
+ z-index: 7;
152
+ }
153
+
154
+ .xterm-decoration-overview-ruler {
155
+ z-index: 8;
156
+ position: absolute;
157
+ top: 0;
158
+ right: 0;
159
+ pointer-events: none;
160
+ }
161
+
162
+ .xterm-decoration-top {
163
+ z-index: 2;
164
+ position: relative;
165
+ }
166
+
167
+ /* Oh My TIL - Terminal Container */
168
+
169
+ /* Obsidian의 view-content 스크롤이 xterm 내부 스크롤과 충돌하지 않도록 차단 */
170
+ .workspace-leaf-content[data-type="oh-my-til-terminal-view"] .view-content {
171
+ overflow: hidden !important;
172
+ }
173
+
174
+ .oh-my-til-terminal-container {
175
+ height: 100%;
176
+ display: flex;
177
+ flex-direction: column;
178
+ background-color: var(--background-primary);
179
+ overflow: hidden;
180
+ }
181
+
182
+ .oh-my-til-terminal-content {
183
+ flex: 1;
184
+ min-height: 0;
185
+ overflow: hidden;
186
+ position: relative;
187
+ }
188
+
189
+ .oh-my-til-terminal-content .xterm {
190
+ height: 100%;
191
+ width: 100%;
192
+ padding: 4px;
193
+ }
194
+
195
+ .oh-my-til-terminal-content .xterm-viewport {
196
+ background-color: var(--background-primary) !important;
197
+ }
198
+
199
+ /* Oh My TIL - Dashboard */
200
+
201
+ .oh-my-til-dashboard {
202
+ overflow-y: auto;
203
+ height: 100%;
204
+ }
205
+
206
+ .oh-my-til-dashboard-content {
207
+ max-width: 980px;
208
+ margin: 0 auto;
209
+ padding: 16px 20px;
210
+ }
211
+
212
+ .oh-my-til-dashboard-header {
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: space-between;
216
+ margin-bottom: 20px;
217
+ }
218
+
219
+ .oh-my-til-dashboard-header h2 {
220
+ margin: 0;
221
+ color: var(--text-normal);
222
+ }
223
+
224
+ .oh-my-til-dashboard-refresh-btn {
225
+ color: var(--text-muted);
226
+ cursor: pointer;
227
+ }
228
+
229
+ .oh-my-til-dashboard-refresh-btn:hover {
230
+ color: var(--text-normal);
231
+ }
232
+
233
+ .oh-my-til-dashboard-empty {
234
+ color: var(--text-muted);
235
+ font-style: italic;
236
+ padding: 20px 0;
237
+ }
238
+
239
+ /* Summary Cards Row */
240
+
241
+ .oh-my-til-dashboard-cards-row {
242
+ display: flex;
243
+ gap: 12px;
244
+ flex-wrap: wrap;
245
+ margin-bottom: 24px;
246
+ }
247
+
248
+ .oh-my-til-dashboard-card {
249
+ background-color: var(--background-secondary);
250
+ border-radius: 8px;
251
+ padding: 14px 18px;
252
+ flex: 1;
253
+ min-width: 100px;
254
+ text-align: center;
255
+ }
256
+
257
+ .oh-my-til-dashboard-card-value {
258
+ font-size: 1.8em;
259
+ font-weight: 700;
260
+ color: var(--text-accent);
261
+ line-height: 1.2;
262
+ }
263
+
264
+ .oh-my-til-dashboard-card-label {
265
+ font-size: 0.8em;
266
+ color: var(--text-muted);
267
+ margin-top: 4px;
268
+ }
269
+
270
+ /* Heatmap */
271
+
272
+ .oh-my-til-dashboard-section {
273
+ margin-bottom: 24px;
274
+ }
275
+
276
+ .oh-my-til-dashboard-section h3 {
277
+ margin: 0 0 12px 0;
278
+ color: var(--text-normal);
279
+ font-size: 0.95em;
280
+ }
281
+
282
+ .oh-my-til-heatmap-body {
283
+ display: flex;
284
+ gap: 4px;
285
+ width: fit-content;
286
+ margin: 0 auto;
287
+ }
288
+
289
+ .oh-my-til-heatmap-day-labels {
290
+ display: grid;
291
+ grid-template-rows: repeat(7, 12px);
292
+ gap: 2px;
293
+ padding-top: 17px;
294
+ font-size: 10px;
295
+ color: var(--text-muted);
296
+ line-height: 12px;
297
+ text-align: right;
298
+ min-width: 24px;
299
+ flex-shrink: 0;
300
+ }
301
+
302
+ .oh-my-til-heatmap-scroll {
303
+ flex: 1;
304
+ min-width: 0;
305
+ }
306
+
307
+ .oh-my-til-heatmap-month-labels {
308
+ display: grid;
309
+ grid-auto-flow: column;
310
+ grid-auto-columns: 12px;
311
+ gap: 2px;
312
+ font-size: 10px;
313
+ color: var(--text-muted);
314
+ height: 16px;
315
+ line-height: 16px;
316
+ margin-bottom: 1px;
317
+ }
318
+
319
+ .oh-my-til-heatmap-month-label {
320
+ white-space: nowrap;
321
+ overflow: visible;
322
+ }
323
+
324
+ .oh-my-til-heatmap-grid {
325
+ display: grid;
326
+ grid-template-rows: repeat(7, 12px);
327
+ grid-auto-flow: column;
328
+ grid-auto-columns: 12px;
329
+ gap: 2px;
330
+ }
331
+
332
+ .oh-my-til-heatmap-legend {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 3px;
336
+ justify-content: flex-end;
337
+ font-size: 10px;
338
+ color: var(--text-muted);
339
+ margin-top: 8px;
340
+ }
341
+
342
+ .oh-my-til-heatmap-legend-cell {
343
+ width: 12px;
344
+ height: 12px;
345
+ border-radius: 2px;
346
+ }
347
+
348
+ .oh-my-til-heatmap-grid > div {
349
+ width: 12px;
350
+ height: 12px;
351
+ border-radius: 2px;
352
+ position: relative;
353
+ }
354
+
355
+ .oh-my-til-heatmap-grid > div[data-tooltip-date]:hover::before {
356
+ content: attr(data-tooltip-date);
357
+ position: absolute;
358
+ bottom: calc(100% + 6px);
359
+ left: 50%;
360
+ transform: translateX(-100%);
361
+ background: #555;
362
+ color: #fff;
363
+ padding: 3px 6px 3px 8px;
364
+ border-radius: 4px 0 0 4px;
365
+ font-size: 11px;
366
+ line-height: 1;
367
+ white-space: nowrap;
368
+ z-index: 100;
369
+ pointer-events: none;
370
+ }
371
+
372
+ .oh-my-til-heatmap-grid > div[data-tooltip-count]:hover::after {
373
+ content: attr(data-tooltip-count);
374
+ position: absolute;
375
+ bottom: calc(100% + 6px);
376
+ left: 50%;
377
+ background: var(--text-accent);
378
+ color: #fff;
379
+ padding: 3px 8px 3px 6px;
380
+ border-radius: 0 4px 4px 0;
381
+ font-size: 11px;
382
+ line-height: 1;
383
+ white-space: nowrap;
384
+ z-index: 100;
385
+ pointer-events: none;
386
+ }
387
+
388
+ .oh-my-til-heatmap-level-0 {
389
+ background-color: var(--background-modifier-border);
390
+ }
391
+
392
+ .oh-my-til-heatmap-level-1 {
393
+ background-color: color-mix(in srgb, var(--text-accent) 25%, var(--background-primary));
394
+ }
395
+
396
+ .oh-my-til-heatmap-level-2 {
397
+ background-color: color-mix(in srgb, var(--text-accent) 50%, var(--background-primary));
398
+ }
399
+
400
+ .oh-my-til-heatmap-level-3 {
401
+ background-color: color-mix(in srgb, var(--text-accent) 75%, var(--background-primary));
402
+ }
403
+
404
+ .oh-my-til-heatmap-level-4 {
405
+ background-color: var(--text-accent);
406
+ }
407
+
408
+ /* Interactive Categories */
409
+
410
+ .oh-my-til-dashboard-categories {
411
+ display: flex;
412
+ flex-direction: column;
413
+ gap: 4px;
414
+ }
415
+
416
+ .oh-my-til-dashboard-category-header {
417
+ display: grid;
418
+ grid-template-columns: auto 1fr auto;
419
+ gap: 8px;
420
+ align-items: center;
421
+ padding: 6px 8px;
422
+ border-radius: 6px;
423
+ cursor: pointer;
424
+ }
425
+
426
+ .oh-my-til-dashboard-category-header:hover {
427
+ background-color: var(--background-secondary);
428
+ }
429
+
430
+ .oh-my-til-dashboard-category-chevron {
431
+ font-size: 0.7em;
432
+ color: var(--text-muted);
433
+ transition: transform 0.2s ease;
434
+ width: 12px;
435
+ }
436
+
437
+ .oh-my-til-dashboard-category-chevron.is-open {
438
+ transform: rotate(90deg);
439
+ }
440
+
441
+ .oh-my-til-dashboard-category-name {
442
+ font-weight: 500;
443
+ color: var(--text-normal);
444
+ }
445
+
446
+ .oh-my-til-dashboard-category-count {
447
+ font-size: 0.85em;
448
+ color: var(--text-muted);
449
+ min-width: 30px;
450
+ text-align: right;
451
+ }
452
+
453
+ .oh-my-til-dashboard-bar-container {
454
+ grid-column: 1 / -1;
455
+ height: 4px;
456
+ background-color: var(--background-modifier-border);
457
+ border-radius: 2px;
458
+ overflow: hidden;
459
+ }
460
+
461
+ .oh-my-til-dashboard-bar {
462
+ height: 100%;
463
+ background-color: var(--text-accent);
464
+ border-radius: 2px;
465
+ transition: width 0.3s ease;
466
+ }
467
+
468
+ .oh-my-til-dashboard-category-files {
469
+ display: none;
470
+ padding: 4px 0 8px 20px;
471
+ }
472
+
473
+ .oh-my-til-dashboard-category-files.is-open {
474
+ display: block;
475
+ }
476
+
477
+ .oh-my-til-dashboard-file-item {
478
+ padding: 3px 8px;
479
+ font-size: 0.85em;
480
+ color: var(--text-muted);
481
+ cursor: pointer;
482
+ border-radius: 4px;
483
+ white-space: nowrap;
484
+ overflow: hidden;
485
+ text-overflow: ellipsis;
486
+ }
487
+
488
+ .oh-my-til-dashboard-file-item:hover {
489
+ color: var(--text-normal);
490
+ background-color: var(--background-secondary);
491
+ }
492
+
493
+ /* Recent Summaries */
494
+
495
+ .oh-my-til-recent-list {
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 8px;
499
+ }
500
+
501
+ .oh-my-til-recent-card {
502
+ padding: 10px 12px;
503
+ border-radius: 6px;
504
+ background-color: var(--background-secondary);
505
+ cursor: pointer;
506
+ transition: background-color 0.15s ease;
507
+ }
508
+
509
+ .oh-my-til-recent-card:hover {
510
+ background-color: var(--background-modifier-hover);
511
+ }
512
+
513
+ .oh-my-til-recent-card-header {
514
+ display: flex;
515
+ align-items: center;
516
+ gap: 8px;
517
+ margin-bottom: 4px;
518
+ }
519
+
520
+ .oh-my-til-recent-card-title {
521
+ font-weight: 500;
522
+ color: var(--text-normal);
523
+ white-space: nowrap;
524
+ overflow: hidden;
525
+ text-overflow: ellipsis;
526
+ }
527
+
528
+ .oh-my-til-recent-card-badge {
529
+ font-size: 0.75em;
530
+ padding: 1px 6px;
531
+ border-radius: 4px;
532
+ background-color: var(--background-modifier-border);
533
+ color: var(--text-muted);
534
+ white-space: nowrap;
535
+ flex-shrink: 0;
536
+ }
537
+
538
+ .oh-my-til-recent-card-date {
539
+ font-size: 0.75em;
540
+ color: var(--text-faint);
541
+ margin-left: auto;
542
+ white-space: nowrap;
543
+ flex-shrink: 0;
544
+ }
545
+
546
+ .oh-my-til-recent-card-summary {
547
+ font-size: 0.82em;
548
+ color: var(--text-muted);
549
+ line-height: 1.4;
550
+ display: -webkit-box;
551
+ -webkit-line-clamp: 2;
552
+ -webkit-box-orient: vertical;
553
+ overflow: hidden;
554
+ }
555
+
556
+ /* Random Review */
557
+
558
+ .oh-my-til-review-header {
559
+ display: flex;
560
+ align-items: center;
561
+ justify-content: space-between;
562
+ margin-bottom: 12px;
563
+ }
564
+
565
+ .oh-my-til-review-header h3 {
566
+ margin: 0;
567
+ color: var(--text-normal);
568
+ font-size: 0.95em;
569
+ }
570
+
571
+ .oh-my-til-review-refresh-btn {
572
+ color: var(--text-muted);
573
+ cursor: pointer;
574
+ }
575
+
576
+ .oh-my-til-review-refresh-btn:hover {
577
+ color: var(--text-normal);
578
+ }
579
+
580
+ .oh-my-til-review-cards {
581
+ display: flex;
582
+ gap: 10px;
583
+ }
584
+
585
+ .oh-my-til-review-card {
586
+ flex: 1;
587
+ padding: 10px 12px;
588
+ border-radius: 6px;
589
+ background-color: var(--background-secondary);
590
+ cursor: pointer;
591
+ transition: background-color 0.15s ease;
592
+ border-left: 3px solid var(--text-accent);
593
+ }
594
+
595
+ .oh-my-til-review-card:hover {
596
+ background-color: var(--background-modifier-hover);
597
+ }
598
+
599
+ .oh-my-til-review-card-header {
600
+ display: flex;
601
+ align-items: center;
602
+ gap: 6px;
603
+ margin-bottom: 6px;
604
+ }
605
+
606
+ .oh-my-til-review-card-type {
607
+ font-size: 0.7em;
608
+ font-weight: 600;
609
+ text-transform: uppercase;
610
+ padding: 1px 5px;
611
+ border-radius: 3px;
612
+ background-color: var(--text-accent);
613
+ color: var(--text-on-accent);
614
+ letter-spacing: 0.03em;
615
+ }
616
+
617
+ .oh-my-til-review-card-type--backlog {
618
+ background-color: var(--text-muted);
619
+ }
620
+
621
+ .oh-my-til-review-card-badge {
622
+ font-size: 0.75em;
623
+ padding: 1px 6px;
624
+ border-radius: 4px;
625
+ background-color: var(--background-modifier-border);
626
+ color: var(--text-muted);
627
+ white-space: nowrap;
628
+ }
629
+
630
+ .oh-my-til-review-card-title {
631
+ font-weight: 500;
632
+ color: var(--text-normal);
633
+ font-size: 0.9em;
634
+ white-space: nowrap;
635
+ overflow: hidden;
636
+ text-overflow: ellipsis;
637
+ }
638
+
639
+ /* Backlog Progress */
640
+
641
+ .oh-my-til-dashboard-backlog-overall {
642
+ margin-bottom: 16px;
643
+ }
644
+
645
+ .oh-my-til-dashboard-backlog-overall-text {
646
+ font-size: 0.85em;
647
+ color: var(--text-muted);
648
+ margin-bottom: 6px;
649
+ }
650
+
651
+ .oh-my-til-dashboard-progress-bar-bg {
652
+ height: 8px;
653
+ background-color: var(--background-modifier-border);
654
+ border-radius: 4px;
655
+ overflow: hidden;
656
+ }
657
+
658
+ .oh-my-til-dashboard-progress-bar-fill {
659
+ height: 100%;
660
+ background-color: var(--text-accent);
661
+ border-radius: 4px;
662
+ transition: width 0.3s ease;
663
+ }
664
+