@takagaki/cortex-decisions-viewer 0.12.155 → 0.12.158

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 +68 -18
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -4972,10 +4972,9 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
4972
4972
  .card-facet-yomi { font-size: 11.5px; }
4973
4973
  .card-titlerow { display: flex; align-items: baseline; gap: 12px; margin: 0 0 6px; }
4974
4974
  .card-titlerow .card-title { flex: 0 1 auto; min-width: 0; overflow-wrap: anywhere; margin: 2px 0 0; }
4975
- /* 関係者のアイコン(名前のすぐ右・一覧と各ページで同じ見た目。名前は他の区画と同じく左詰め)。portal.id がある人はポータルの人のページへのリンク */
4976
- .card-namerow { display: flex; align-items: center; gap: 10px; margin: 2px 0 6px; }
4977
- .card-namerow .card-title { flex: 0 1 auto; min-width: 0; overflow-wrap: anywhere; margin: 0; }
4978
- .card-titlerow .mface { align-self: center; }
4975
+ /* 関係者のアイコン。一覧のカードは右端(名前と説明文の 2 行の中央)・詳細ページは名前のすぐ右。portal.id がある人はポータルの人のページへのリンク */
4976
+ .card-facerow { display: flex; align-items: center; gap: 12px; }
4977
+ .card-facemain { flex: 1 1 auto; min-width: 0; }
4979
4978
  .detail-namerow { display: flex; align-items: center; gap: 12px; margin: 0 0 10px; }
4980
4979
  .detail-namerow .detail-title { margin: 0; min-width: 0; flex: 0 1 auto; overflow-wrap: anywhere; }
4981
4980
  .mface { position: relative; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%; overflow: hidden; background: var(--border, #e5e7eb); color: var(--muted, #6b7280); font-size: 13px; font-weight: 700; line-height: 1; text-decoration: none; box-sizing: border-box; }
@@ -8124,11 +8123,22 @@ ${story_1.splitByNameLinks.toString()}
8124
8123
  var eb = fmErrorBadge(rec);
8125
8124
  if (eb) meta.appendChild(eb);
8126
8125
  var title = cardTitleLink(rec, titleExtra);
8127
- // 関係者は名前のすぐ右にアイコン(詳細と同じ mfAvatar・名前は左詰め)
8126
+ // 関係者のアイコンは一覧ではカードの右端(名前と説明文の 2 行の中央)。返す配列の face に持たせ、呼び出し側が組む
8128
8127
  var face = isMemberRec(rec) ? mfAvatar(rec) : null;
8129
- if (!meta.childNodes.length) return [el("div", { class: "card-titlerow" }, [title, face, trace])];
8130
- meta.appendChild(trace);
8131
- return [meta, face ? el("div", { class: "card-namerow" }, [title, face]) : title];
8128
+ var out;
8129
+ if (!meta.childNodes.length) out = [el("div", { class: "card-titlerow" }, [title, trace])];
8130
+ else { meta.appendChild(trace); out = [meta, title]; }
8131
+ out.face = face;
8132
+ return out;
8133
+ }
8134
+
8135
+ /** 一覧カードの本体を組む。関係者(head.face がある)は、上の段(.card-meta)の下の「名前+説明文」と右端のアイコンを横に並べる。 */
8136
+ function cardBody(head, rest) {
8137
+ var nodes = head.concat(rest);
8138
+ if (!head.face) return nodes;
8139
+ var top = nodes.filter(function (n) { return n && n.classList && n.classList.contains("card-meta"); });
8140
+ var main = nodes.filter(function (n) { return top.indexOf(n) < 0; });
8141
+ return top.concat([el("div", { class: "card-facerow" }, [el("div", { class: "card-facemain" }, main), head.face])]);
8132
8142
  }
8133
8143
 
8134
8144
  /**
@@ -9419,6 +9429,10 @@ ${story_1.splitByNameLinks.toString()}
9419
9429
  "github-issues": { icon: "🐙", label: "GitHub Issues" },
9420
9430
  "github-discussions": { icon: "💠", label: "GitHub Discussions" },
9421
9431
  };
9432
+ /** Teams 管理センターの会議ポリシー(文字起こしの設定がある画面)。固定の公開 URL */
9433
+ var TEAMS_ADMIN_MEETING_POLICY_URL = "https://admin.teams.microsoft.com/policies/meetings";
9434
+ /** Figma の設定(Security の個人アクセストークン)。固定の公開 URL */
9435
+ var FIGMA_SETTINGS_URL = "https://www.figma.com/settings";
9422
9436
  var DS_GATE = {
9423
9437
  "ok": { text: "接続OK", cls: "ds-gate-ok" },
9424
9438
  // **状態だけでなく、次にすることを書く。** 「bot未招待」では何をすればよいか分からない
@@ -9533,6 +9547,7 @@ ${story_1.splitByNameLinks.toString()}
9533
9547
  text: "文字起こしの外部取得がオフです",
9534
9548
  cls: "ds-gate-warn",
9535
9549
  help: "Teams 管理センターの会議設定で「文字起こしへの API アクセス」をオンにしてください。",
9550
+ helpLink: { href: TEAMS_ADMIN_MEETING_POLICY_URL, label: "Teams 管理センターを開く →" },
9536
9551
  },
9537
9552
  // RSC のチャネル会議には掛からない見込み(PoC C で確認)。文言は、この状態が
9538
9553
  // 返ったときのために残す(#841)
@@ -9547,6 +9562,7 @@ ${story_1.splitByNameLinks.toString()}
9547
9562
  text: "話者名付きの文字起こしがオフです",
9548
9563
  cls: "ds-gate-warn",
9549
9564
  help: "Teams 管理センターの会議設定で話者名付き文字起こしをオンにしてください。オフのままだと取り込みません。",
9565
+ helpLink: { href: TEAMS_ADMIN_MEETING_POLICY_URL, label: "Teams 管理センターを開く →" },
9550
9566
  },
