@codemem/server 0.30.0 → 0.31.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/static/index.html CHANGED
@@ -1237,6 +1237,99 @@
1237
1237
  box-shadow: 0 0 0 3px var(--focus-ring);
1238
1238
  }
1239
1239
 
1240
+ .projects-toolbar {
1241
+ display: flex;
1242
+ flex-wrap: wrap;
1243
+ gap: var(--sp-3);
1244
+ align-items: center;
1245
+ margin: var(--sp-4) 0 var(--sp-3);
1246
+ }
1247
+ .projects-toolbar .feed-search { flex: 1 1 320px; }
1248
+ .projects-toolbar select {
1249
+ padding: var(--sp-2) var(--sp-3);
1250
+ border-radius: var(--radius-sm);
1251
+ border: 1px solid var(--border);
1252
+ background: var(--input-bg);
1253
+ color: var(--text-primary);
1254
+ font-family: var(--font-sans);
1255
+ font-size: 13px;
1256
+ }
1257
+ .project-inventory-list {
1258
+ display: grid;
1259
+ gap: var(--sp-3);
1260
+ margin-top: var(--sp-4);
1261
+ }
1262
+ .project-inventory-row {
1263
+ padding: var(--sp-4);
1264
+ border: 1px solid var(--border);
1265
+ border-radius: var(--radius-md);
1266
+ background: var(--surface-1);
1267
+ }
1268
+ .project-inventory-row-header {
1269
+ display: flex;
1270
+ justify-content: space-between;
1271
+ gap: var(--sp-3);
1272
+ align-items: flex-start;
1273
+ }
1274
+ .project-inventory-title { font-size: 15px; font-weight: 650; color: var(--text-primary); }
1275
+ .project-inventory-domain { font-family: var(--font-mono); font-size: 12px; color: var(--accent); }
1276
+ .project-inventory-meta, .project-inventory-signal {
1277
+ margin-top: var(--sp-2);
1278
+ color: var(--text-secondary);
1279
+ font-size: 12px;
1280
+ }
1281
+ .project-inventory-signal { overflow-wrap: anywhere; }
1282
+ .project-inventory-badges {
1283
+ display: flex;
1284
+ flex-wrap: wrap;
1285
+ gap: var(--sp-2);
1286
+ margin-top: var(--sp-3);
1287
+ }
1288
+ .project-status-badge {
1289
+ padding: 2px 8px;
1290
+ border-radius: var(--radius-pill);
1291
+ background: var(--surface-2);
1292
+ color: var(--text-secondary);
1293
+ font-size: 11px;
1294
+ border: 1px solid var(--border);
1295
+ }
1296
+ .project-status-badge.needs_attention,
1297
+ .project-status-badge.legacy_review { color: var(--accent-warm); background: var(--accent-warm-subtle); }
1298
+ .project-status-badge.suggested { color: var(--accent); background: var(--accent-subtle); }
1299
+ .project-inventory-details { margin-top: var(--sp-3); }
1300
+ .project-inventory-details summary { cursor: pointer; color: var(--text-secondary); font-size: 12px; }
1301
+ .project-detail-grid {
1302
+ display: grid;
1303
+ grid-template-columns: minmax(130px, max-content) 1fr;
1304
+ gap: var(--sp-2) var(--sp-3);
1305
+ margin-top: var(--sp-3);
1306
+ font-size: 12px;
1307
+ }
1308
+ .project-detail-grid dt { color: var(--text-tertiary); }
1309
+ .project-detail-grid dd { margin: 0; overflow-wrap: anywhere; color: var(--text-primary); }
1310
+ .project-inventory-actions {
1311
+ display: flex;
1312
+ align-items: center;
1313
+ flex-wrap: wrap;
1314
+ gap: var(--sp-2);
1315
+ margin-top: var(--sp-4);
1316
+ }
1317
+ .project-domain-select {
1318
+ min-width: min(100%, 260px);
1319
+ padding: var(--sp-2) var(--sp-3);
1320
+ border-radius: var(--radius-sm);
1321
+ border: 1px solid var(--border);
1322
+ background: var(--input-bg);
1323
+ color: var(--text-primary);
1324
+ font-family: var(--font-sans);
1325
+ font-size: 13px;
1326
+ }
1327
+ .project-guardrail-confirmation {
1328
+ flex-basis: 100%;
1329
+ margin-top: var(--sp-2);
1330
+ }
1331
+ .projects-pagination { margin-top: var(--sp-4); }
1332
+
1240
1333
  /* 36×36 square icon buttons — theme toggle, settings gear. */
