@takagaki/cortex-decisions-viewer 0.12.193 → 0.12.196

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/dist/render.js CHANGED
@@ -5842,7 +5842,6 @@ a.ds-tile:hover { text-decoration: none; }
5842
5842
  **帯にしない**——症状ではなく手順の区切り。太字だけで分け、2 つ目の前は少し空ける */
5843
5843
  .mt-cal-head { color: var(--text); font-weight: 700; margin: 0; }
5844
5844
  .mt-cal-case { color: var(--text); font-weight: 700; margin: 12px 0 0; }
5845
- .mt-cal-case-note { font-weight: 400; color: var(--muted); }
5846
5845
  /* 作成済みだが共有の更新が終わっていない、の1行。**帯にしない**(カレンダーは使える) */
5847
5846
  .mt-cal-warn { color: #92400e; margin: 6px 0 0; }
5848
5847
  .mt-cal-act { margin-top: 8px; }
@@ -6826,8 +6825,21 @@ ${story_1.splitByNameLinks.toString()}
6826
6825
  var GCHAT_APP_NAME = "Cortex by Classmethod";
6827
6826
  var GCHAT_SHOT_STEP1 = "${google_chat_guide_images_1.GCHAT_APP_STEP1}";
6828
6827
  var GCHAT_SHOT_STEP2 = "${google_chat_guide_images_1.GCHAT_APP_STEP2}";
6829
- // 案件カレンダーに予定を作る手順の画像(#452)。理由は src/meet-guide-images.ts
6830
- var MEET_SHOT_CREATE_EVENT = "${meet_guide_images_1.MEET_GUIDE_CREATE_EVENT}";
6828
+ // Google Meet の手順動画のポスターと手順画像13枚(#1353)。理由は src/meet-guide-images.ts
6829
+ var MEET_SHOT_POSTER = "${meet_guide_images_1.MEET_GUIDE_POSTER}";
6830
+ var MEET_SHOT_STEP1 = "${meet_guide_images_1.MEET_GUIDE_STEP1}";
6831
+ var MEET_SHOT_STEP2 = "${meet_guide_images_1.MEET_GUIDE_STEP2}";
6832
+ var MEET_SHOT_STEP3 = "${meet_guide_images_1.MEET_GUIDE_STEP3}";
6833
+ var MEET_SHOT_STEP4 = "${meet_guide_images_1.MEET_GUIDE_STEP4}";
6834
+ var MEET_SHOT_STEP5 = "${meet_guide_images_1.MEET_GUIDE_STEP5}";
6835
+ var MEET_SHOT_STEP6 = "${meet_guide_images_1.MEET_GUIDE_STEP6}";
6836
+ var MEET_SHOT_STEP7 = "${meet_guide_images_1.MEET_GUIDE_STEP7}";
6837
+ var MEET_SHOT_STEP8 = "${meet_guide_images_1.MEET_GUIDE_STEP8}";
6838
+ var MEET_SHOT_STEP9 = "${meet_guide_images_1.MEET_GUIDE_STEP9}";
6839
+ var MEET_SHOT_STEP10 = "${meet_guide_images_1.MEET_GUIDE_STEP10}";
6840
+ var MEET_SHOT_STEP11 = "${meet_guide_images_1.MEET_GUIDE_STEP11}";
6841
+ var MEET_SHOT_STEP12 = "${meet_guide_images_1.MEET_GUIDE_STEP12}";
6842
+ var MEET_SHOT_STEP13 = "${meet_guide_images_1.MEET_GUIDE_STEP13}";
6831
6843
  // Figma の「発行のしかた」に載せる手順の画像(#547)。理由は src/figma-guide-images.ts
6832
6844
  var FIGMA_SHOT_STEP1 = "${figma_guide_images_1.FIGMA_GUIDE_STEP1}";
6833
6845
  var FIGMA_SHOT_STEP2 = "${figma_guide_images_1.FIGMA_GUIDE_STEP2}";
@@ -10656,15 +10668,6 @@ ${story_1.splitByNameLinks.toString()}
10656
10668
  // 🔴 **説明の1行は、その操作の直前に置く(#452)。** 押す前に読むものなので、
10657
10669
  // 操作の後ろに置くと「押してから理由を知る」順になる
10658
10670
  box.appendChild(el("p", { class: "mt-cal-note", text: "1. 予定を作るときに、カレンダーの欄で「" + projectName + "」を選びます。" }));
10659
- // 手順の画像。**上の1文だけで手順が完結する**(読み上げ・画像が出ない環境)ので、
10660
- // alt にも同じ内容を1文で書く。寸法は属性で明示——書かないと、モーダルを開いた
10661
- // 瞬間に画像の高さのぶん下の操作がずれる(Google Chat の手順と同じ理由)。
10662
- // loading=lazy は付けない(data: URI には取得が無いので何もしない)。
10663
- // 表示幅の上限とクリックでの原寸戻しは guideShot / .mt-shot が持つ(#455)
10664
- box.appendChild(guideShot({
10665
- src: MEET_SHOT_CREATE_EVENT, width: "1360", height: "949",
10666
- alt: "予定の作成ダイアログ。「カレンダー」の欄でプロジェクトのカレンダーが選ばれ、Google Meet を追加するボタンが示され、左の一覧の「他のカレンダー」に「Google カレンダーに追加」したプロジェクトカレンダーが並んでいる。",
10667
- }));
10668
10671
  // 🔴 **全員が必ず1回押すものなので主ボタンにする**(#452 のオーナー指摘)。
10669
10672
  // 見た目は「この案件のカレンダーを作る」= .ds-toggle-btn を**そのまま借りる**
10670
10673
  // ——色・枠・丸みを写すと値が2枚になり、片方だけ直る。.mt-cal-primary は
@@ -10691,12 +10694,12 @@ ${story_1.splitByNameLinks.toString()}
10691
10694
 
10692
10695
  // 主催者が別の人(社外・ポータルに居ない人)の会議でも、招待された人が自分のカレンダーで
10693
10696
  // 予定を編集して住所をゲストに足せば取り込まれる(2026-09-25 オーナー実測)
10694
- box.appendChild(el("p", { class: "mt-cal-case" }, [
10695
- document.createTextNode("ほかの人が作った会議のとき"),
10696
- el("span", { class: "mt-cal-case-note", text: "(社外の方やポータルに入っていない方が主催の会議など)" }),
10697
- ]));
10697
+ box.appendChild(el("p", { class: "mt-cal-case", text: "あなたが主催者ではない会議のとき" }));
10698
+ box.appendChild(el("p", { class: "mt-cal-note", text: "カレンダーの欄でプロジェクトのカレンダーを選べるのは、予定を作った本人だけです。" }));
10698
10699
  box.appendChild(el("p", { class: "mt-cal-note", text: "1. 招待された予定を開いて編集し、下の住所を「ゲストを追加」に貼って保存します。" }));
10699
10700
  box.appendChild(el("p", { class: "mt-cal-note", text: "2. 定例の会議は「すべての予定」を選びます。" }));
10701
+ box.appendChild(el("p", { class: "mt-cal-note", text: "保存のときに「招待メールを送信しますか?」と出たら[送信しない]、「組織外からのゲスト」と出たら[ゲスト全員を招待]で大丈夫です。" }));
10702
+ box.appendChild(el("p", { class: "mt-cal-note", text: "会議のメモは、主催者の側で Gemini のメモを ON にしてもらう必要があります。" }));
10700
10703
  // **見分けの付くクラスを付ける。** 同じカードに copyRow が2つ(bot のアカウントと
10701
10704
  // カレンダー ID)並ぶので、素の .rt-copy-text ではどちらか分からない。
10702
10705
  // 🔴 **住所のコピーはカード全体でここ 1 か所だけ(#764)**
@@ -11391,6 +11394,12 @@ ${story_1.splitByNameLinks.toString()}
11391
11394
  */
11392
11395
  var LIVE_FLEET = null;
11393
11396
  var LIVE_FLEET_FAILED = false;
11397
+ /**
11398
+ * どのワークスペースのチャンネルでも通知先にできる栓(op=state の notifyAnyWorkspace・#1370)。
11399
+ * **ライブだけの値**で、静的ビルドには無い(取得前・栓 off・古い intake では false=「準備中」)。
11400
+ * true のときだけ、ワークスペースを宣言した行に[通知先にする]を出す
11401
+ */
11402
+ var LIVE_NOTIFY_ANY_WS = false;
11394
11403
  /**
11395
11404
  * リアルタイム同期の可否(op=state の realtime。#113)。取得前・取得失敗時は null。
11396
11405
  *
@@ -12623,6 +12632,17 @@ ${story_1.splitByNameLinks.toString()}
12623
12632
  m.modal.insertBefore(githubCarousel, devDesc);
12624
12633
  }
12625
12634
  }
12635
+ } else if (cap === "会議") {
12636
+ // 🔴 **Google Meet のつなぎ方の動画+画像(#1353)は Slack・GitHub と同じ配置**(見出しのすぐ下・折りたたまない・中央・幅 480px 上限)。
12637
+ // この窓にはほかに説明文が無いので、見出しの直後に積む。投入の口が無い(つなげない)配信先には出さない
12638
+ if (SITE.intake && (!adapter || adapter === "google-meet")) {
12639
+ var meetCarousel = buildGuideCarousel("meet", MEET_GUIDE);
12640
+ if (meetCarousel) {
12641
+ meetCarousel.classList.add("mt-carousel-center");
12642
+ meetCarousel.setAttribute("data-guide-kind", "meet");
12643
+ m.modal.appendChild(meetCarousel);
12644
+ }
12645
+ }
12626
12646
  }
12627
12647
  // **なぜこの状態なのかを、押した先でも読めるようにする(#125②)。** タイルは常時出す
12628
12648
  // ようになったので、未接続の能力を押したときに中身が空になる場面が増えた。
@@ -13090,7 +13110,8 @@ ${story_1.splitByNameLinks.toString()}
13090
13110
  // 既定なので、タグを忘れると Slack の一覧が Google Chat モーダルに丸ごと出る
13091
13111
  if (liveListWanted("slack")) pushCap("チャット", liveList(
13092
13112
  "チャット",
13093
- function () { return externalsSig("slack", slackWorkspaces()); },
13113
+ // 通知先の栓(#1370)も入れる。行が同じでも、栓が開いた(ライブが届いた)ら行の出し分けを描き直す
13114
+ function () { return externalsSig("slack", [slackWorkspaces(), LIVE_NOTIFY_ANY_WS]); },
13094
13115
  function (box) {
13095
13116
  var items = liveExternals("slack");
13096
13117
  // 注記は**行より前**に置く(0件なら一覧の代わり・行があれば添え書き)
@@ -14322,13 +14343,16 @@ ${story_1.splitByNameLinks.toString()}
14322
14343
  *
14323
14344
  * 書き換わるのは チャット/notify.json だけで、**読み取りの対象(Gold 昇格)は動かない。**
14324
14345
  * 載っている=通知先という決め方の正本は engine の notify-targets.mjs で、
14325
- * **画面が別のフィルタを持たない**のがその規約——出し分けの条件も、あちらが落とす条件
14326
- * (ワークスペースを宣言している=顧客ワークスペース)と同じ1つだけにする。
14346
+ * **画面が別のフィルタを持たない**のがその規約。
14327
14347
  *
14328
- * **顧客ワークスペースの行にはトグルを出さない(#104)。** 読み取り専用の接続なので
14329
- * chat:write が無く、投げれば必ず失敗する(サーバも断る)。押せる形にしておくと
14330
- * 「押したら断られる」だけの操作が並ぶので、代わりに理由をその行に常時出す
14331
- * ——ワークスペースの札の説明は hover しないと読めない。
14348
+ * **ワークスペースを宣言した行(接続したワークスペースのチャンネル)の出し分け(#1370)。**
14349
+ * どのワークスペースかでは分けない。分けるのは 2 つだけ:
14350
+ * - 栓(LIVE_NOTIFY_ANY_WS)が開いていない … [通知先にする]を出さず「準備中」を出す
14351
+ * (夜間の通知がまだ宣言のある宛先へ投稿しないので、押せると「保存できたのに届かない」になる)
14352
+ * - 栓が開いている … 接続の canPost(op=state が台帳から重ねる・ライブだけの値)で
14353
+ * false → 「投稿の許可が無いので通知先にできません」+[ワークスペースを接続し直す]
14354
+ * true・不明 → [通知先にする](不明は押したときにサーバが確かめ、許可が無ければ同じ文と一手をその場に出す)
14355
+ * 理由は行に常時出す——ワークスペースの札の説明は hover しないと読めない。
14332
14356
  *
14333
14357
  * **確認ダイアログは出さない。** ON も OFF も同じ画面から即時に戻せる
14334
14358
  * (取り消せない「登録を解除」とは扱いを分ける)。
@@ -14338,21 +14362,26 @@ ${story_1.splitByNameLinks.toString()}
14338
14362
  */
14339
14363
  function notifyToggle(s, badges) {
14340
14364
  var wrap = el("div", { class: "ds-toggle" });
14341
- if (s.workspace) {
14342
- wrap.appendChild(el("span", {
14343
- class: "ds-toggle-msg",
14344
- text: "通知先にできません(読み取り専用の接続)",
14345
- }));
14365
+ // Slack の行で、ワークスペースを宣言しているか(Google Chat のスペースは workspace を持たない)
14366
+ var wsRow = s.type === "slack" && !!s.workspace;
14367
+ var on = s.notify === true;
14368
+ if (wsRow && !LIVE_NOTIFY_ANY_WS) {
14369
+ wrap.appendChild(el("span", { class: "ds-toggle-msg", text: NOTIFY_WS_PENDING_TEXT }));
14370
+ return wrap;
14371
+ }
14372
+ // 許可が無いと分かっている接続は、押せる形にしない(押しても断られるだけ)。
14373
+ // **通知先のまま許可を失った行は止められるようにする**(止める方向を塞がない)
14374
+ if (wsRow && !on && workspaceCanPost(s.workspace) === false) {
14375
+ notifyNoPostNote(wrap);
14346
14376
  return wrap;
14347
14377
  }
14348
- var on = s.notify === true;
14349
14378
  var labelOf = function () { return on ? "通知を止める" : "通知先にする"; };
14350
14379
  var btn = el("button", { class: "ds-toggle-btn", type: "button", text: labelOf() });
14351
14380
  var msg = el("div", { class: "ds-toggle-msg" });
14352
14381
  btn.addEventListener("click", async function () {
14353
14382
  var next = !on;
14354
- // **ワークスペースは送らない。** この分岐に来るのは宣言の無い行だけで、
14355
- // サーバも ON では受け取らない(送れば断られる)
14383
+ // **ワークスペースは Slack の行で宣言があるときだけ送る(#1370)。** サーバは登録簿の行と照合し、
14384
+ // 書く値も登録簿の行から引き写す(ここで送る値は鍵の照合にだけ使われる)。社内の行・スペースは送らない
14356
14385
  // 行の見た目を「いまの向き」へ揃える。**送信した瞬間に呼ぶ(楽観更新・#968 E)**・成功でも呼ぶ(同じ値で冪等)・
14357
14386
  // 断られたら元の向きで呼んで戻す
14358
14387
  var apply = function (v) {
@@ -14367,11 +14396,22 @@ ${story_1.splitByNameLinks.toString()}
14367
14396
  if (!on && badge) badges.removeChild(badge);
14368
14397
  };
14369
14398
  var before = on;
14370
- await sendConfig({ op: "set-notify", ref: s.ref, value: next }, msg, btn, function () {
14399
+ var payload = { op: "set-notify", ref: s.ref, value: next };
14400
+ if (wsRow) payload.workspace = String(s.workspace);
14401
+ await sendConfig(payload, msg, btn, function () {
14371
14402
  apply(next);
14372
14403
  }, {
14373
14404
  onOptimistic: function () { apply(next); },
14374
14405
  onRevert: function () { apply(before); },
14406
+ // 許可が無いと分かった(不明のまま押した)ときは、同じ文と[接続し直す]をその場に出す
14407
+ onRefused: function (j) {
14408
+ if (!wsRow || !j || j.code !== NOTIFY_WS_NO_POST_CODE) return false;
14409
+ msg.className = "ds-toggle-msg";
14410
+ msg.textContent = "";
14411
+ if (btn.parentNode === wrap) wrap.removeChild(btn);
14412
+ notifyNoPostNote(wrap);
14413
+ return true;
14414
+ },
14375
14415
  });
14376
14416
  });
14377
14417
  wrap.appendChild(btn);
@@ -14379,6 +14419,32 @@ ${story_1.splitByNameLinks.toString()}
14379
14419
  return wrap;
14380
14420
  }
14381
14421
 
14422
+ /** 栓が開くまでの、ワークスペースを宣言した行の文(#1370)。ID や組織の内部事情は書かない */
14423
+ var NOTIFY_WS_PENDING_TEXT = "このワークスペースへの通知は準備中です";
14424
+ /** 投稿の許可が無い接続の文(#1370)。サーバの NOTIFY_WORKSPACE_NO_POST と同じ症状を言う */
14425
+ var NOTIFY_WS_NO_POST_TEXT = "このワークスペースは投稿の許可が無いので通知先にできません。";
14426
+ /** サーバの理由コード(intake の NOTIFY_WORKSPACE_CODES.noPost と同じ綴り) */
14427
+ var NOTIFY_WS_NO_POST_CODE = "NOTIFY_WORKSPACE_NO_POST";
14428
+ /**
14429
+ * 接続(ワークスペース)が投稿できるか。op=state が台帳から重ねる canPost(**ライブだけの値**)を読む。
14430
+ * true / false のどちらでもなければ null(不明)——静的ビルドは build.ts が canPost を通さないので必ず不明
14431
+ */
14432
+ function workspaceCanPost(teamId) {
14433
+ var list = slackWorkspaces() || [];
14434
+ for (var i = 0; i < list.length; i++) {
14435
+ if (list[i] && list[i].teamId === teamId) return typeof list[i].canPost === "boolean" ? list[i].canPost : null;
14436
+ }
14437
+ return null;
14438
+ }
14439
+ /** 「投稿の許可が無い」の文と[ワークスペースを接続し直す](既存の接続の流れ・承認で許可を取り直す) */
14440
+ function notifyNoPostNote(wrap) {
14441
+ if (wrap.querySelector(".ds-notify-nopost")) return;
14442
+ var note = el("span", { class: "ds-toggle-msg ds-notify-nopost", text: NOTIFY_WS_NO_POST_TEXT });
14443
+ wrap.appendChild(note);
14444
+ var act = slackConnectInline("ワークスペースを接続し直す");
14445
+ if (act) wrap.appendChild(act);
14446
+ }
14447
+
14382
14448
  /**
14383
14449
  * Google Chat スペースの登録解除(#153)。removeChannelButton と同型で、
14384
14450
  * 書き換わる先が google-chat-spaces.json・鍵が ref のみ(スペースの ref は
@@ -16713,6 +16779,8 @@ ${story_1.splitByNameLinks.toString()}
16713
16779
  * 断られたときこそ、画面を正しい状態へ追いつかせないと堂々巡りになる
16714
16780
  * onOptimistic … 送信した瞬間に呼ぶ(本当の楽観更新・#968 E)。呼び手が自分で直す画面(通知先の札・入力欄)を先に更新する
16715
16781
  * onRevert … 断られた・通信が落ちた・何も変わらなかったときに呼ぶ。onOptimistic で直したものを元へ戻す
16782
+ * onRefused(j, status) … 断られたとき(重複の確認・「既に登録されています」以外)に、応答(j.code を含む)を渡す。
16783
+ * true を返すと既定の「✗ 理由」を出さない(呼び手が理由に合わせた一手を描いた・#1370)
16716
16784
  *
16717
16785
  * ## 楽観更新(cortex-engine #968 E)
16718
16786
  * 仮置き(notePendingOp)を**送信時**に書き、待ち表示(「保存中…」・「処理中…」)を出さずに一覧を先に更新する。
@@ -16846,6 +16914,11 @@ ${story_1.splitByNameLinks.toString()}
16846
16914
  // サーバの文言をそのまま出す(貼り方の案内・取り違えの警告を含んでいる)。
16847
16915
  // **例外は「他の人が先に変えていた」だけ**——サーバは再読み込みを案内するが、
16848
16916
  // 画面は既に追いついているので、済んでいることをやらせる案内になる(#127)
16917
+ // 理由コード(j.code・#1370)で次の一手を出し分ける呼び手には、先に渡す。true が返れば呼び手が描いた
16918
+ if (hooks && typeof hooks.onRefused === "function" && hooks.onRefused(j, res.status) === true) {
16919
+ endBusy();
16920
+ return;
16921
+ }
16849
16922
  msg.className = "ds-toggle-msg is-error";
16850
16923
  msg.textContent = "✗ " + ((res.status === 409 && raced && hooks.staleNote) || j.message || "保存できませんでした。");
16851
16924
  endBusy();
@@ -17422,7 +17495,7 @@ ${story_1.splitByNameLinks.toString()}
17422
17495
  badges.appendChild(el("span", {
17423
17496
  class: "badge ds-workspace",
17424
17497
  text: workspaceLabel(s.workspace),
17425
- title: "接続した Slack ワークスペースのチャンネルです(読み取り専用の接続なので、通知は届きません)。",
17498
+ title: "接続した Slack ワークスペースのチャンネルです。",
17426
17499
  }));
17427
17500
  } else if (s.orgUnknown === true) {
17428
17501
  badges.appendChild(el("span", {
@@ -17525,7 +17598,7 @@ ${story_1.splitByNameLinks.toString()}
17525
17598
  card.appendChild(removeChannelButton(s, card));
17526
17599
  // 通知先の入り切り。**解除と同じ条件で出す**——書き換える先は違う(notify.json)が、
17527
17600
  // どちらも「チャット/channels.json に登録がある行」でしか効かない。
17528
- // 仮置きの行(#388)には出さない——ワークスペースが未確定で、顧客ワークスペースなら
17601
+ // 仮置きの行(#388)には出さない——ワークスペースが未確定で、鍵(ワークスペース込み)が決まらない
17529
17602
  // 押しても断られる(本物の行が来てから)
17530
17603
  if (s.pending !== true) card.appendChild(notifyToggle(s, badges));
17531
17604
  }
@@ -17537,7 +17610,7 @@ ${story_1.splitByNameLinks.toString()}
17537
17610
  card.appendChild(removeSpaceButton(s, card));
17538
17611
  // 通知先の入り切り(#572)。Slack と同じ notifyToggle・同じ文言・同じ op(サーバは
17539
17612
  // ref の形(spaces/…)で Google Chat と判定する)。スペースの行に workspace は無いので
17540
- // 「読み取り専用の接続」の分岐には入らず、常にボタンが出る。仮置きの行(本物の行が
17613
+ // ワークスペースの出し分け(栓・投稿の許可)には入らず、常にボタンが出る。仮置きの行(本物の行が
17541
17614
  // 来るまで)には Slack と同じく出さない
17542
17615
  if (s.pending !== true) card.appendChild(notifyToggle(s, badges));
17543
17616
  }
@@ -18033,6 +18106,8 @@ ${story_1.splitByNameLinks.toString()}
18033
18106
  // ここより後に置くと**その案件だけ素通り**する
18034
18107
  // 追加の確認の栓と確認済みの一覧(#1357)。fleet より先に読む(立ち上げ直後の案件でも追加欄を作り替える)
18035
18108
  googleInfoApply(j && j.googleConfirm);
18109
+ // 通知先の栓(#1370)。fleet より先に読む(立ち上げ直後の案件でも行の出し分けが追いつく)。厳密比較
18110
+ LIVE_NOTIFY_ANY_WS = !!(j && j.notifyAnyWorkspace === true);
18036
18111
  LIVE_REGISTERED = sanitizeRegisteredNow(j && j.registeredNow);
18037
18112
  LIVE_REGISTERED_AT = startedAt;
18038
18113
  LIVE_STATE = sanitizeStateNow(j && j.stateNow);
@@ -18529,6 +18604,31 @@ ${story_1.splitByNameLinks.toString()}
18529
18604
  ],
18530
18605
  };
18531
18606
 
18607
+ // Google Meet のつなぎ方の動画+画像(#1353)。Slack・GitHub(SLACK_GUIDE・GITHUB_GUIDE)と同じ形で、モーダルの上に出す
18608
+ // (openCapabilityModal の会議の項)。動画の実 URL は guide に置かない(SITE.guideAssets.meet.video を build.ts の GUIDE_VIDEO_SOURCES が注入する)
18609
+ var MEET_GUIDE = {
18610
+ counter: true,
18611
+ video: {
18612
+ alt: "Google Meet の会議を Cortex に取り込むための手順の動画(約1分50秒)。案件のカレンダーを Google カレンダーに追加、予定の作成、Gemini のメモの確認、主催者でない会議への住所の追加までを画面で見せます。",
18613
+ poster: MEET_SHOT_POSTER,
18614
+ },
18615
+ shots: [
18616
+ { src: MEET_SHOT_STEP1, width: "960", height: "540", heading: "1. 最初に 1 回だけ[Google カレンダーに追加 →]", alt: "手順 1。Cortex の Google Meet の窓で[Google カレンダーに追加 →]が赤枠で示されている。" },
18617
+ { src: MEET_SHOT_STEP2, width: "960", height: "540", heading: "2. 「カレンダーを追加」で[追加]", alt: "手順 2。Google カレンダーの「カレンダーを追加」の確認で[追加]が赤枠で示されている。" },
18618
+ { src: MEET_SHOT_STEP3, width: "960", height: "540", heading: "3. 「他のカレンダー」に案件のカレンダーが入る", alt: "手順 3。左の一覧の「他のカレンダー」にプロジェクトのカレンダーが入り、赤枠で示されている。" },
18619
+ { src: MEET_SHOT_STEP4, width: "960", height: "540", heading: "4. 予定を作り、カレンダーの欄で案件のカレンダーを選ぶ", alt: "手順 4。予定を作る窓のカレンダーの欄の選択肢で、プロジェクトのカレンダーが赤枠で示されている。" },
18620
+ { src: MEET_SHOT_STEP5, width: "960", height: "540", heading: "5. Google Meet を足し、Gemini のメモが ON か見て保存", alt: "手順 5。Google Meet の行と「Gemini を使用して会議メモを作成する」の切り替え(ON)が赤枠で示されている。" },
18621
+ { src: MEET_SHOT_STEP6, width: "960", height: "540", heading: "6. 数分後、ゲストに cortex-notetaker が入れば完了", alt: "手順 6。予定の詳細のゲストに cortex-notetaker が入り、赤枠で示されている。" },
18622
+ { src: MEET_SHOT_STEP7, width: "960", height: "540", heading: "7. (あなたが主催者ではない会議)住所をコピー", alt: "手順 7。Cortex の窓のプロジェクトのカレンダーの住所と[コピー]が赤枠で示されている。" },
18623
+ { src: MEET_SHOT_STEP8, width: "960", height: "540", heading: "8. 招待された予定を開いて[編集]", alt: "手順 8。カレンダーで開いた予定の詳細で、鉛筆の[編集]が赤枠で示されている。" },
18624
+ { src: MEET_SHOT_STEP9, width: "960", height: "540", heading: "9. 「ゲストを追加」に住所を貼る", alt: "手順 9。編集画面の「ゲストを追加」に住所を貼った欄が赤枠で示されている。" },
18625
+ { src: MEET_SHOT_STEP10, width: "960", height: "540", heading: "10. 定例なら「すべての予定」→[OK]", alt: "手順 10。「定期的な予定の編集」で「すべての予定」が赤枠で示されている。" },
18626
+ { src: MEET_SHOT_STEP11, width: "960", height: "540", heading: "11. 招待メールは「送信しない」でよい", alt: "手順 11。「新しいゲストに招待メールを送信しますか?」の確認で[送信しない]が赤枠で示されている。" },
18627
+ { src: MEET_SHOT_STEP12, width: "960", height: "540", heading: "12. 「組織外からのゲスト」と出たら[ゲスト全員を招待]", alt: "手順 12。「組織外からのゲスト」の確認で[ゲスト全員を招待]が赤枠で示されている。" },
18628
+ { src: MEET_SHOT_STEP13, width: "960", height: "540", heading: "13. 数分後、ゲストに cortex-notetaker が入れば完了", alt: "手順 13。予定の詳細のゲストにプロジェクトのカレンダーと cortex-notetaker が入り、赤枠で示されている。" },
18629
+ ],
18630
+ };
18631
+
18532
18632
  /**
18533
18633
  * 鍵の入力欄に出す説明。kind は Lambda 側(resolveSecretTarget)と綴りを合わせること。
18534
18634
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.193",
3
+ "version": "0.12.196",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -19,7 +19,9 @@
19
19
  "!assets/guides/slack-poster.jpg",
20
20
  "!assets/guides/slack-annotated",
21
21
  "!assets/guides/github-poster.jpg",
22
- "!assets/guides/github-annotated"
22
+ "!assets/guides/github-annotated",
23
+ "!assets/guides/meet-poster.jpg",
24
+ "!assets/guides/meet-annotated"
23
25
  ],
24
26
  "engines": {
25
27
  "node": ">=18"
@@ -29,7 +31,7 @@
29
31
  "prepublishOnly": "npm run build",
30
32
  "demo": "npm run build && node dist/cli.js build ../../aidd-project-cortex/Cortex/Decisions/records --out .demo-site",
31
33
  "pretest": "node ../scripts/ci/assemble-engine.mjs",
32
- "test": "npm run test:syntax && npm run build && node --test --test-concurrency=4 test/*.test.mjs",
34
+ "test": "npm run test:syntax && npm run build && node --test --test-concurrency=4 --import ./test/helpers/private-tmpdir.mjs test/*.test.mjs",
33
35
  "test:syntax": "node --test test/embedded-js-syntax.test.mjs"
34
36
  },
35
37
  "dependencies": {