@takagaki/cortex-decisions-viewer 0.12.158 → 0.12.159

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/build.js CHANGED
@@ -1074,8 +1074,8 @@ const MEETING_DATE_DIR = /^\d{8}$/;
1074
1074
  * すでにある会議を列挙する(#277。投入モーダルの「会議名」の選択肢になる)。
1075
1075
  *
1076
1076
  * **「会議名」は画面から自由に打てるが、打たせるのは最後の手段にする。** 手で打つと
1077
- * 表記ゆれ(`定例` と `定例MTG`)で同じ会議が2つのディレクトリに割れ、議事録の連番も
1078
- * 履歴も分かれる。すでにある名前を選べれば、その事故はほとんど起きない。
1077
+ * 表記ゆれ(`定例` と `定例MTG`)で同じ会議が2つのディレクトリに割れ、
1078
+ * 履歴が分かれる。すでにある名前を選べれば、その事故はほとんど起きない。
1079
1079
  *
1080
1080
  * 会議とみなすのは「**日付ディレクトリ(`YYYYMMDD`)を直接ぶら下げているディレクトリ**」。
1081
1081
  * 名前の規則ではなく実際の中身で決めるので、`会議/定例/デイリースクラム/20260120/` のような
@@ -1084,25 +1084,10 @@ const MEETING_DATE_DIR = /^\d{8}$/;
1084
1084
  * **会議ディレクトリ直下に日付ディレクトリがある形(相対パスが空)は除外する。**
1085
1085
  * その形は「会議名なしで投入された回」で、選択肢に出しても送り先にできない
1086
1086
  * (`meeting` が空文字になり Lambda が 400 を返す)。
1087
- *
1088
- * `minuteDates` は、その日付ディレクトリに議事録(`*_minutes.md`)が**すでにある**日付。
1089
- * 同じ日に文字起こしを足しても議事録は作り直されないので、送る前に画面で伝えるために使う。
1090
1087
  */
1091
1088
  async function collectMeetings(repoRoot) {
1092
1089
  const rootAbs = path.join(repoRoot, MEETING_DIR);
1093
1090
  const out = [];
1094
- const hasMinute = async (dirAbs) => {
1095
- try {
1096
- for (const e of await node_fs_1.promises.readdir(dirAbs, { withFileTypes: true })) {
1097
- if (e.isFile() && e.name.endsWith("_minutes.md"))
1098
- return true;
1099
- }
1100
- }
1101
- catch {
1102
- // 読めない回は「議事録なし」扱い(注意を出さないだけで、投入は妨げない)
1103
- }
1104
- return false;
1105
- };
1106
1091
  const walk = async (relParts) => {
1107
1092
  let entries;
1108
1093
  try {
@@ -1116,15 +1101,9 @@ async function collectMeetings(repoRoot) {
1116
1101
  e.name !== "templates" &&
1117
1102
  !e.name.startsWith("."));
1118
1103
  const rel = relParts.join("/");
1119
- const dates = dirs.filter((d) => MEETING_DATE_DIR.test(d.name)).map((d) => d.name);
1120
- if (dates.length && rel) {
1121
- const minuteDates = [];
1122
- for (const d of dates.sort()) {
1123
- if (await hasMinute(path.join(rootAbs, ...relParts, d)))
1124
- minuteDates.push(d);
1125
- }
1126
- out.push({ path: rel, minuteDates });
1127
- }
1104
+ const hasDates = dirs.some((d) => MEETING_DATE_DIR.test(d.name));
1105
+ if (hasDates && rel)
1106
+ out.push({ path: rel });
1128
1107
  // 日付ディレクトリの中は回の中身なので降りない(会議名にはならない)。
1129
1108
  // 深さは Lambda 側の上限(isValidMeetingDir の 5 セグメント)と揃える——
1130
1109
  // それより深い会議を選択肢に出しても、選んだ瞬間に 400 で断られるだけ
package/dist/render.js CHANGED
@@ -6093,11 +6093,6 @@ button.ops-card-btn:disabled { opacity: .6; cursor: default; }
6093
6093
  /* 会議名の欄(選択肢+新規入力+入力エラー) */
6094
6094
  .meeting-field { display: flex; flex-direction: column; gap: 6px; }
6095
6095
  .meeting-error { min-height: 0; }
6096
- /* 「その日はもう議事録がある」の注意。送信は妨げないので、エラー(赤)とは色を変える */
6097
- .modal-warn {
6098
- background: #fffbeb; border: 1px solid #fcd34d; border-radius: 8px;
6099
- padding: 8px 12px; font-size: 12.5px; color: #92400e; line-height: 1.7;
6100
- }
6101
6096
  .summary-box { background: var(--accent-weak); border: 1px solid #dce6fb; border-radius: var(--radius); padding: 12px 16px; color: #1e3a8a; }
6102
6097
  .deciders { display: flex; flex-wrap: wrap; gap: 8px; }
6103
6098
  .refs { margin: 0; padding-left: 18px; }
@@ -6679,7 +6674,7 @@ ${story_1.splitByNameLinks.toString()}
6679
6674
  * fleet-status.json のトップに置いた値を読む(cortex-engine #1094 便 γ 5-14)。
6680
6675
  * 値が届いていない(古い生成物)ときは空にして、宛先を名指さない文に倒す
6681
6676
  * (他の組織の画面に別の会社のアドレスを出さない)。
6682
- * 議事録の取り込みでも同じアカウントを使っている。
6677
+ * 会議の文字起こしの取り込みでも同じアカウントを使っている。
6683
6678
  */
6684
6679
  var DRIVE_INGEST_ACCOUNT = typeof SITE.driveReaderEmail === "string" ? SITE.driveReaderEmail : "";
6685
6680
  // Google Chat の「スペースにアプリを追加する」手順の画像(#389)。理由は
@@ -13000,7 +12995,7 @@ ${story_1.splitByNameLinks.toString()}
13000
12995
  // いまの一覧が一番価値を出しているのはそこなので、畳んで失わないようにする。
13001
12996
  var CAP_META = {
13002
12997
  "課題管理": { icon: "📋", desc: "課題・ドキュメントの同期" },
13003
- "会議": { icon: "🎙", desc: "文字起こしから議事録を生成" },
12998
+ "会議": { icon: "🎙", desc: "会議の文字起こしを取り込み" },
13004
12999
  "共有資料": { icon: "📁", desc: "資料をMarkdown化して取り込み" },
13005
13000
  "チャット": { icon: "💬", desc: "チャンネルの会話をGoldの材料に" },
13006
13001
  "デザイン": { icon: "🎨", desc: "Figmaのコメント(指摘)の取り込み" },
@@ -13554,7 +13549,7 @@ ${story_1.splitByNameLinks.toString()}
13554
13549
  if (manual) {
13555
13550
  var mBody = el("div", { class: "ds-tile-body" }, [
13556
13551
  el("div", { class: "ds-tile-name", text: "文字起こしを手動で追加" }),
13557
- el("div", { class: "ds-tile-desc", text: "自動取り込みできない会議(顧客主催・別ツール)の文字起こしから議事録を作ります" }),
13552
+ el("div", { class: "ds-tile-desc", text: "自動取り込みできない会議(顧客主催・別ツール)の文字起こしを取り込みます" }),
13558
13553
  ]);
13559
13554
  var mTile = el("button", { class: "ds-tile", type: "button", id: "ds-manual-" + cap }, [
13560
13555
  el("span", { class: "ds-tile-logo", text: "📥" }),
@@ -15761,16 +15756,16 @@ ${story_1.splitByNameLinks.toString()}
15761
15756
  // 読む人の操作対象ではない——画面から直せないものなので、次の一歩は「担当者へ連絡」。
15762
15757
  // 「手で直してください」も出さない(PM に設定ファイルを編集させる案内になっていた)。
15763
15758
  if (s.ingestState === "unset") {
15764
- box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトでは議事録の自動取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
15759
+ box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトでは会議の自動取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
15765
15760
  used = true;
15766
15761
  } else if (s.ingestState === "broken") {
15767
- box.appendChild(el("p", { class: "sec-how", text: "議事録の取り込み設定を読み取れないため、この画面からは変更できません。cortex の担当者にご連絡ください。" }));
15762
+ box.appendChild(el("p", { class: "sec-how", text: "会議の取り込み設定を読み取れないため、この画面からは変更できません。cortex の担当者にご連絡ください。" }));
15768
15763
  used = true;
15769
15764
  } else if (s.ingestState === "off") {
15770
15765
  // 自動取り込みを止めている案件(例: Teams を使っていて手動で取り込む運用)。
15771
15766
  // ここでトグルを出すと「押せば始まる」と読めるが、実際は設定ファイルの意思表示なので
15772
15767
  // 画面から気軽に反転させるものではない。状態だけを伝える。
15773
- box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトは議事録の自動取り込みを停止しています。" }));
15768
+ box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトは会議の自動取り込みを停止しています。" }));
15774
15769
  used = true;
15775
15770
  }
15776
15771
  }
@@ -17996,7 +17991,7 @@ ${story_1.splitByNameLinks.toString()}
17996
17991
  function intakeCardFor(cap) {
17997
17992
  if (!SITE.intake) return null;
17998
17993
  if (cap === "会議") {
17999
- return opsCard("🗒️", "会議の文字起こしを追加", "顧客主催の会議など、自動取り込みできない会議の文字起こしファイル(.txt / .docx 等)から議事録を生成します。ファイルを選ぶかテキストを貼って送信すると、数分で反映されます。", "transcript", "文字起こしを追加");
17994
+ return opsCard("🗒️", "会議の文字起こしを追加", "顧客主催の会議など、自動取り込みできない会議の文字起こしファイル(.txt / .docx 等)を取り込みます。ファイルを選ぶかテキストを貼って送信すると、数分で保存され、夜の処理で記憶の材料になります。", "transcript", "文字起こしを追加");
18000
17995
  }
18001
17996
  // 共有資料の手動追加は #968 でやめた(入口は Google ドライブ 1 つ)。ここでは作らない
18002
17997
  return null;
@@ -18918,7 +18913,7 @@ ${story_1.splitByNameLinks.toString()}
18918
18913
  // 列挙の先頭を PDF から元のファイルに入れ替えてある(**受け付ける拡張子は 1 つも変えていない**。
18919
18914
  // allowedExt は下のまま)。
18920
18915
  modal.appendChild(el("p", { class: "modal-desc", text: isT
18921
- ? "文字起こしファイル(テキスト・Word・PDF・字幕 等)を選んで送信してください。(送信後、数分で議事録が自動生成されます)"
18916
+ ? "文字起こしファイル(テキスト・Word・PDF・字幕 等)を選んで送信してください。(送信後、数分で保存され、夜の処理で記憶の材料になります)"
18922
18917
  : "資料ファイル(PowerPoint・Word・Excel・PDF・テキスト・画像 等)を選んで送信してください。元のファイルがあれば PDF より優先してください(画面を保存した PDF・スキャンした PDF からは文字を取り出せません)。(送信後、数分で内容が Markdown に変換されて取り込まれます)" }));
18923
18918
 
18924
18919
  var selectedFiles = [];
@@ -18957,7 +18952,6 @@ ${story_1.splitByNameLinks.toString()}
18957
18952
  var meetingSelect = null;
18958
18953
  var meetingNewInput = null;
18959
18954
  var meetingError = null;
18960
- var dupWarn = null;
18961
18955
  // ユーザーが会議を自分で選んだか。**選んだ後はファイル名からの推測で上書きしない**
18962
18956
  var meetingTouched = false;
18963
18957
  if (isT) {
@@ -18980,9 +18974,6 @@ ${story_1.splitByNameLinks.toString()}
18980
18974
  meetingError.hidden = true;
18981
18975
  meetingBox.appendChild(meetingError);
18982
18976
  modal.appendChild(fieldRow("会議名(必須)", meetingBox));
18983
- dupWarn = el("div", { class: "modal-warn meeting-dup-warn" });
18984
- dupWarn.hidden = true;
18985
- modal.appendChild(dupWarn);
18986
18977
  }
18987
18978
 
18988
18979
  modal.appendChild(fieldRow("お名前(必須)", nameInput));
@@ -19091,35 +19082,9 @@ ${story_1.splitByNameLinks.toString()}
19091
19082
  }
19092
19083
  return null;
19093
19084
  }
19094
- function compactDate(iso) { return String(iso || "").split("-").join(""); }
19095
-
19096
- // ---- すでに議事録がある日 ----
19097
- function selectedMeeting() {
19098
- var v = meetingValue();
19099
- if (!v) return null;
19100
- for (var i = 0; i < meetingList.length; i++) if (meetingList[i].path === v) return meetingList[i];
19101
- return null;
19102
- }
19103
- function dupEntries() {
19104
- var m = selectedMeeting();
19105
- if (!m || !m.minuteDates || !m.minuteDates.length) return [];
19106
- return selectedFiles.filter(function (e) {
19107
- return e.date && m.minuteDates.indexOf(compactDate(e.date)) !== -1;
19108
- });
19109
- }
19110
- function refreshDupWarn() {
19111
- if (!dupWarn) return;
19112
- var dups = dupEntries();
19113
- dupWarn.hidden = !dups.length;
19114
- dupWarn.textContent = dups.length
19115
- ? "⚠ この日付には既に議事録があります。ファイルは保存されますが、議事録の自動生成は行われません: "
19116
- + dups.map(function (e) { return e.file.name; }).join(", ")
19117
- : "";
19118
- }
19119
19085
 
19120
19086
  function update() {
19121
19087
  refreshMeetingError();
19122
- refreshDupWarn();
19123
19088
  var ok = !!(nameInput.value.trim() && selectedFiles.length);
19124
19089
  // 文字起こしは会議名が確定し、各ファイルの日付と記録の種類が入っているときだけ送れる
19125
19090
  var kindMissing = selectedFiles.filter(function (e) { return asksKind(e) && !e.recordKind; }).length;
@@ -19179,7 +19144,7 @@ ${story_1.splitByNameLinks.toString()}
19179
19144
  function isAllowed(f) {
19180
19145
  // 資料はフロントで弾かない(どんなファイルも受け付ける)。対応可否の最終判断はバックエンドに任せる。
19181
19146
  if (!isT) return true;
19182
- // 文字起こしは議事録化に不適なファイルを避けるため拡張子で判定する。
19147
+ // 文字起こしは文字起こしに不適なファイルを避けるため拡張子で判定する。
19183
19148
  var ext = extOf(f.name);
19184
19149
  return !!(ext && allowedExt[ext]);
19185
19150
  }
@@ -19220,10 +19185,7 @@ ${story_1.splitByNameLinks.toString()}
19220
19185
  // 閉じる経路(Escape・背景クリック)は makeModal 側に用意されている
19221
19186
  cancelBtn.addEventListener("click", function () { mk.close(); });
19222
19187
  submitBtn.addEventListener("click", function () {
19223
- // 全ファイルが「議事録のある日」なら、成功メッセージも「生成はされない」側に寄せる。
19224
- // ✓ の直後に「数分後に議事録が自動生成され…」と出すと、待っても出ない
19225
- var allDup = isT && selectedFiles.length > 0 && dupEntries().length === selectedFiles.length;
19226
- submitIntake(kind, selectedFiles, nameInput.value, status, submitBtn, isT ? meetingValue() : null, allDup);
19188
+ submitIntake(kind, selectedFiles, nameInput.value, status, submitBtn, isT ? meetingValue() : null);
19227
19189
  });
19228
19190
  }
19229
19191
  /**
@@ -19248,7 +19210,7 @@ ${story_1.splitByNameLinks.toString()}
19248
19210
  el("div", { class: "modal-reopen-note", text: "開き直したら、このタブに戻ってもう一度[送信]を押してください。入力はそのまま使えます。" }),
19249
19211
  ]);
19250
19212
  }
19251
- async function submitIntake(kind, entries, submitter, status, submitBtn, meeting, allDup) {
19213
+ async function submitIntake(kind, entries, submitter, status, submitBtn, meeting) {
19252
19214
  var intake = SITE.intake;
19253
19215
  var isT = kind === "transcript";
19254
19216
  function setStatus(msg, isError) { status.className = "modal-status" + (isError ? " modal-status-error" : ""); status.textContent = msg; }
@@ -19296,9 +19258,7 @@ ${story_1.splitByNameLinks.toString()}
19296
19258
  if (!sub.ok) return fail((sub.j && sub.j.message) || "取り込みに失敗しました。時間をおいて再度お試しください。", sub.j && sub.j.code);
19297
19259
  status.className = "modal-status";
19298
19260
  status.textContent = "";
19299
- status.appendChild(el("div", { class: "modal-ok", text: allDup
19300
- ? "✓ 送信しました。保存されました(この日付には既に議事録があるため、議事録の自動生成は行われません)"
19301
- : "✓ 送信しました。数分後に議事録が自動生成され反映されます。" }));
19261
+ status.appendChild(el("div", { class: "modal-ok", text: "✓ 送信しました。保存されました。夜の処理で記憶の材料になります。" }));
19302
19262
  var paths = (sub.j && sub.j.committed) || [];
19303
19263
  if (paths.length && sub.j.repo) {
19304
19264
  var br = SITE.branch || "main";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.158",
3
+ "version": "0.12.159",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,