1241
1334
  .icon-button {
1242
1335
  width: 36px;
@@ -1885,6 +1978,18 @@
1885
1978
  .sync-action ~ .sync-action { margin-top: var(--sp-2); }
1886
1979
 
1887
1980
  .health-action-text, .sync-action-text { font-size: 13px; color: var(--text-primary); flex: 1; min-width: 0; }
1981
+ .settings-link,
1982
+ .sync-subview-link {
1983
+ color: var(--accent);
1984
+ text-decoration-color: color-mix(in srgb, var(--accent) 52%, transparent);
1985
+ text-underline-offset: 3px;
1986
+ transition: color 140ms ease, text-decoration-color 140ms ease;
1987
+ }
1988
+ .settings-link:hover,
1989
+ .sync-subview-link:hover {
1990
+ color: var(--accent-hover);
1991
+ text-decoration-color: currentColor;
1992
+ }
1888
1993
  .sync-section-heading {
1889
1994
  display: flex;
1890
1995
  align-items: center;
@@ -1980,6 +2085,108 @@
1980
2085
  .actor-details { min-width: 0; display: grid; gap: 6px; }
1981
2086
  .actor-title { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
1982
2087
  .actor-actions { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; justify-content: flex-end; }
2088
+ .legacy-review-card {
2089
+ display: grid;
2090
+ gap: var(--sp-3);
2091
+ padding: var(--sp-3);
2092
+ border: 1px solid color-mix(in srgb, var(--accent-warm) 24%, var(--border));
2093
+ border-radius: var(--radius-lg);
2094
+ background: color-mix(in srgb, var(--accent-warm-subtle) 34%, var(--surface-1));
2095
+ }
2096
+ .legacy-review-header {
2097
+ display: flex;
2098
+ align-items: flex-start;
2099
+ justify-content: space-between;
2100
+ gap: var(--sp-3);
2101
+ }
2102
+ .legacy-review-summary { margin-top: 6px; max-width: 78ch; color: var(--text-secondary); }
2103
+ .legacy-review-warning { margin-top: 4px; max-width: 78ch; }
2104
+ .legacy-review-groups {
2105
+ display: grid;
2106
+ gap: var(--sp-2);
2107
+ margin: 0;
2108
+ padding: 0;
2109
+ list-style: none;
2110
+ }
2111
+ .legacy-review-toolbar {
2112
+ display: grid;
2113
+ gap: var(--sp-2);
2114
+ padding: var(--sp-2);
2115
+ border: 1px solid var(--border);
2116
+ border-radius: var(--radius-md);
2117
+ background: color-mix(in srgb, var(--surface-2) 72%, transparent);
2118
+ }
2119
+ .legacy-review-filter-row,
2120
+ .legacy-review-bulk-row {
2121
+ display: flex;
2122
+ flex-wrap: wrap;
2123
+ gap: var(--sp-2);
2124
+ align-items: center;
2125
+ }
2126
+ .legacy-filter.active {
2127
+ background: var(--accent-subtle);
2128
+ border-color: color-mix(in srgb, var(--accent) 44%, var(--border));
2129
+ color: var(--accent);
2130
+ }
2131
+ .legacy-review-search { flex: 1 1 260px; min-width: min(260px, 100%); }
2132
+ .legacy-review-group {
2133
+ display: grid;
2134
+ gap: var(--sp-2);
2135
+ padding: var(--sp-3);
2136
+ border: 1px solid var(--border);
2137
+ border-radius: var(--radius-md);
2138
+ background: var(--surface-2);
2139
+ }
2140
+ .legacy-review-group-main {
2141
+ display: grid;
2142
+ grid-template-columns: minmax(0, 1fr) auto;
2143
+ gap: var(--sp-3);
2144
+ align-items: start;
2145
+ }
2146
+ .legacy-review-title-wrap { display: flex; align-items: flex-start; gap: var(--sp-2); min-width: 0; }
2147
+ .legacy-review-group-title { color: var(--text-primary); font-weight: 700; overflow-wrap: anywhere; }
2148
+ .legacy-review-group-meta,
2149
+ .legacy-review-reason {
2150
+ margin-top: 2px;
2151
+ color: var(--text-tertiary);
2152
+ font-size: 12px;
2153
+ line-height: 1.45;
2154
+ }
2155
+ .legacy-review-cleanup-note {
2156
+ margin-top: 6px;
2157
+ color: var(--accent-warm);
2158
+ font-size: 12px;
2159
+ line-height: 1.45;
2160
+ }
2161
+ .legacy-review-count {
2162
+ justify-self: end;
2163
+ white-space: nowrap;
2164
+ padding: 3px 9px;
2165
+ border-radius: var(--radius-pill);
2166
+ background: var(--accent-neutral-subtle);
2167
+ color: var(--text-secondary);
2168
+ font-family: var(--font-mono);
2169
+ font-size: 12px;
2170
+ }
2171
+ .legacy-review-confirmation {
2172
+ padding: var(--sp-2) var(--sp-3);
2173
+ border: 1px solid color-mix(in srgb, var(--accent-warm) 35%, var(--border));
2174
+ border-radius: var(--radius-md);
2175
+ background: var(--accent-warm-subtle);
2176
+ color: var(--text-secondary);
2177
+ font-size: 13px;
2178
+ line-height: 1.45;
2179
+ }
2180
+ .legacy-review-target {
2181
+ display: grid;
2182
+ gap: 5px;
2183
+ color: var(--text-tertiary);
2184
+ font-size: 11px;
2185
+ font-weight: 600;
2186
+ letter-spacing: 0.04em;
2187
+ text-transform: uppercase;
2188
+ }
2189
+ .legacy-review-actions { display: flex; justify-content: flex-end; }
1983
2190
  .actor-name-input { min-width: 220px; }
1984
2191
  .actor-merge-controls { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
1985
2192
  .actor-merge-select { min-width: 200px; }
@@ -2522,6 +2729,22 @@
2522
2729
  @media (max-height: 720px) { .modal { align-items: flex-start; } }
2523
2730
  .modal-backdrop[hidden], .modal[hidden] { display: none; }
2524
2731
 
2732
+ .legacy-upgrade-modal .modal-card { width: min(620px, 100%); }
2733
+ .legacy-upgrade-summary {
2734
+ padding: var(--sp-3);
2735
+ border: 1px solid color-mix(in srgb, var(--accent-warm) 28%, var(--border));
2736
+ border-radius: var(--radius-md);
2737
+ background: var(--accent-warm-subtle);
2738
+ color: var(--text-secondary);
2739
+ line-height: 1.5;
2740
+ }
2741
+ .legacy-upgrade-actions {
2742
+ display: flex;
2743
+ flex-wrap: wrap;
2744
+ gap: var(--sp-2);
2745
+ justify-content: flex-end;
2746
+ }
2747
+
2525
2748
  .modal-card {
2526
2749
  width: min(520px, 100%);
2527
2750
  border-radius: var(--radius-xl);
@@ -3250,6 +3473,11 @@
3250
3473
  .feed-visibility-controls { align-items: stretch; }
3251
3474
  .feed-visibility-select { width: 100%; }
3252
3475
  .actor-actions { justify-content: flex-start; }
3476
+ .legacy-review-header { flex-direction: column; }
3477
+ .legacy-review-group-main { grid-template-columns: 1fr; }
3478
+ .legacy-review-count { justify-self: start; }
3479
+ .legacy-review-actions { justify-content: flex-start; }
3480
+ .legacy-review-bulk-row .settings-save { width: 100%; }
3253
3481
  }
3254
3482
 
3255
3483
  @media (max-width: 520px) {
@@ -3306,8 +3534,9 @@
3306
3534
  <!-- ── Tab bar ─────────────────────────────────────────── -->
3307
3535
  <nav class="tab-bar" aria-label="Main navigation">
3308
3536
  <button class="tab-btn active" id="tabBtn-feed">Feed</button>
3309
- <button class="tab-btn" id="tabBtn-health">Health</button>
3537
+ <button class="tab-btn" id="tabBtn-projects">Projects</button>
3310
3538
  <button class="tab-btn" id="tabBtn-sync">Sync</button>
3539
+ <button class="tab-btn" id="tabBtn-health">Health</button>
3311
3540
  <button class="tab-btn" id="tabBtn-coordinator-admin">Coordinator Admin</button>
3312
3541
  </nav>
3313
3542
  <div id="toastRoot"></div>
@@ -3328,6 +3557,49 @@
3328
3557
  </div>
3329
3558
  </div>
3330
3559
 
3560
+ <div class="modal-backdrop" id="legacyUpgradeModalBackdrop" hidden></div>
3561
+ <div
3562
+ aria-describedby="legacyUpgradeDescription legacyUpgradeSummary"
3563
+ aria-labelledby="legacyUpgradeTitle"
3564
+ aria-modal="true"
3565
+ class="modal legacy-upgrade-modal"
3566
+ hidden
3567
+ id="legacyUpgradeModal"
3568
+ role="dialog"
3569
+ >
3570
+ <div class="modal-card">
3571
+ <div class="modal-header">
3572
+ <h2 id="legacyUpgradeTitle">Choose where older shared memories belong</h2>
3573
+ </div>
3574
+ <div class="modal-body">
3575
+ <div class="small" id="legacyUpgradeDescription">
3576
+ Some memories were shared before codemem had clear Sharing domains. We kept them out
3577
+ of normal sync until you choose which project/domain they belong to.
3578
+ </div>
3579
+ <div class="legacy-upgrade-summary" id="legacyUpgradeSummary"></div>
3580
+ <div class="small">
3581
+ You’ll review projects, not individual memories. Nothing moves automatically, and this
3582
+ will not erase copies another device may already have received.
3583
+ </div>
3584
+ <label class="field-checkbox" for="legacyUpgradeDontShow">
3585
+ <input class="cm-checkbox" id="legacyUpgradeDontShow" type="checkbox" />
3586
+ <span>Don’t show this again</span>
3587
+ </label>
3588
+ </div>
3589
+ <div class="modal-footer">
3590
+ <div class="legacy-upgrade-actions">
3591
+ <button class="settings-button" id="legacyUpgradeReviewProjects" type="button">
3592
+ Manage all projects
3593
+ </button>
3594
+ <button class="settings-button" id="legacyUpgradeNotNow" type="button">Not now</button>
3595
+ <button class="settings-save" id="legacyUpgradeReviewGroups" type="button">
3596
+ Start review
3597
+ </button>
3598
+ </div>
3599
+ </div>
3600
+ </div>
3601
+ </div>
3602
+
3331
3603
  <!-- ── Settings modal ──────────────────────────────────── -->
3332
3604
  <div id="settingsDialogMount"></div>
3333
3605
  <template id="settingsDialogTemplate">
@@ -3559,6 +3831,28 @@
3559
3831
  </div>
3560
3832
  </div>
3561
3833
 
3834
+ <!-- ── Tab: Projects ───────────────────────────────────── -->
3835
+ <div class="tab-panel" id="tab-projects" hidden>
3836
+ <div class="card" style="animation-delay: 0s">
3837
+ <div class="section-header">
3838
+ <div>
3839
+ <h2>Projects & Sharing domains</h2>
3840
+ <div class="section-meta">Choose which Sharing domain future memories use. “Stays on this device” means no Sharing domain is assigned yet, so it belongs in Projects review rather than Sync triage.</div>
3841
+ </div>
3842
+ </div>
3843
+ <div class="projects-toolbar">
3844
+ <input class="feed-search" id="projectsSearch" placeholder="Search project, path, git remote, or workspace id…" />
3845
+ <select id="projectsStatusFilter" aria-label="Project status filter"></select>
3846
+ </div>
3847
+ <div class="section-meta" id="projectsInventoryMeta">Loading project inventory…</div>
3848
+ <div class="project-inventory-list" id="projectsInventoryList" aria-live="polite"></div>
3849
+ <div class="section-actions projects-pagination">
3850
+ <button class="settings-button" id="projectsPrevPage" type="button">Previous</button>
3851
+ <button class="settings-button" id="projectsNextPage" type="button">Next</button>
3852
+ </div>
3853
+ </div>
3854
+ </div>
3855
+
3562
3856
  <!-- ── Tab: Sync ───────────────────────────────────────── -->
3563
3857
  <div class="tab-panel" id="tab-sync" hidden>
3564
3858