9551
9567
  "folder_not_granted": {
9552
9568
  text: "フォルダへのアクセス許可がありません",
@@ -9751,6 +9767,7 @@ ${story_1.splitByNameLinks.toString()}
9751
9767
  * 出さないもの: テナント外の断り(#841・導入の有無を明かさない)と、確かめられなかった
9752
9768
  * 組織(source: "unknown"・帯が導線を出さない設計)
9753
9769
  */
9770
+ var GITHUB_APP_RECHECK_TEXT = "入れたら「接続を確認」を押してください。";
9754
9771
  function githubRowHelpParts(row) {
9755
9772
  if (!row) return null;
9756
9773
  if (githubOrgRefused(row)) return null;
@@ -9765,10 +9782,13 @@ ${story_1.splitByNameLinks.toString()}
9765
9782
  var linkable = !!slug || !LIVE_GH_OWNERS;
9766
9783
  var pick = row.gate === "unreachable" && meta && meta.appInstalled === true;
9767
9784
  var say = pick ? "GitHub App の設定で、このリポジトリを選んでください。" : "この組織に Cortex の GitHub App を入れてください。";
9768
- if (!linkable) return [say];
9785
+ if (!linkable) return pick ? [say] : [say, { br: true }, GITHUB_APP_RECHECK_TEXT];
9769
9786
  // 部品には行の生の値を渡す(宛先の検めは githubAppLinkUrl が持つ。ここの slug はリンクを出すかの判断だけ)
9770
9787
  var raw = meta && meta.appSlug;
9771
- return [say, pick ? { link: "インストール設定を開く →", kind: "settings", slug: raw } : { link: "GitHub App を入れる →", kind: "install", slug: raw }];
9788
+ // 入れた後の一手は同じ段落の 1 行に添える(行の補足は最大 1 段)。選び直す方(pick)は入れ直しではないので添えない
9789
+ return pick
9790
+ ? [say, { link: "インストール設定を開く →", kind: "settings", slug: raw }]
9791
+ : [say, { link: "GitHub App を入れる →", kind: "install", slug: raw }, { br: true }, GITHUB_APP_RECHECK_TEXT];
9772
9792
  }
9773
9793
  /**
9774
9794
  * Slack の「見えない」行(unreachable・no_token・組織不明の仮置き)に出す一手(c-07・g-66)。
@@ -10033,6 +10053,7 @@ ${story_1.splitByNameLinks.toString()}
10033
10053
  text: "トークンが未登録です",
10034
10054
  cls: "ds-gate-muted",
10035
10055
  help: "Figma のトークンを入れてください。",
10056
+ helpLink: { href: FIGMA_SETTINGS_URL, label: "Figma の設定でトークンを発行する →" },
10036
10057
  act: "figma-key",
10037
10058
  },
10038
10059
  // 「アクセス不可」では、トークンの失効なのか(403)ファイルを共有していないのか(404)が
@@ -10101,6 +10122,11 @@ ${story_1.splitByNameLinks.toString()}
10101
10122
  }
10102
10123
  if (gate.help) {
10103
10124
  var p = el("p", { class: cls, text: gate.help });
10125
+ // 行き先が決まっている一手は押せるリンクにする(人に操作を頼む文を、押せない文のまま出さない)
10126
+ if (gate.helpLink) {
10127
+ p.appendChild(document.createTextNode(" "));
10128
+ p.appendChild(el("a", { href: gate.helpLink.href, target: "_blank", rel: "noopener", text: gate.helpLink.label }));
10129
+ }
10104
10130
  appendGateActs(p, gate);
10105
10131
  return [p];
10106
10132
  }
@@ -16600,7 +16626,7 @@ ${story_1.splitByNameLinks.toString()}
16600
16626
  * オーバーレイ要素だけにリスナを張るのでは足りない(フォーカスが body にあると経路を通らない)。
16601
16627
  *
16602
16628
  * @param lines 表示する行(1行1段落)。先頭行が主文=読み上げの名前になる
16603
- * @param opts { okLabel, returnTo, okDanger, body }
16629
+ * @param opts { okLabel, cancelLabel, returnTo, okDanger, body }
16604
16630
  * okDanger … OK ボタンを赤で出すか(既定 true)。false は「広げる向き」の確認用
16605
16631
  * body … lines の後・ボタンの前に挿す DOM 節(任意)。**押す前に決めることがある確認**
16606
16632
  * のための口(いまこの口を使っている呼び出しは無い)。
@@ -16626,7 +16652,7 @@ ${story_1.splitByNameLinks.toString()}
16626
16652
  box.appendChild(pnode);
16627
16653
  });
16628
16654
  if (o.body) box.appendChild(o.body);
16629
- var cancel = el("button", { class: "modal-cancel", type: "button", text: "キャンセル" });
16655
+ var cancel = el("button", { class: "modal-cancel", type: "button", text: o.cancelLabel || "キャンセル" });
16630
16656
  // **既定は赤(ds-danger)。** ここに来る操作はほぼ全部が取り消せない向きなので、
16631
16657
  // 既定を変えない。**okDanger: false のときだけ通常の見た目**——「広げる向き」の
16632
16658
  // 操作を削除と同じ赤で出すと、止めるべき操作に見える
@@ -19447,7 +19473,7 @@ ${story_1.splitByNameLinks.toString()}
19447
19473
  draftBadge(r),
19448
19474
  r.date ? el("span", { class: "mono", text: r.date }) : null,
19449
19475
  ].concat(cardFacets(r)), r.deleted ? " is-deleted" : "");
19450
- var card = el("div", { class: "card", title: r.id, "data-record-id": r.id }, head.concat([
19476
+ var card = el("div", { class: "card", title: r.id, "data-record-id": r.id }, cardBody(head, [
19451
19477
  r.summary ? el("p", { class: "card-summary", text: r.summary }) : null,
19452
19478
  ]));
19453
19479
  card.addEventListener("click", function () { go(r.id); });
@@ -19982,14 +20008,35 @@ ${story_1.splitByNameLinks.toString()}
19982
20008
  var meta = app.querySelector(".detail-meta");
19983
20009
  if (meta && meta.parentNode) meta.parentNode.insertBefore(stale, meta.nextSibling);
19984
20010
  }
20011
+ /**
20012
+ * 削除の確認の窓に出す行。先頭行が主文(何を消すか=区画と題)、次が「消すと何が起きるか」。
20013
+ * 起きることは区画ごとに実際のとおり書く(サーバの DELETABLE_SECTIONS と同じ4区画。削除と同じ
20014
+ * コミットで区画の除外リストへ足す)。窓に出す語は短く、不安を煽らない。
20015
+ */
20016
+ var DELETE_EFFECTS = {
20017
+ Decisions: "この決定を消し、以後同じ題で作り直さないよう「除外決定」の一覧に足します。",
20018
+ Glossary: "この用語を消し、以後同じ語で作り直さないよう「除外用語」の一覧に足します。",
20019
+ Members: "この関係者の記録を消し、以後同じ人で作り直さないよう「除外メンバー」の一覧に足します。",
20020
+ Rules: "このルールを消し、以後同じ題で作り直さないよう「除外ルール」の一覧に足します。",
20021
+ };
20022
+ function deleteConfirmLines(rec, path) {
20023
+ var m = /^Cortex\\/([^/]+)\\//.exec(path || "");
20024
+ var dir = m ? m[1] : "";
20025
+ var title = (rec && rec.title) || (rec && rec.fileName) || "(題なし)";
20026
+ return [
20027
+ dirLabel(dir) + "「" + title + "」を削除します。",
20028
+ DELETE_EFFECTS[dir] || "この記録を消します。",
20029
+ "消した中身は履歴に残り、あとから戻せます。",
20030
+ ];
20031
+ }
19985
20032
  /**
19986
20033
  * 削除の口(ボタンと、その結果を出す行)。**置き場は呼び出し側が決める。**
19987
20034
  *
19988
20035
  * **どの記録にも出す**(cortex-engine #1094 段 4 問い 2・2026-10-04 のオーナー決定)。8/28 の裁定
19989
20036
  * 「人間の承認が挟まったものは削除の選択肢を出さない」は置き換えた——画面を見る人には裏の
19990
20037
  * 履歴が見えず、見た目の違いが無いのにボタンの有無が分かれるのは分からないため。人の手のある記録にも
19991
- * 同じ口を出す。確認は挟まない([spec:common.screen-delete-no-confirm]・git の履歴から戻せる。1 回押すと
19992
- * op=delete-record が 1 回送られる)。intake も status では断らない。
20038
+ * 同じ口を出す。押すと確認の窓を出し(2026-10-16・cortex-engine #1781)、[削除する]を選んだときだけ
20039
+ * op=delete-record が 1 回送られる。intake も status では断らない。
19993
20040
  *
19994
20041
  * 呼び出し側は2つ:
19995
20042
  * - draftNote …… 未確認の記録。「確認済みにする」と並べて警告帯の中に置く
@@ -19999,12 +20046,15 @@ ${story_1.splitByNameLinks.toString()}
19999
20046
  var path = deletableRecordPath(rec);
20000
20047
  if (!path) return null;
20001
20048
  // **語尾の「…」は 2026-08-29 のオーナーFBで外した。** 二択の相方(「確認済みにする」)と
20002
- // 語の形が揃わず、片方だけが下書きのように見えていた。**確認は挟まない**
20003
- // ([spec:common.screen-delete-no-confirm]・git の履歴から戻せる)
20049
+ // 語の形が揃わず、片方だけが下書きのように見えていた。確認は語尾ではなく、押したあとの
20050
+ // 確認の窓で出す(2026-10-16 のオーナーの誤削除を受けて・cortex-engine #1781)
20004
20051
  var btn = el("button", { class: "record-delete-btn", type: "button", text: "削除する" });
20005
20052
  var msg = el("div", { class: "record-delete-msg" });
20006
20053
  btn.addEventListener("click", async function () {
20007
- // [spec:common.screen-delete-no-confirm] 確認モーダルは挟まず、押したらそのまま 1 回送る
20054
+ // 押しただけでは送らない。画面内の確認の窓で[削除する]を選んだときだけ 1 回送る
20055
+ //(やめる・窓の外・Esc は何もしない。ブラウザの confirm は使わない)
20056
+ var ok = await openConfirm(deleteConfirmLines(rec, path), { okLabel: "削除する", cancelLabel: "やめる", returnTo: btn });
20057
+ if (!ok) return;
20008
20058
  await sendDeleteRecord(rec, path, msg, btn, function () { markRecordDeleted(rec); markPageStale(); });
20009
20059
  });
20010
20060
  return { btn: btn, msg: msg };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.155",
3
+ "version": "0.12.158",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,