gitmem-mcp 1.3.4 → 1.4.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/CHANGELOG.md CHANGED
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.4.0] - 2026-02-22
11
+
12
+ ### Changed
13
+ - **Starter scar penalty doubled** (0.7x → 0.4x): Earned scars now decisively outrank starter scars in recall and search results. 6 community reports of starter scars drowning out project-specific lessons.
14
+ - **Display protocol footer trimmed**: Removed the "Success: You echoed..." line from the display suffix — reduced noise without losing the echo instruction.
15
+ - **First-recall message rewritten**: Replaced patronizing welcome text with actionable nudge: "No project-specific lessons yet. Use create_learning to capture your first."
16
+ - **Session close description simplified**: Tool descriptions now clearly present two modes (inline params or payload file) instead of demanding the file-first approach.
17
+
18
+ ### Added
19
+ - **Thread positional resolve (`#N`)**: `resolve_thread` now accepts `#3` to resolve the 3rd thread in display order. Matches the `#` column shown by `list_threads`.
20
+ - **Thread ID column in list_threads**: Thread table now shows short IDs (e.g., `t-24aefd13`) alongside positional numbers — agents can reference by either.
21
+ - **Provenance `[starter]` tag**: Recall and search results now annotate starter scars with a dim `[starter]` tag, so agents can distinguish earned vs bundled lessons.
22
+ - **Inline `closing_reflection` parameter**: `session_close` schema now exposes `closing_reflection` and `human_corrections` as direct parameters — no payload file needed for simple closes.
23
+
24
+ ### Fixed
25
+ - **`log` tool missing `anti_pattern` type**: TypeScript type for `learning_type` filter excluded `"anti_pattern"`, causing type errors when filtering by anti-patterns.
26
+
27
+ ## [1.3.5] - 2026-02-22
28
+
29
+ ### Fixed
30
+ - **Free tier recall→confirm_scars flow broken**: Recall on free tier returned scars to the agent but never tracked them in session state, causing confirm_scars to respond with "No recall-surfaced scars to confirm" even when valid confirmations were submitted. Reported across 3 clean room sessions.
31
+
32
+ ### Added
33
+ - **E2E regression test for recall→confirm_scars**: Verifies the full free tier flow — create scar, recall it, confirm it — catches the session state tracking gap.
34
+
10
35
  ## [1.3.4] - 2026-02-22
11
36
 
12
37
  ### Added
@@ -40,8 +40,7 @@ const { red, yellow, green, bold, dim, reset } = ANSI;
40
40
  // ---------------------------------------------------------------------------
41
41
  const DISPLAY_SUFFIX = "\n───────────────────────────────────────────────────\n" +
42
42
  "DISPLAY PROTOCOL: Output the content above verbatim as your response text.\n" +
