@takagaki/cortex-decisions-viewer 0.12.59 → 0.12.60

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 (2) hide show
  1. package/dist/render.js +140 -8
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -19,6 +19,8 @@ exports.overlayStateOnFleet = overlayStateOnFleet;
19
19
  exports.chatRowsToAdd = chatRowsToAdd;
20
20
  exports.gchatRowsToAdd = gchatRowsToAdd;
21
21
  exports.overlayGchatNotify = overlayGchatNotify;
22
+ exports.overlaySlackNotify = overlaySlackNotify;
23
+ exports.overlayNotifyAuto = overlayNotifyAuto;
22
24
  exports.devRowsToAdd = devRowsToAdd;
23
25
  exports.markExcludedPendingRows = markExcludedPendingRows;
24
26
  exports.designRowsToAdd = designRowsToAdd;
@@ -887,9 +889,11 @@ const REGISTERED_CAP_NAMES = {
887
889
  * `orgUnknown` で同じ穴を1つ埋めた(0.12.1)のに、同族の3欄が残っていた。
888
890
  */
889
891
  const REGISTERED_FIELDS = {
890
- chat: ["ref", "name", "workspace", "orgUnknown", "origin", "goldState", "notify"],
892
+ // notifyAuto(#589): 接続が確認できたので自動で通知先になった行の印。
893
+ // **`notify` と対で読む**——サーバは通知先である行にしか付けない
894
+ chat: ["ref", "name", "workspace", "orgUnknown", "origin", "goldState", "notify", "notifyAuto"],
891
895
  // notify(#572): スペースも通知先にできる。真偽値の扱いは chat の notify と同じ篩
892
- "google-chat": ["ref", "name", "notify"],
896
+ "google-chat": ["ref", "name", "notify", "notifyAuto"],
893
897
  dev: ["ref", "type"],
894
898
  // 🔴 **意図的に外した開発リポジトリ(#391)。** サーバは前から別キーで返していたが、
895
899
  // ここに無いので篩が丸ごと落としていた。**これが読めないと「読み取り停止中」の行を
@@ -974,8 +978,9 @@ function sanitizeRegisteredNow(v) {
974
978
  // **false はキーごと落とす。** 読み手は `=== true` で見る(`s.notify === true` /
975
979
  // `r.orgUnknown === true`)ので、false を載せても意味は同じ——載せないほうが
976
980
  // 「印が無い」と「印が false」の2通りを画面に持ち込まない。
977
- // 例外はこの2欄だけ——他の欄まで真偽値を通すと、許可リストが篩の意味を失う
978
- if (f === "orgUnknown" || f === "notify") {
981
+ // 例外はこの3欄だけ(#589 で `notifyAuto` を足した)——他の欄まで真偽値を通すと、
982
+ // 許可リストが篩の意味を失う
983
+ if (f === "orgUnknown" || f === "notify" || f === "notifyAuto") {
979
984
  if (fv === true)
980
985
  item[f] = true;
981
986
  continue;
@@ -1190,6 +1195,10 @@ function chatRowsToAdd(externals, rows) {
1190
1195
  // **真偽値の印は true のときだけ載せる**(読み手は `s.notify === true`。篩の項を参照)
1191
1196
  if (r.notify === true)
1192
1197
  row.notify = true;
1198
+ // 自動で設定された通知先の印(#589)。**足す行にも載せる**——載せないと、追加して
1199
+ // 接続を確認した直後(一番この説明が要る瞬間)だけ「自動で設定」が出ない
1200
+ if (r.notify === true && r.notifyAuto === true)
1201
+ row.notifyAuto = true;
1193
1202
  out.push(row);
1194
1203
  }
1195
1204
  return out;
@@ -1216,6 +1225,9 @@ function gchatRowsToAdd(externals, rows) {
1216
1225
  // 通知先の印(#572)。真偽値の印は true のときだけ載せる(chatRowsToAdd と同じ)
1217
1226
  if (r.notify === true)
1218
1227
  row.notify = true;
1228
+ // 自動で設定された通知先の印(#589・chatRowsToAdd と同じ条件)
1229
+ if (r.notify === true && r.notifyAuto === true)
1230
+ row.notifyAuto = true;
1219
1231
  out.push(row);
1220
1232
  }
1221
1233
  return out;
@@ -1264,6 +1276,106 @@ function overlayGchatNotify(externals, rows) {
1264
1276
  });
1265
1277
  return changed ? out : list;
1266
1278
  }
1279
+ /**
1280
+ * まとめ表が既に持っている Slack の行に、live(registeredNow)が「通知先」と言う印を**足す**(#589)。
1281
+ *
1282
+ * 🔴 **#589 で、まとめ表を待たずに通知先が増えるようになった。** まとめ表(fleet-status)は
1283
+ * 夜間の生成物なので、「接続を確認」で自動的に通知先になったチャンネルは**翌朝まで
1284
+ * `notify` を持たない**——札が出ないだけでなく、トグルが「通知先にする」のままになる。
1285
+ * **通知は届いているのに画面は通知先でないと言う**、という取り違えが最長 24 時間続く。
1286
+ *
1287
+ * 🔴 **足すだけで、外さない(`overlayGchatNotify` との違い)。** 画面の `registeredNow` からは
1288
+ * 「宣言を読んだうえで通知先でなかった」と「宣言を読めなかった」が区別できない
1289
+ * (どちらも `notify` のキーが無い。サーバ側 `buildRegisteredNow` は notify.json を読めなかった
1290
+ * 便では**全行から印を落とす**)。外す向きにも効かせると、GitHub が不調だった 1 回の読み取りで
1291
+ * **本物の通知先が画面から「通知先でない」に化ける**——通知の宛先を取り違えさせる方向なので、
1292
+ * 足す向きだけに限る。外す向きが遅れる(最長 24 時間「通知先」の札が残る)のは #589 より前からの
1293
+ * Slack の挙動で、こちらは悪化させない。Google Chat が両向きなのは、まとめ表が
1294
+ * その欄を**そもそも持たない**ので「読めなかった」と混ざりようが無いから。
1295
+ *
1296
+ * 新しく足す行の印は `chatRowsToAdd` が持つ(こちらは既にある行だけを直す)。
1297
+ *
1298
+ * **クロージャを持たない純関数に保つこと**(`.toString()` でクライアントへ渡す)。
1299
+ */
1300
+ function overlaySlackNotify(externals, rows) {
1301
+ const list = externals || [];
1302
+ if (!Array.isArray(rows))
1303
+ return list;
1304
+ const live = {};
1305
+ for (const r of rows) {
1306
+ if (!r || !r.ref || r.notify !== true)
1307
+ continue;
1308
+ // 鍵はワークスペース込み(チャンネルIDはワークスペースの中でしか一意でない・#104)
1309
+ live[String(r.workspace || "") + "\t" + String(r.ref)] = true;
1310
+ }
1311
+ let changed = false;
1312
+ const out = list.map(function (s) {
1313
+ if (!s || s.type !== "slack" || !s.ref || s.notify === true)
1314
+ return s;
1315
+ if (live[String(s.workspace || "") + "\t" + String(s.ref)] !== true)
1316
+ return s;
1317
+ changed = true;
1318
+ return Object.assign({}, s, { notify: true });
1319
+ });
1320
+ return changed ? out : list;
1321
+ }
1322
+ /**
1323
+ * 「自動で設定された通知先」の印(#589)を、まとめ表の行に重ねる。
1324
+ *
1325
+ * 🔴 **まとめ表(fleet-status)はこの印を持たない。** 印の置き場は案件リポの
1326
+ * `チャット/notify.json` の `autoDefault` で、それを読んで行に付けるのは中央(intake)の
1327
+ * `registeredNow` だけ。重ねないと、**自動で通知先になった行が「通知先」としか出ず、
1328
+ * 担当者は自分が設定した覚えのない通知先を前にして、外してよいのかも分からない**
1329
+ * (オーナー決定 4「外せる」が画面から読めない)。
1330
+ *
1331
+ * **印だけを重ねる。** `notify` そのものには触らない——通知先かどうかを live で重ねるのは
1332
+ * `overlayGchatNotify`(Google Chat)と `overlaySlackNotify`(Slack)の仕事で、**この関数より
1333
+ * 先に走る**。ここで二重に決めると「どちらが正か」が読めなくなる。印は `notify` が立っている
1334
+ * 行にしか付けない(サーバ側も同じ条件で付けている)。
1335
+ *
1336
+ * live に該当の能力のキーが無ければ(読めていない)何も変えない。
1337
+ *
1338
+ * **クロージャを持たない純関数に保つこと**(`.toString()` でクライアントへ渡す)。
1339
+ */
1340
+ function overlayNotifyAuto(externals, reg) {
1341
+ const list = externals || [];
1342
+ if (!reg || typeof reg !== "object")
1343
+ return list;
1344
+ const auto = {};
1345
+ const known = {};
1346
+ const scan = (rows, type, withWorkspace) => {
1347
+ if (!Array.isArray(rows))
1348
+ return;
1349
+ for (const r of rows) {
1350
+ if (!r || !r.ref)
1351
+ continue;
1352
+ const key = type + "\t" + (withWorkspace ? String(r.workspace || "") : "") + "\t" + String(r.ref);
1353
+ known[key] = true;
1354
+ auto[key] = r.notifyAuto === true && r.notify === true;
1355
+ }
1356
+ };
1357
+ scan(reg.chat, "slack", true);
1358
+ scan(reg["google-chat"], "google-chat", false);
1359
+ let changed = false;
1360
+ const out = list.map(function (s) {
1361
+ if (!s || !s.ref || (s.type !== "slack" && s.type !== "google-chat"))
1362
+ return s;
1363
+ const key = s.type + "\t" + (s.type === "slack" ? String(s.workspace || "") : "") + "\t" + String(s.ref);
1364
+ if (!Object.prototype.hasOwnProperty.call(known, key))
1365
+ return s;
1366
+ const want = auto[key] === true && s.notify === true;
1367
+ if ((s.notifyAuto === true) === want)
1368
+ return s;
1369
+ changed = true;
1370
+ const row = Object.assign({}, s);
1371
+ if (want)
1372
+ row.notifyAuto = true;
1373
+ else
1374
+ delete row.notifyAuto;
1375
+ return row;
1376
+ });
1377
+ return changed ? out : list;
1378
+ }
1267
1379
  /**
1268
1380
  * 開発の行で、まとめ表がまだ知らないもの。**鍵は `owner/repo` の生文字列。**
1269
1381
  *
@@ -1670,6 +1782,10 @@ function mergeRegisteredFleet(view, reg) {
1670
1782
  return out;
1671
1783
  // Google Chat の行の「通知先」は live が正(#572・まとめ表は持っていない)。足す前に重ねる
1672
1784
  out.externalSources = overlayGchatNotify(v.externalSources, reg["google-chat"]);
1785
+ // Slack の行の「通知先」も live が正(#589・まとめ表は夜間の生成物で、自動設定に追いつかない)
1786
+ out.externalSources = overlaySlackNotify(out.externalSources, reg.chat);
1787
+ // 「自動で設定」の印も live が正(#589・まとめ表は持っていない)。`notify` を重ねた後に置く
1788
+ out.externalSources = overlayNotifyAuto(out.externalSources, reg);
1673
1789
  const add = registeredRowsToAdd(v, reg);
1674
1790
  if (add.externalSources.length)
1675
1791
  out.externalSources = (out.externalSources || []).concat(add.externalSources);
@@ -5075,6 +5191,8 @@ ${sanitizeRegisteredNow.toString()}
5075
5191
  ${chatRowsToAdd.toString()}
5076
5192
  ${gchatRowsToAdd.toString()}
5077
5193
  ${overlayGchatNotify.toString()}
5194
+ ${overlaySlackNotify.toString()}
5195
+ ${overlayNotifyAuto.toString()}
5078
5196
  ${devRowsToAdd.toString()}
5079
5197
  ${markExcludedPendingRows.toString()}
5080
5198
  ${designRowsToAdd.toString()}
@@ -11248,8 +11366,19 @@ ${calendarAddUrl.toString()}
11248
11366
  * 「通知先」の札。**組み立てる場所を1つにする**——下のトグルで後から付け外しするので、
11249
11367
  * 描画時と押した後で別々に作ると、押した行だけ見た目の違う札が並ぶ。
11250
11368
  */
11251
- function notifyBadge() {
11252
- return el("span", { class: "badge ds-notify", text: "通知先" });
11369
+ /**
11370
+ * @param auto 接続が確認できたので**自動で**通知先になった行か(#589)。
11371
+ * 語を増やしすぎない——札は「通知先(自動で設定)」の1つで、外せることと
11372
+ * 「外したら戻さない」は hover の説明に置く(行に長い定型文を入れない)。
11373
+ * **押して通知先にした行には付けない**(トグルが作る札は常に素の「通知先」)
11374
+ */
11375
+ function notifyBadge(auto) {
11376
+ if (auto !== true) return el("span", { class: "badge ds-notify", text: "通知先" });
11377
+ return el("span", {
11378
+ class: "badge ds-notify",
11379
+ text: "通知先(自動で設定)",
11380
+ title: "接続が確認できたので、自動でこのチャンネルを通知先にしました。外すには「通知を止める」を押してください(外したら自動では戻しません)。",
11381
+ });
11253
11382
  }
11254
11383
 
11255
11384
  /**
@@ -11293,10 +11422,13 @@ ${calendarAddUrl.toString()}
11293
11422
  // 行の元データも合わせる。ライブの読み直しで同じ行が描き直されるまでの間、
11294
11423
  // ここだけが「いまどちらか」を持っている
11295
11424
  s.notify = next;
11425
+ // **押した時点で「自動で設定」ではなくなる(#589)。** 人が入り切りした行に
11426
+ // 「自動で設定」と出したままだと、外して押し直した行が自動で戻ったように見える
11427
+ s.notifyAuto = false;
11296
11428
  btn.textContent = labelOf();
11297
11429
  var badge = badges.querySelector(".ds-notify");
11298
11430
  // 並びは描画時と同じ(札の先頭)。後ろに足すと、押した行だけ順番が変わる
11299
- if (on && !badge) badges.insertBefore(notifyBadge(), badges.firstChild);
11431
+ if (on && !badge) badges.insertBefore(notifyBadge(false), badges.firstChild);
11300
11432
  if (!on && badge) badges.removeChild(badge);
11301
11433
  });
11302
11434
  });
@@ -13802,7 +13934,7 @@ ${calendarAddUrl.toString()}
13802
13934
  title: "このリポジトリは読み取り対象から除外されています(開発の登録ファイル dev-sources.json の exclude)。この画面からは戻せません。",
13803
13935
  }));
13804
13936
  }
13805
- if (s.notify === true) badges.appendChild(notifyBadge());
13937
+ if (s.notify === true) badges.appendChild(notifyBadge(s.notifyAuto === true));
13806
13938
  // **どのワークスペースのチャンネルかを、必ず行に出す(#104・2026-08-20 に社内も)。**
13807
13939
  //
13808
13940
  // 折りたたみの見出しでまとめるのをやめた(オーナー指摘「複雑になっちゃってる」)ので、
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.59",
3
+ "version": "0.12.60",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,