@takagaki/cortex-decisions-viewer 0.4.53 → 0.4.54

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
@@ -172,6 +172,13 @@ async function readFleetSources(repoRoot) {
172
172
  driveFolderIds: Array.isArray(s.driveFolderIds)
173
173
  ? s.driveFolderIds.map((x) => String(x)).filter(Boolean)
174
174
  : undefined,
175
+ // フォルダの表示名(ID→名前)。**ここに列挙し忘れると、型エラーも例外も出さずに
176
+ // 静かに消える**(origin / figmaFiles / driveFolderIds で3回踏んでいる)。
177
+ driveFolderNames: s.driveFolderNames != null && typeof s.driveFolderNames === "object" && !Array.isArray(s.driveFolderNames)
178
+ ? Object.fromEntries(Object.entries(s.driveFolderNames)
179
+ .map(([k, v]) => [k, String(v ?? "").trim()])
180
+ .filter(([, v]) => v))
181
+ : undefined,
175
182
  // 登録済みFigmaファイルの一覧。**1件ずつ外せるようにするために要る**
176
183
  // (先頭1件のURLしか無かった頃は、6ファイル持つ案件でどれも選べなかった)。
177
184
  figmaFiles: Array.isArray(s.figmaFiles)
package/dist/render.js CHANGED
@@ -781,6 +781,12 @@ a.ds-name:hover { text-decoration: underline; }
781
781
  .ds-addform .sec-input { margin-bottom: 6px; }
782
782
  .sec-input-inline { width: auto; max-width: 220px; margin-bottom: 0; }
783
783
  .sec-how { color: var(--muted); font-size: 12px; line-height: 1.7; margin: 0 0 10px; }
784
+ .sec-how p { margin: 0; }
785
+ /* 取り込みの条件は箇条書きで出す(ANDであることを読み飛ばせないように) */
786
+ .sec-how-list { margin: 4px 0; padding-left: 1.3em; }
787
+ .sec-how-list li { margin: 2px 0; }
788
+ /* 0件を黙って見せない(追加フォームだけだと「未登録」か「読めていない」か区別できない) */
789
+ .ds-empty { color: var(--muted); font-size: 12.5px; margin: 4px 0 10px; }
784
790
  .sec-input { width: 100%; box-sizing: border-box; font-size: 13px; padding: 7px 10px; margin-bottom: 8px; border: 1px solid var(--border); border-radius: 6px; background: #fff; color: var(--text); }
785
791
  .sec-input:focus { outline: none; border-color: var(--accent); }
786
792
  .ops-card {
@@ -1694,12 +1700,18 @@ const CLIENT_JS = `
1694
1700
  // (applyAddDriveFolder が enabled を立てる)ので「始める」を押す機会が無い。
1695
1701
  // 止めたいならフォルダを外す——登録そのものが意思表示、という会議と同じ考え方。
1696
1702
  var folders = s.driveFolderIds || [];
1703
+ // 名前は任意。**無ければIDを出す**(既存の案件は名前を持っていない)
1704
+ var fnames = s.driveFolderNames || {};
1697
1705
  if (folders.length) {
1698
1706
  var dlist = el("div", { class: "ds-subitems" });
1699
1707
  folders.forEach(function (id) {
1708
+ var fname = fnames[id];
1700
1709
  var row = el("div", { class: "ds-subitem" }, [
1701
- dsNameEl(id, "https://drive.google.com/drive/folders/" + id),
1710
+ dsNameEl(fname || id, "https://drive.google.com/drive/folders/" + id),
1702
1711
  ]);
1712
+ // **名前を出したときはIDも併記する。** 同名のフォルダを見分けられなくなるのと、
1713
+ // 「このIDを外す」という確認文と画面の表示が食い違うのを防ぐ
1714
+ if (fname) row.appendChild(el("span", { class: "ds-sync", text: id }));
1703
1715
  row.appendChild(removeButton({
1704
1716
  label: "このフォルダを外す",
1705
1717
  confirmLines: function () {
@@ -1769,16 +1781,20 @@ const CLIENT_JS = `
1769
1781
  flist.appendChild(row);
1770
1782
  });
1771
1783
  box.appendChild(flist);
1784
+ } else {
1785
+ // **0件を黙って見せない。** 追加フォームだけだと「まだ登録していない」のか
1786
+ // 「読めていない」のか区別できない(Driveは driveState で理由まで出している)
1787
+ box.appendChild(el("p", { class: "ds-empty", text: "同期対象のFigmaファイルはまだ登録されていません。" }));
1772
1788
  }
1773
1789
  box.appendChild(addForm({
1774
1790
  title: "+ Figmaファイルを追加",
1775
1791
  placeholder: "https://www.figma.com/design/…",
1776
1792
  namePlaceholder: "メモ(任意)",
1777
1793
  requiredNote: "FigmaのURLを入力してください。",
1778
- hint: "このファイルの画面インベントリ(画面名・サムネイル)が毎晩同期され、顧客も見るリポジトリに入ります。",
1794
+ hint: "このファイルの画面インベントリ(画面名・Figmaへのリンク)が毎晩同期されます。画像は取り込まれません。",
1779
1795
  confirmLines: function (v) {
1780
1796
  return [
1781
- "このFigmaファイルの画面名とサムネイルを、顧客も見るリポジトリに取り込みます。",
1797
+ "このFigmaファイルの画面名とFigmaへのリンクを、顧客も見るリポジトリに取り込みます(画像は取り込みません)。",
1782
1798
  "",
1783
1799
  "貼ったURLがこの案件のものか、もう一度確認してください。",
1784
1800
  "",
@@ -1805,13 +1821,17 @@ const CLIENT_JS = `
1805
1821
  * ②の材料を画面が出さないと、招待したのに届かない理由が分からない。
1806
1822
  */
1807
1823
  function meetingHowTo() {
1808
- // 会議名の条件は上の行(ds-keys)が出す。ここは「誰を招待するか」だけを言う
1809
- return el("p", {
1810
- class: "sec-how",
1811
- text:
1812
- "会議に cortex-notetaker Bot を招待すると、その会議の文字起こしが取り込まれ、議事録が作られます。" +
1813
- "招待しなければ取り込まれません(招待が取り込みの合図です)。上の会議名を含む会議が対象です。",
1814
- });
1824
+ // **2つの条件がANDであることを、読み飛ばせない形で出す。** 散文で並べていたときに
1825
+ // 「会議名は合っているのにBotを招待しておらず取り込まれなかった」事故が実際に起きた。
1826
+ // 会議名の条件は上の行(ds-keys)が出すので、ここでは「上の語」と参照するに留める。
1827
+ var wrap = el("div", { class: "sec-how" });
1828
+ wrap.appendChild(el("p", { text: "次の2つが揃った会議だけが取り込まれます。" }));
1829
+ var ul = el("ul", { class: "sec-how-list" });
1830
+ ul.appendChild(el("li", { text: "cortex-notetaker Bot が招待されている(定例はシリーズに1回でOK)" }));
1831
+ ul.appendChild(el("li", { text: "会議名に上の語のどれかが含まれている" }));
1832
+ wrap.appendChild(ul);
1833
+ wrap.appendChild(el("p", { text: "どちらか一方だけでは取り込まれません。" }));
1834
+ return wrap;
1815
1835
  }
1816
1836
 
1817
1837
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.4.53",
3
+ "version": "0.4.54",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,