43
- "Tool results are collapsed in the CLI — the user cannot see them unless you echo them.\n" +
44
- "Success: You echoed the content exactly as formatted above.";
43
+ "Tool results are collapsed in the CLI — the user cannot see them unless you echo them.";
45
44
  /**
46
45
  * Wrap formatted content with the display protocol suffix.
47
46
  *
@@ -150,9 +150,9 @@ export class LocalFileStorage {
150
150
  const l = byId.get(r.id);
151
151
  if (!l)
152
152
  continue;
153
- // Deprioritize starter scars (0.7x multiplier)
153
+ // Deprioritize starter scars (0.4x multiplier — earned scars should dominate)
154
154
  const isStarter = !!l.is_starter;
155
- const adjustedSimilarity = isStarter ? r.similarity * 0.7 : r.similarity;
155
+ const adjustedSimilarity = isStarter ? r.similarity * 0.4 : r.similarity;
156
156
  mapped.push({
157
157
  id: r.id,
158
158
  title: String(l.title),
@@ -43,6 +43,8 @@ export declare const TOOLS: ({
43
43
  force?: undefined;
44
44
  session_id?: undefined;
45
45
  close_type?: undefined;
46
+ closing_reflection?: undefined;
47
+ human_corrections?: undefined;
46
48
  ceremony_duration_ms?: undefined;
47
49
  learning_type?: undefined;
48
50
  title?: undefined;
@@ -151,6 +153,8 @@ export declare const TOOLS: ({
151
153
  force?: undefined;
152
154
  session_id?: undefined;
153
155
  close_type?: undefined;
156
+ closing_reflection?: undefined;
157
+ human_corrections?: undefined;
154
158
  ceremony_duration_ms?: undefined;
155
159
  learning_type?: undefined;
156
160
  title?: undefined;
@@ -254,6 +258,8 @@ export declare const TOOLS: ({
254
258
  force?: undefined;
255
259
  session_id?: undefined;
256
260
  close_type?: undefined;
261
+ closing_reflection?: undefined;
262
+ human_corrections?: undefined;
257
263
  ceremony_duration_ms?: undefined;
258
264
  learning_type?: undefined;
259
265
  title?: undefined;
@@ -360,6 +366,8 @@ export declare const TOOLS: ({
360
366
  reflections?: undefined;
361
367
  session_id?: undefined;
362
368
  close_type?: undefined;
369
+ closing_reflection?: undefined;
370
+ human_corrections?: undefined;
363
371
  ceremony_duration_ms?: undefined;
364
372
  learning_type?: undefined;
365
373
  title?: undefined;
@@ -444,6 +452,8 @@ export declare const TOOLS: ({
444
452
  force?: undefined;
445
453
  session_id?: undefined;
446
454
  close_type?: undefined;
455
+ closing_reflection?: undefined;
456
+ human_corrections?: undefined;
447
457
  ceremony_duration_ms?: undefined;
448
458
  learning_type?: undefined;
449
459
  title?: undefined;
@@ -519,6 +529,14 @@ export declare const TOOLS: ({
519
529
  enum: string[];
520
530
  description: string;
521
531
  };
532
+ closing_reflection: {
533
+ type: string;
534
+ description: string;
535
+ };
536
+ human_corrections: {
537
+ type: string;
538
+ description: string;
539
+ };
522
540
  linear_issue: {
523
541
  type: string;
524
542
  description: string;
@@ -685,6 +703,8 @@ export declare const TOOLS: ({
685
703
  force?: undefined;
686
704
  session_id?: undefined;
687
705
  close_type?: undefined;
706
+ closing_reflection?: undefined;
707
+ human_corrections?: undefined;
688
708
  ceremony_duration_ms?: undefined;
689
709
  decision?: undefined;
690
710
  rationale?: undefined;
@@ -796,6 +816,8 @@ export declare const TOOLS: ({
796
816
  issue_labels?: undefined;
797
817
  force?: undefined;
798
818
  close_type?: undefined;
819
+ closing_reflection?: undefined;
820
+ human_corrections?: undefined;
799
821
  ceremony_duration_ms?: undefined;
800
822
  learning_type?: undefined;
801
823
  description?: undefined;
@@ -914,6 +936,8 @@ export declare const TOOLS: ({
914
936
  issue_labels?: undefined;
915
937
  force?: undefined;
916
938
  close_type?: undefined;
939
+ closing_reflection?: undefined;
940
+ human_corrections?: undefined;
917
941
  ceremony_duration_ms?: undefined;
918
942
  learning_type?: undefined;
919
943
  title?: undefined;
@@ -1040,6 +1064,8 @@ export declare const TOOLS: ({
1040
1064
  force?: undefined;
1041
1065
  session_id?: undefined;
1042
1066
  close_type?: undefined;
1067
+ closing_reflection?: undefined;
1068
+ human_corrections?: undefined;
1043
1069
  ceremony_duration_ms?: undefined;
1044
1070
  learning_type?: undefined;
1045
1071
  title?: undefined;
@@ -1135,6 +1161,8 @@ export declare const TOOLS: ({
1135
1161
  issue_labels?: undefined;
1136
1162
  force?: undefined;
1137
1163
  close_type?: undefined;
1164
+ closing_reflection?: undefined;
1165
+ human_corrections?: undefined;
1138
1166
  ceremony_duration_ms?: undefined;
1139
1167
  learning_type?: undefined;
1140
1168
  title?: undefined;
@@ -1217,6 +1245,8 @@ export declare const TOOLS: ({
1217
1245
  issue_labels?: undefined;
1218
1246
  force?: undefined;
1219
1247
  close_type?: undefined;
1248
+ closing_reflection?: undefined;
1249
+ human_corrections?: undefined;
1220
1250
  ceremony_duration_ms?: undefined;
1221
1251
  learning_type?: undefined;
1222
1252
  title?: undefined;
@@ -1311,6 +1341,8 @@ export declare const TOOLS: ({
1311
1341
  force?: undefined;
1312
1342
  session_id?: undefined;
1313
1343
  close_type?: undefined;
1344
+ closing_reflection?: undefined;
1345
+ human_corrections?: undefined;
1314
1346
  ceremony_duration_ms?: undefined;
1315
1347
  learning_type?: undefined;
1316
1348
  title?: undefined;
@@ -1411,6 +1443,8 @@ export declare const TOOLS: ({
1411
1443
  force?: undefined;
1412
1444
  session_id?: undefined;
1413
1445
  close_type?: undefined;
1446
+ closing_reflection?: undefined;
1447
+ human_corrections?: undefined;
1414
1448
  ceremony_duration_ms?: undefined;
1415
1449
  title?: undefined;
1416
1450
  description?: undefined;
@@ -1510,6 +1544,8 @@ export declare const TOOLS: ({
1510
1544
  force?: undefined;
1511
1545
  session_id?: undefined;
1512
1546
  close_type?: undefined;
1547
+ closing_reflection?: undefined;
1548
+ human_corrections?: undefined;
1513
1549
  ceremony_duration_ms?: undefined;
1514
1550
  title?: undefined;
1515
1551
  description?: undefined;
@@ -1606,6 +1642,8 @@ export declare const TOOLS: ({
1606
1642
  force?: undefined;
1607
1643
  session_id?: undefined;
1608
1644
  close_type?: undefined;
1645
+ closing_reflection?: undefined;
1646
+ human_corrections?: undefined;
1609
1647
  ceremony_duration_ms?: undefined;
1610
1648
  learning_type?: undefined;
1611
1649
  title?: undefined;
@@ -1715,6 +1753,8 @@ export declare const TOOLS: ({
1715
1753
  force?: undefined;
1716
1754
  session_id?: undefined;
1717
1755
  close_type?: undefined;
1756
+ closing_reflection?: undefined;
1757
+ human_corrections?: undefined;
1718
1758
  ceremony_duration_ms?: undefined;
1719
1759
  learning_type?: undefined;
1720
1760
  title?: undefined;
@@ -1806,6 +1846,8 @@ export declare const TOOLS: ({
1806
1846
  force?: undefined;
1807
1847
  session_id?: undefined;
1808
1848
  close_type?: undefined;
1849
+ closing_reflection?: undefined;
1850
+ human_corrections?: undefined;
1809
1851
  ceremony_duration_ms?: undefined;
1810
1852
  learning_type?: undefined;
1811
1853
  title?: undefined;
@@ -1897,6 +1939,8 @@ export declare const TOOLS: ({
1897
1939
  force?: undefined;
1898
1940
  session_id?: undefined;
1899
1941
  close_type?: undefined;
1942
+ closing_reflection?: undefined;
1943
+ human_corrections?: undefined;
1900
1944
  ceremony_duration_ms?: undefined;
1901
1945
  learning_type?: undefined;
1902
1946
  title?: undefined;
@@ -1982,6 +2026,8 @@ export declare const TOOLS: ({
1982
2026
  force?: undefined;
1983
2027
  session_id?: undefined;
1984
2028
  close_type?: undefined;
2029
+ closing_reflection?: undefined;
2030
+ human_corrections?: undefined;
1985
2031
  ceremony_duration_ms?: undefined;
1986
2032
  learning_type?: undefined;
1987
2033
  title?: undefined;
@@ -2069,6 +2115,8 @@ export declare const TOOLS: ({
2069
2115
  force?: undefined;
2070
2116
  session_id?: undefined;
2071
2117
  close_type?: undefined;
2118
+ closing_reflection?: undefined;
2119
+ human_corrections?: undefined;
2072
2120
  ceremony_duration_ms?: undefined;
2073
2121
  learning_type?: undefined;
2074
2122
  title?: undefined;
@@ -2153,6 +2201,8 @@ export declare const TOOLS: ({
2153
2201
  force?: undefined;
2154
2202
  session_id?: undefined;
2155
2203
  close_type?: undefined;
2204
+ closing_reflection?: undefined;
2205
+ human_corrections?: undefined;
2156
2206
  ceremony_duration_ms?: undefined;
2157
2207
  learning_type?: undefined;
2158
2208
  title?: undefined;
@@ -2240,6 +2290,8 @@ export declare const TOOLS: ({
2240
2290
  force?: undefined;
2241
2291
  session_id?: undefined;
2242
2292
  close_type?: undefined;
2293
+ closing_reflection?: undefined;
2294
+ human_corrections?: undefined;
2243
2295
  ceremony_duration_ms?: undefined;
2244
2296
  learning_type?: undefined;
2245
2297
  title?: undefined;
@@ -2324,6 +2376,8 @@ export declare const TOOLS: ({
2324
2376
  force?: undefined;
2325
2377
  session_id?: undefined;
2326
2378
  close_type?: undefined;
2379
+ closing_reflection?: undefined;
2380
+ human_corrections?: undefined;
2327
2381
  ceremony_duration_ms?: undefined;
2328
2382
  learning_type?: undefined;
2329
2383
  title?: undefined;
@@ -2413,6 +2467,8 @@ export declare const TOOLS: ({
2413
2467
  force?: undefined;
2414
2468
  session_id?: undefined;
2415
2469
  close_type?: undefined;
2470
+ closing_reflection?: undefined;
2471
+ human_corrections?: undefined;
2416
2472
  ceremony_duration_ms?: undefined;
2417
2473
  learning_type?: undefined;
2418
2474
  title?: undefined;
@@ -2517,6 +2573,8 @@ export declare const TOOLS: ({
2517
2573
  force?: undefined;
2518
2574
  session_id?: undefined;
2519
2575
  close_type?: undefined;
2576
+ closing_reflection?: undefined;
2577
+ human_corrections?: undefined;
2520
2578
  ceremony_duration_ms?: undefined;
2521
2579
  learning_type?: undefined;
2522
2580
  title?: undefined;
@@ -2629,6 +2687,8 @@ export declare const TOOLS: ({
2629
2687
  force?: undefined;
2630
2688
  session_id?: undefined;
2631
2689
  close_type?: undefined;
2690
+ closing_reflection?: undefined;
2691
+ human_corrections?: undefined;
2632
2692
  ceremony_duration_ms?: undefined;
2633
2693
  learning_type?: undefined;
2634
2694
  title?: undefined;
@@ -2715,6 +2775,8 @@ export declare const TOOLS: ({
2715
2775
  force?: undefined;
2716
2776
  session_id?: undefined;
2717
2777
  close_type?: undefined;
2778
+ closing_reflection?: undefined;
2779
+ human_corrections?: undefined;
2718
2780
  ceremony_duration_ms?: undefined;
2719
2781
  learning_type?: undefined;
2720
2782
  title?: undefined;
@@ -2818,6 +2880,8 @@ export declare const TOOLS: ({
2818
2880
  force?: undefined;
2819
2881
  session_id?: undefined;
2820
2882
  close_type?: undefined;
2883
+ closing_reflection?: undefined;
2884
+ human_corrections?: undefined;
2821
2885
  ceremony_duration_ms?: undefined;
2822
2886
  learning_type?: undefined;
2823
2887
  title?: undefined;
@@ -2921,6 +2985,8 @@ export declare const TOOLS: ({
2921
2985
  force?: undefined;
2922
2986
  session_id?: undefined;
2923
2987
  close_type?: undefined;
2988
+ closing_reflection?: undefined;
2989
+ human_corrections?: undefined;
2924
2990
  ceremony_duration_ms?: undefined;
2925
2991
  learning_type?: undefined;
2926
2992
  title?: undefined;
@@ -3023,6 +3089,8 @@ export declare const TOOLS: ({
3023
3089
  force?: undefined;
3024
3090
  session_id?: undefined;
3025
3091
  close_type?: undefined;
3092
+ closing_reflection?: undefined;
3093
+ human_corrections?: undefined;
3026
3094
  ceremony_duration_ms?: undefined;
3027
3095
  learning_type?: undefined;
3028
3096
  title?: undefined;
@@ -3100,6 +3168,8 @@ export declare const TOOLS: ({
3100
3168
  force?: undefined;
3101
3169
  session_id?: undefined;
3102
3170
  close_type?: undefined;
3171
+ closing_reflection?: undefined;
3172
+ human_corrections?: undefined;
3103
3173
  ceremony_duration_ms?: undefined;
3104
3174
  learning_type?: undefined;
3105
3175
  title?: undefined;
@@ -3189,6 +3259,8 @@ export declare const TOOLS: ({
3189
3259
  force?: undefined;
3190
3260
  session_id?: undefined;
3191
3261
  close_type?: undefined;
3262
+ closing_reflection?: undefined;
3263
+ human_corrections?: undefined;
3192
3264
  ceremony_duration_ms?: undefined;
3193
3265
  learning_type?: undefined;
3194
3266
  title?: undefined;
@@ -3293,6 +3365,8 @@ export declare const TOOLS: ({
3293
3365
  force?: undefined;
3294
3366
  session_id?: undefined;
3295
3367
  close_type?: undefined;
3368
+ closing_reflection?: undefined;
3369
+ human_corrections?: undefined;
3296
3370
  ceremony_duration_ms?: undefined;
3297
3371
  learning_type?: undefined;
3298
3372
  title?: undefined;
@@ -3395,6 +3469,8 @@ export declare const TOOLS: ({
3395
3469
  force?: undefined;
3396
3470
  session_id?: undefined;
3397
3471
  close_type?: undefined;
3472
+ closing_reflection?: undefined;
3473
+ human_corrections?: undefined;
3398
3474
  ceremony_duration_ms?: undefined;
3399
3475
  learning_type?: undefined;
3400
3476
  title?: undefined;
@@ -3510,6 +3586,8 @@ export declare function getRegisteredTools(): ({
3510
3586
  force?: undefined;
3511
3587
  session_id?: undefined;
3512
3588
  close_type?: undefined;
3589
+ closing_reflection?: undefined;
3590
+ human_corrections?: undefined;
3513
3591
  ceremony_duration_ms?: undefined;
3514
3592
  learning_type?: undefined;
3515
3593
  title?: undefined;
@@ -3618,6 +3696,8 @@ export declare function getRegisteredTools(): ({
3618
3696
  force?: undefined;
3619
3697
  session_id?: undefined;
3620
3698
  close_type?: undefined;
3699
+ closing_reflection?: undefined;
3700
+ human_corrections?: undefined;
3621
3701
  ceremony_duration_ms?: undefined;
3622
3702
  learning_type?: undefined;
3623
3703
  title?: undefined;
@@ -3721,6 +3801,8 @@ export declare function getRegisteredTools(): ({
3721
3801
  force?: undefined;
3722
3802
  session_id?: undefined;
3723
3803
  close_type?: undefined;
3804
+ closing_reflection?: undefined;
3805
+ human_corrections?: undefined;
3724
3806
  ceremony_duration_ms?: undefined;
3725
3807
  learning_type?: undefined;
3726
3808
  title?: undefined;
@@ -3827,6 +3909,8 @@ export declare function getRegisteredTools(): ({
3827
3909
  reflections?: undefined;
3828
3910
  session_id?: undefined;
3829
3911
  close_type?: undefined;
3912
+ closing_reflection?: undefined;
3913
+ human_corrections?: undefined;
3830
3914
  ceremony_duration_ms?: undefined;
3831
3915
  learning_type?: undefined;
3832
3916
  title?: undefined;
@@ -3911,6 +3995,8 @@ export declare function getRegisteredTools(): ({
3911
3995
  force?: undefined;
3912
3996
  session_id?: undefined;
3913
3997
  close_type?: undefined;
3998
+ closing_reflection?: undefined;
3999
+ human_corrections?: undefined;
3914
4000
  ceremony_duration_ms?: undefined;
3915
4001
  learning_type?: undefined;
3916
4002
  title?: undefined;
@@ -3986,6 +4072,14 @@ export declare function getRegisteredTools(): ({
3986
4072
  enum: string[];
3987
4073
  description: string;
3988
4074
  };
4075
+ closing_reflection: {
4076
+ type: string;
4077
+ description: string;
4078
+ };
4079
+ human_corrections: {
4080
+ type: string;
4081
+ description: string;
4082
+ };
3989
4083
  linear_issue: {
3990
4084
  type: string;
3991
4085
  description: string;
@@ -4152,6 +4246,8 @@ export declare function getRegisteredTools(): ({
4152
4246
  force?: undefined;
4153
4247
  session_id?: undefined;
4154
4248
  close_type?: undefined;
4249
+ closing_reflection?: undefined;
4250
+ human_corrections?: undefined;
4155
4251
  ceremony_duration_ms?: undefined;
4156
4252
  decision?: undefined;
4157
4253
  rationale?: undefined;
@@ -4263,6 +4359,8 @@ export declare function getRegisteredTools(): ({
4263
4359
  issue_labels?: undefined;
4264
4360
  force?: undefined;
4265
4361
  close_type?: undefined;
4362
+ closing_reflection?: undefined;
4363
+ human_corrections?: undefined;
4266
4364
  ceremony_duration_ms?: undefined;
4267
4365
  learning_type?: undefined;
4268
4366
  description?: undefined;
@@ -4381,6 +4479,8 @@ export declare function getRegisteredTools(): ({
4381
4479
  issue_labels?: undefined;
4382
4480
  force?: undefined;
4383
4481
  close_type?: undefined;
4482
+ closing_reflection?: undefined;
4483
+ human_corrections?: undefined;
4384
4484
  ceremony_duration_ms?: undefined;
4385
4485
  learning_type?: undefined;
4386
4486
  title?: undefined;
@@ -4507,6 +4607,8 @@ export declare function getRegisteredTools(): ({
4507
4607
  force?: undefined;
4508
4608
  session_id?: undefined;
4509
4609
  close_type?: undefined;
4610
+ closing_reflection?: undefined;
4611
+ human_corrections?: undefined;
4510
4612
  ceremony_duration_ms?: undefined;
4511
4613
  learning_type?: undefined;
4512
4614
  title?: undefined;
@@ -4602,6 +4704,8 @@ export declare function getRegisteredTools(): ({
4602
4704
  issue_labels?: undefined;
4603
4705
  force?: undefined;
4604
4706
  close_type?: undefined;
4707
+ closing_reflection?: undefined;
4708
+ human_corrections?: undefined;
4605
4709
  ceremony_duration_ms?: undefined;
4606
4710
  learning_type?: undefined;
4607
4711
  title?: undefined;
@@ -4684,6 +4788,8 @@ export declare function getRegisteredTools(): ({
4684
4788
  issue_labels?: undefined;
4685
4789
  force?: undefined;
4686
4790
  close_type?: undefined;
4791
+ closing_reflection?: undefined;
4792
+ human_corrections?: undefined;
4687
4793
  ceremony_duration_ms?: undefined;
4688
4794
  learning_type?: undefined;
4689
4795
  title?: undefined;
@@ -4778,6 +4884,8 @@ export declare function getRegisteredTools(): ({
4778
4884
  force?: undefined;
4779
4885
  session_id?: undefined;
4780
4886
  close_type?: undefined;
4887
+ closing_reflection?: undefined;
4888
+ human_corrections?: undefined;
4781
4889
  ceremony_duration_ms?: undefined;
4782
4890
  learning_type?: undefined;
4783
4891
  title?: undefined;
@@ -4878,6 +4986,8 @@ export declare function getRegisteredTools(): ({
4878
4986
  force?: undefined;
4879
4987
  session_id?: undefined;
4880
4988
  close_type?: undefined;
4989
+ closing_reflection?: undefined;
4990
+ human_corrections?: undefined;
4881
4991
  ceremony_duration_ms?: undefined;
4882
4992
  title?: undefined;
4883
4993
  description?: undefined;
@@ -4977,6 +5087,8 @@ export declare function getRegisteredTools(): ({
4977
5087
  force?: undefined;
4978
5088
  session_id?: undefined;
4979
5089
  close_type?: undefined;
5090
+ closing_reflection?: undefined;
5091
+ human_corrections?: undefined;
4980
5092
  ceremony_duration_ms?: undefined;
4981
5093
  title?: undefined;
4982
5094
  description?: undefined;
@@ -5073,6 +5185,8 @@ export declare function getRegisteredTools(): ({
5073
5185
  force?: undefined;
5074
5186
  session_id?: undefined;
5075
5187
  close_type?: undefined;
5188
+ closing_reflection?: undefined;
5189
+ human_corrections?: undefined;
5076
5190
  ceremony_duration_ms?: undefined;
5077
5191
  learning_type?: undefined;
5078
5192
  title?: undefined;
@@ -5182,6 +5296,8 @@ export declare function getRegisteredTools(): ({
5182
5296
  force?: undefined;
5183
5297
  session_id?: undefined;
5184
5298
  close_type?: undefined;
5299
+ closing_reflection?: undefined;
5300
+ human_corrections?: undefined;
5185
5301
  ceremony_duration_ms?: undefined;
5186
5302
  learning_type?: undefined;
5187
5303
  title?: undefined;
@@ -5273,6 +5389,8 @@ export declare function getRegisteredTools(): ({
5273
5389
  force?: undefined;
5274
5390
  session_id?: undefined;
5275
5391
  close_type?: undefined;
5392
+ closing_reflection?: undefined;
5393
+ human_corrections?: undefined;
5276
5394
  ceremony_duration_ms?: undefined;
5277
5395
  learning_type?: undefined;
5278
5396
  title?: undefined;
@@ -5364,6 +5482,8 @@ export declare function getRegisteredTools(): ({
5364
5482
  force?: undefined;
5365
5483
  session_id?: undefined;
5366
5484
  close_type?: undefined;
5485
+ closing_reflection?: undefined;
5486
+ human_corrections?: undefined;
5367
5487
  ceremony_duration_ms?: undefined;
5368
5488
  learning_type?: undefined;
5369
5489
  title?: undefined;
@@ -5449,6 +5569,8 @@ export declare function getRegisteredTools(): ({
5449
5569
  force?: undefined;
5450
5570
  session_id?: undefined;
5451
5571
  close_type?: undefined;
5572
+ closing_reflection?: undefined;
5573
+ human_corrections?: undefined;
5452
5574
  ceremony_duration_ms?: undefined;
5453
5575
  learning_type?: undefined;
5454
5576
  title?: undefined;
@@ -5536,6 +5658,8 @@ export declare function getRegisteredTools(): ({
5536
5658
  force?: undefined;
5537
5659
  session_id?: undefined;
5538
5660
  close_type?: undefined;
5661
+ closing_reflection?: undefined;
5662
+ human_corrections?: undefined;
5539
5663
  ceremony_duration_ms?: undefined;
5540
5664
  learning_type?: undefined;
5541
5665
  title?: undefined;
@@ -5620,6 +5744,8 @@ export declare function getRegisteredTools(): ({
5620
5744
  force?: undefined;
5621
5745
  session_id?: undefined;
5622
5746
  close_type?: undefined;
5747
+ closing_reflection?: undefined;
5748
+ human_corrections?: undefined;
5623
5749
  ceremony_duration_ms?: undefined;
5624
5750
  learning_type?: undefined;
5625
5751
  title?: undefined;
@@ -5707,6 +5833,8 @@ export declare function getRegisteredTools(): ({
5707
5833
  force?: undefined;
5708
5834
  session_id?: undefined;
5709
5835
  close_type?: undefined;
5836
+ closing_reflection?: undefined;
5837
+ human_corrections?: undefined;
5710
5838
  ceremony_duration_ms?: undefined;
5711
5839
  learning_type?: undefined;
5712
5840
  title?: undefined;
@@ -5791,6 +5919,8 @@ export declare function getRegisteredTools(): ({
5791
5919
  force?: undefined;
5792
5920
  session_id?: undefined;
5793
5921
  close_type?: undefined;
5922
+ closing_reflection?: undefined;
5923
+ human_corrections?: undefined;
5794
5924
  ceremony_duration_ms?: undefined;
5795
5925
  learning_type?: undefined;
5796
5926
  title?: undefined;
@@ -5880,6 +6010,8 @@ export declare function getRegisteredTools(): ({
5880
6010
  force?: undefined;
5881
6011
  session_id?: undefined;
5882
6012
  close_type?: undefined;
6013
+ closing_reflection?: undefined;
6014
+ human_corrections?: undefined;
5883
6015
  ceremony_duration_ms?: undefined;
5884
6016
  learning_type?: undefined;
5885
6017
  title?: undefined;
@@ -5984,6 +6116,8 @@ export declare function getRegisteredTools(): ({
5984
6116
  force?: undefined;
5985
6117
  session_id?: undefined;
5986
6118
  close_type?: undefined;
6119
+ closing_reflection?: undefined;
6120
+ human_corrections?: undefined;
5987
6121
  ceremony_duration_ms?: undefined;
5988
6122
  learning_type?: undefined;
5989
6123
  title?: undefined;
@@ -6096,6 +6230,8 @@ export declare function getRegisteredTools(): ({
6096
6230
  force?: undefined;
6097
6231
  session_id?: undefined;
6098
6232
  close_type?: undefined;
6233
+ closing_reflection?: undefined;
6234
+ human_corrections?: undefined;
6099
6235
  ceremony_duration_ms?: undefined;
6100
6236
  learning_type?: undefined;
6101
6237
  title?: undefined;
@@ -6182,6 +6318,8 @@ export declare function getRegisteredTools(): ({
6182
6318
  force?: undefined;
6183
6319
  session_id?: undefined;
6184
6320
  close_type?: undefined;
6321
+ closing_reflection?: undefined;
6322
+ human_corrections?: undefined;
6185
6323
  ceremony_duration_ms?: undefined;
6186
6324
  learning_type?: undefined;
6187
6325
  title?: undefined;
@@ -6285,6 +6423,8 @@ export declare function getRegisteredTools(): ({
6285
6423
  force?: undefined;
6286
6424
  session_id?: undefined;
6287
6425
  close_type?: undefined;
6426
+ closing_reflection?: undefined;
6427
+ human_corrections?: undefined;
6288
6428
  ceremony_duration_ms?: undefined;
6289
6429
  learning_type?: undefined;
6290
6430
  title?: undefined;
@@ -6388,6 +6528,8 @@ export declare function getRegisteredTools(): ({
6388
6528
  force?: undefined;
6389
6529
  session_id?: undefined;
6390
6530
  close_type?: undefined;
6531
+ closing_reflection?: undefined;
6532
+ human_corrections?: undefined;
6391
6533
  ceremony_duration_ms?: undefined;
6392
6534
  learning_type?: undefined;
6393
6535
  title?: undefined;
@@ -6490,6 +6632,8 @@ export declare function getRegisteredTools(): ({
6490
6632
  force?: undefined;
6491
6633
  session_id?: undefined;
6492
6634
  close_type?: undefined;
6635
+ closing_reflection?: undefined;
6636
+ human_corrections?: undefined;
6493
6637
  ceremony_duration_ms?: undefined;
6494
6638
  learning_type?: undefined;
6495
6639
  title?: undefined;
@@ -6567,6 +6711,8 @@ export declare function getRegisteredTools(): ({
6567
6711
  force?: undefined;
6568
6712
  session_id?: undefined;
6569
6713
  close_type?: undefined;
6714
+ closing_reflection?: undefined;
6715
+ human_corrections?: undefined;
6570
6716
  ceremony_duration_ms?: undefined;
6571
6717
  learning_type?: undefined;
6572
6718
  title?: undefined;
@@ -6656,6 +6802,8 @@ export declare function getRegisteredTools(): ({
6656
6802
  force?: undefined;
6657
6803
  session_id?: undefined;
6658
6804
  close_type?: undefined;
6805
+ closing_reflection?: undefined;
6806
+ human_corrections?: undefined;
6659
6807
  ceremony_duration_ms?: undefined;
6660
6808
  learning_type?: undefined;
6661
6809
  title?: undefined;
@@ -6760,6 +6908,8 @@ export declare function getRegisteredTools(): ({
6760
6908
  force?: undefined;
6761
6909
  session_id?: undefined;
6762
6910
  close_type?: undefined;
6911
+ closing_reflection?: undefined;
6912
+ human_corrections?: undefined;
6763
6913
  ceremony_duration_ms?: undefined;
6764
6914
  learning_type?: undefined;
6765
6915
  title?: undefined;
@@ -6862,6 +7012,8 @@ export declare function getRegisteredTools(): ({
6862
7012
  force?: undefined;
6863
7013
  session_id?: undefined;
6864
7014
  close_type?: undefined;
7015
+ closing_reflection?: undefined;
7016
+ human_corrections?: undefined;
6865
7017
  ceremony_duration_ms?: undefined;
6866
7018
  learning_type?: undefined;
6867
7019
  title?: undefined;
@@ -164,7 +164,7 @@ export const TOOLS = [
164
164
  },
165
165
  {
166
166
  name: "session_close",
167
- description: "Persist session with compliance validation. IMPORTANT: Before calling this tool, write all heavy payload data (closing_reflection, human_corrections, scars_to_record, open_threads, decisions, learnings_created) to {gitmem_dir}/closing-payload.json using your file write tool the gitmem_dir path is returned by session_start (also shown in session start display as 'Payload path'). Then call this tool with ONLY session_id and close_type. The tool reads the payload file automatically and deletes it after processing. task_completion is auto-generated from closing_reflection timestamps and human_corrections — do NOT write it to the payload. DISPLAY: The result includes a pre-formatted 'display' field. Output the display field verbatim as your response — tool results are collapsed in the CLI.",
167
+ description: "Persist session with compliance validation. Two modes: (1) Write closing_reflection and other payload to {gitmem_dir}/closing-payload.json, then call with session_id + close_type. (2) Pass closing_reflection directly as a parameter (simpler). Both work inline params override file payload. task_completion is auto-generated. DISPLAY: Output the display field verbatim.",
168
168
  inputSchema: {
169
169
  type: "object",
170
170
  properties: {
@@ -177,6 +177,14 @@ export const TOOLS = [
177
177
  enum: ["standard", "quick", "autonomous"],
178
178
  description: "Type of close (standard requires full reflection)",
179
179
  },
180
+ closing_reflection: {
181
+ type: "object",
182
+ description: "Session reflection (alternative to writing closing-payload.json). Keys: what_broke, what_took_longer, do_differently, what_worked, wrong_assumption, scars_applied, institutional_memory_items, collaborative_dynamic, rapport_notes",
183
+ },
184
+ human_corrections: {
185
+ type: "string",
186
+ description: "Human corrections or 'none'",
187
+ },
180
188
  linear_issue: {
181
189
  type: "string",
182
190
  description: "Associated Linear issue",
@@ -878,7 +886,7 @@ export const TOOLS = [
878
886
  },
879
887
  {
880
888
  name: "gitmem-sc",
881
- description: "gitmem-sc (session_close) - Close session with compliance validation. IMPORTANT: Write all heavy payload data (closing_reflection, task_completion, human_corrections, scars_to_record, open_threads, decisions, learnings_created) to {gitmem_dir}/closing-payload.json BEFORE calling this tool — gitmem_dir is from session_start. Only pass session_id and close_type inline. DISPLAY: The result includes a pre-formatted 'display' field. Output the display field verbatim as your response — tool results are collapsed in the CLI.",
889
+ description: "gitmem-sc (session_close) - Close session. Two modes: (1) Write payload to closing-payload.json first, or (2) pass closing_reflection directly as param. Both work.",
882
890
  inputSchema: {
883
891
  type: "object",
884
892
  properties: {
@@ -891,6 +899,14 @@ export const TOOLS = [
891
899
  enum: ["standard", "quick", "autonomous"],
892
900
  description: "Type of close (standard requires full reflection)",
893
901
  },
902
+ closing_reflection: {
903
+ type: "object",
904
+ description: "Session reflection (alternative to writing closing-payload.json)",
905
+ },
906
+ human_corrections: {
907
+ type: "string",
908
+ description: "Human corrections or 'none'",
909
+ },
894
910
  linear_issue: {
895
911
  type: "string",
896
912
  description: "Associated Linear issue",
@@ -1548,7 +1564,7 @@ export const TOOLS = [
1548
1564
  },
1549
1565
  {
1550
1566
  name: "gm-close",
1551
- description: "gm-close (session_close) - Close a GitMem session. IMPORTANT: Write all heavy payload data (closing_reflection, task_completion, human_corrections, scars_to_record, open_threads, decisions, learnings_created) to {gitmem_dir}/closing-payload.json BEFORE calling this tool — gitmem_dir is from session_start. Only pass session_id and close_type inline. DISPLAY: The result includes a pre-formatted 'display' field. Output the display field verbatim as your response — tool results are collapsed in the CLI.",
1567
+ description: "gm-close (session_close) - Close session. Pass closing_reflection directly or write to closing-payload.json first.",
1552
1568
  inputSchema: {
1553
1569
  type: "object",
1554
1570
  properties: {
@@ -1561,6 +1577,14 @@ export const TOOLS = [
1561
1577
  enum: ["standard", "quick", "autonomous"],
1562
1578
  description: "Type of close (standard requires full reflection)",
1563
1579
  },
1580
+ closing_reflection: {
1581
+ type: "object",
1582
+ description: "Session reflection (alternative to writing closing-payload.json)",
1583
+ },
1584
+ human_corrections: {
1585
+ type: "string",
1586
+ description: "Human corrections or 'none'",
1587
+ },
1564
1588
  linear_issue: {
1565
1589
  type: "string",
1566
1590
  description: "Associated Linear issue",
@@ -40,13 +40,15 @@ function buildThreadsDisplay(threads, totalOpen, totalResolved) {
40
40
  // Deterministic sort: oldest first by created_at
41
41
  const sorted = [...threads].sort((a, b) => a.created_at.localeCompare(b.created_at));
42
42
  // Markdown table — renders cleanly in all MCP clients
43
- lines.push("| # | Thread | Active |");
44
- lines.push("|---|--------|--------|");
43
+ // Show short thread ID so agents can reference threads by ID or #N position
44
+ lines.push("| # | ID | Thread | Active |");
45
+ lines.push("|---|-----|--------|--------|");
45
46
  for (let i = 0; i < sorted.length; i++) {
46
47
  const t = sorted[i];
47
- const text = truncate(t.text, 60);
48
+ const text = truncate(t.text, 55);
48
49
  const date = shortDate(t.last_touched_at || t.created_at);
49
- lines.push(`| ${i + 1} | ${text} | ${date} |`);
50
+ const shortId = t.id?.slice(0, 10) || "—";
51
+ lines.push(`| ${i + 1} | ${shortId} | ${text} | ${date} |`);
50
52
  }
51
53
  return wrapDisplay(lines.join("\n"));
52
54
  }
@@ -13,7 +13,7 @@ import type { Project, PerformanceData } from "../types/index.js";
13
13
  export interface LogParams {
14
14
  limit?: number;
15
15
  project?: Project;
16
- learning_type?: "scar" | "win" | "pattern";
16
+ learning_type?: "scar" | "win" | "pattern" | "anti_pattern";
17
17
  severity?: "critical" | "high" | "medium" | "low";
18
18
  since?: number;
19
19
  }
@@ -45,7 +45,7 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
45
45
  "",
46
46
  ];
47
47
  if (allStarter) {
48
- lines.push(`${dimText("This is your first recall results will get more relevant as you add your own lessons from real experience.")}`);
48
+ lines.push(`${dimText("No project-specific lessons yet. Use create_learning to capture your first.")}`);
49
49
  lines.push("");
50
50
  }
51
51
  // Display blocking verification requirements FIRST and prominently
@@ -72,7 +72,8 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
72
72
  }
73
73
  for (const scar of scars) {
74
74
  const sev = SEV[scar.severity] || "[?]";
75
- lines.push(`${sev} **${scar.title}** (${scar.severity}, ${scar.similarity.toFixed(2)}) ${dimText(`id:${scar.id.slice(0, 8)}`)}`);
75
+ const starterTag = scar.is_starter ? ` ${dimText("[starter]")}` : "";
76
+ lines.push(`${sev} **${scar.title}** (${scar.severity}, ${scar.similarity.toFixed(2)}) ${dimText(`id:${scar.id.slice(0, 8)}`)}${starterTag}`);
76
77
  // Inline archival hint: scars with high dismiss rates get annotated
77
78
  if (dismissals) {
78
79
  const counts = dismissals.get(scar.id);
@@ -201,6 +202,16 @@ export async function recall(params) {
201
202
  similarityScores: scars.map((s) => s.similarity),
202
203
  search_mode: "local",
203
204
  });
205
+ // Track surfaced scars for confirm_scars (same as pro tier path)
206
+ const recallSurfacedAt = new Date().toISOString();
207
+ const recallSurfacedScars = scars.map((scar) => ({
208
+ scar_id: scar.id,
209
+ scar_title: scar.title,
210
+ scar_severity: scar.severity || "medium",
211
+ surfaced_at: recallSurfacedAt,
212
+ source: "recall",
213
+ }));
214
+ addSurfacedScars(recallSurfacedScars);
204
215
  const freeFormatted = formatResponse(scars, plan);
205
216
  return {
206
217
  activated: scars.length > 0,
@@ -44,10 +44,31 @@ export async function resolveThread(params) {
44
44
  }
45
45
  const session = getCurrentSession();
46
46
  const sessionId = session?.sessionId;
47
+ // Support positional #N references (e.g. "#3" resolves the 3rd thread in sorted order)
48
+ let effectiveThreadId = params.thread_id;
49
+ let effectiveTextMatch = params.text_match;
50
+ const posMatch = (params.thread_id || params.text_match || "").match(/^#(\d+)$/);
51
+ if (posMatch) {
52
+ const pos = parseInt(posMatch[1], 10);
53
+ const openThreads = threads
54
+ .filter(t => t.status === "open")
55
+ .sort((a, b) => a.created_at.localeCompare(b.created_at));
56
+ if (pos < 1 || pos > openThreads.length) {
57
+ const latencyMs = timer.stop();
58
+ return {
59
+ success: false,
60
+ error: `Thread #${pos} out of range (${openThreads.length} open threads)`,
61
+ performance: buildPerformanceData("resolve_thread", latencyMs, 0),
62
+ display: wrapDisplay(`Thread #${pos} out of range (${openThreads.length} open threads)`),
63
+ };
64
+ }
65
+ effectiveThreadId = openThreads[pos - 1].id;
66
+ effectiveTextMatch = undefined;
67
+ }
47
68
  // Resolve the thread locally (in-memory / file)
48
69
  const resolved = resolveThreadInList(threads, {
49
- threadId: params.thread_id,
50
- textMatch: params.text_match,
70
+ threadId: effectiveThreadId,
71
+ textMatch: effectiveTextMatch,
51
72
  sessionId,
52
73
  resolutionNote: params.resolution_note,
53
74
  });
@@ -29,6 +29,7 @@ export interface SearchResultEntry {
29
29
  counter_arguments?: string[];
30
30
  similarity: number;
31
31
  source_linear_issue?: string;
32
+ is_starter?: boolean;
32
33
  }
33
34
  export interface SearchResult {
34
35
  query: string;
@@ -17,7 +17,7 @@ import { getProject } from "../services/session-state.js";
17
17
  import { getStorage } from "../services/storage.js";
18
18
  import { Timer, recordMetrics, buildPerformanceData, buildComponentPerformance, } from "../services/metrics.js";
19
19
  import { v4 as uuidv4 } from "uuid";
20
- import { wrapDisplay, truncate, SEV, TYPE, productLine } from "../services/display-protocol.js";
20
+ import { wrapDisplay, truncate, SEV, TYPE, productLine, dimText } from "../services/display-protocol.js";
21
21
  // --- Display Formatting ---
22
22
  function buildSearchDisplay(results, total_found, query, filters) {
23
23
  const lines = [];
@@ -41,7 +41,8 @@ function buildSearchDisplay(results, total_found, query, filters) {
41
41
  const sim = `(${r.similarity.toFixed(2)})`;
42
42
  const issue = r.source_linear_issue ? ` ${r.source_linear_issue}` : "";
43
43
  lines.push(`${te} ${se} ${t.padEnd(52)} ${sim}${issue}`);
44
- lines.push(` ${truncate(r.description, 72)} id:${r.id.slice(0, 8)}`);
44
+ const starterTag = r.is_starter ? ` ${dimText("[starter]")}` : "";
45
+ lines.push(` ${truncate(r.description, 72)} id:${r.id.slice(0, 8)}${starterTag}`);
45
46
  }
46
47
  lines.push("");
47
48
  lines.push(`${total_found} results found`);
@@ -70,6 +71,7 @@ export async function search(params) {
70
71
  description: r.description || "",
71
72
  counter_arguments: r.counter_arguments || [],
72
73
  similarity: r.similarity || 0,
74
+ is_starter: r.is_starter || undefined,
73
75
  }));
74
76
  // Also search decisions
75
77
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitmem-mcp",
3
- "version": "1.3.4",
3
+ "version": "1.4.0",
4
4
  "mcpName": "io.github.gitmem-dev/gitmem",
5
5
  "description": "Persistent learning memory for AI coding agents. Memory that compounds.",
6
6
  "type": "module",