@takagaki/cortex-decisions-viewer 0.12.138 → 0.12.140

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/README.md CHANGED
@@ -55,7 +55,7 @@ cortex-decisions-viewer build [dir] [options]
55
55
  | `title` | タイトル |
56
56
  | `date` | 日付(`YYYY-MM-DD`)。一覧は日付降順。期間(月)フィルタの導出元 |
57
57
  | `sprint` | フィルタ用(`sprint` を使っている案件のみフィルタ表示) |
58
- | `category` | フィルタ用+カテゴリーバッジ |
58
+ | `category` | 画面には出さない(旧い記録の欄は読むだけ) |
59
59
  | `deciders` | 決定者チップ |
60
60
  | `summary` | 一覧・詳細の要約 |
61
61
  | `references` | 参照リンク。`[label](url)` 形式・URL・リポジトリルート相対パスに対応(ローカルパスはGitHubのblobリンクに変換) |
package/dist/build.js CHANGED
@@ -2573,7 +2573,6 @@ async function buildSite(opts, views) {
2573
2573
  return a.date < b.date ? 1 : -1;
2574
2574
  return a.id < b.id ? 1 : -1;
2575
2575
  });
2576
- const categories = uniqueSorted(decisions.map((d) => d.category).filter(Boolean));
2577
2576
  // 期間フィルタ用の月(YYYY-MM)を日付から導出し、降順(新しい順)にする
2578
2577
  const months = uniqueSorted(decisions.map((d) => d.date.slice(0, 7)).filter((m) => /^\d{4}-\d{2}$/.test(m))).reverse();
2579
2578
  // **突き合わなかった提案の件数をビルドログに出す。** path が1文字違うだけで
@@ -2632,7 +2631,6 @@ async function buildSite(opts, views) {
2632
2631
  ...(memoryV2 ? { memoryV2: true } : {}),
2633
2632
  sections,
2634
2633
  graph,
2635
- categories,
2636
2634
  months,
2637
2635
  intake: opts.intakeUrl && opts.projectKey && opts.intakeToken
2638
2636
  ? {
package/dist/render.js CHANGED
@@ -4986,12 +4986,6 @@ a.pager-btn:hover { text-decoration: none; }
4986
4986
  font-size: 12px; font-weight: 600; line-height: 1.6;
4987
4987
  background: #eceef1; color: #41474f;
4988
4988
  }
4989
- .badge.cat-技術選定 { background: #e8f0ff; color: #1d4ed8; }
4990
- .badge.cat-設計方針 { background: #e9f7ef; color: #1f7a45; }
4991
- .badge.cat-運用ルール { background: #fdf0e3; color: #b45309; }
4992
- .badge.cat-インフラ { background: #efe9fb; color: #6d28d9; }
4993
- .badge.cat-ビジネス { background: #fde9ef; color: #be185d; }
4994
- .badge.cat-デザイン { background: #fce7f3; color: #a21caf; }
4995
4989
  .badge.draft { background: #fef3c7; color: #92400e; border: 1px solid #fcd34d; }
4996
4990
  /* 直近のGold昇格で作られたレコードの印。draft(黄・要対応)と区別できるよう、新着を示す緑系にする */
4997
4991
  .badge.latest { background: #dcfce7; color: #166534; border: 1px solid #86efac; }
@@ -5022,7 +5016,6 @@ a.pager-btn:hover { text-decoration: none; }
5022
5016
  .story-card {
5023
5017
  border: 1px solid var(--border); border-radius: var(--radius); padding: 14px 18px; background: var(--surface);
5024
5018
  }
5025
- .story-card-focus { border-color: #2563eb; box-shadow: 0 0 0 2px rgba(37,99,235,0.25); }
5026
5019
  .story-quiet { margin: -6px 0; padding: 0 18px; font-size: 12.5px; color: var(--muted); }
5027
5020
  .story-quiet-date { font-variant-numeric: tabular-nums; }
5028
5021
  .story-card-heading { margin: 0 0 8px; font-size: 15px; }
@@ -5312,10 +5305,9 @@ a.pager-btn:hover { text-decoration: none; }
5312
5305
  .followup-section { margin: 14px 0 4px; }
5313
5306
  /* 置き換え(#699 F3) */
5314
5307
  .badge.retired { background: #f5f5f4; color: #57534e; border: 1px solid #d6d3d1; }
5315
- /* 論点・固さ・「今」(#1094)。欄の無い記録には付かない */
5316
- .badge.now { background: #1d4ed8; color: #fff; }
5317
- .card.is-now { border-left: 3px solid #1d4ed8; }
5308
+ /* 取り下げ済みルールの薄い表示 */
5318
5309
  .card.is-faded { opacity: .55; }
5310
+ /* 論点・固さ(#1094)。欄の無い記録には付かない */
5319
5311
  .badge.topic { background: #f5f3ff; color: #5b21b6; border: 1px solid #ddd6fe; font-weight: 500; }
5320
5312
  .badge.firmness-fixed { background: #ecfdf5; color: #047857; border: 1px solid #a7f3d0; }
5321
5313
  .badge.firmness-tentative { background: #fffbeb; color: #92400e; border: 1px solid #fde68a; }
@@ -6791,9 +6783,6 @@ ${calendarAddUrl.toString()}
6791
6783
  });
6792
6784
  return img;
6793
6785
  }
6794
- function catBadge(cat) {
6795
- return el("span", { class: "badge cat-" + cat, text: cat || "未分類" });
6796
- }
6797
6786
  // 未確認(status: draft = AI生成・人間未確認)の印。Gold層の4型(決定事項・用語集・メンバー・ルール)共通で、active・status無しには何も出さない
6798
6787
  function draftBadge(rec) {
6799
6788
  return rec && unconfirmed(rec) ? el("span", { class: "badge draft", text: "AI生成・未確認" }) : null;
@@ -7156,7 +7145,7 @@ ${calendarAddUrl.toString()}
7156
7145
  * -------------------------------------------------------------------------
7157
7146
  * 欄(topic / firmness / decidedBy)は**ビルド側で語彙・形を確かめてある**。欄の無い記録では
7158
7147
  * キーごと無いので、画面は有無だけを見る。🔴 **欄の無い記録だけの案件では要素を 1 つも作らない**
7159
- * (絞り込み・「今」・固さの札・決めた人の節が出ない=今と同じ DOM)。
7148
+ * (絞り込み・固さの札・決めた人の節が出ない=今と同じ DOM)。
7160
7149
  * 「置き換えられた」の判定は isRetired(ビルドが supersedes.ts で組んだ答え)をそのまま使う。
7161
7150
  */
7162
7151
  function hasTopic(rec) {
@@ -7182,27 +7171,6 @@ ${calendarAddUrl.toString()}
7182
7171
  }
7183
7172
  return a.id < b.id ? 1 : a.id > b.id ? -1 : 0;
7184
7173
  }
7185
- /**
7186
- * 札ごとの「今」の決定(一番新しく、置き換えられていない 1 件)の ID の集合。
7187
- * 削除済みは数えない(一覧と同じ材料)
7188
- */
7189
- function nowDecisionIds() {
7190
- var best = {};
7191
- visibleRecords(SITE.decisions).forEach(function (d) {
7192
- if (!hasTopic(d) || isRetired(d)) return;
7193
- var cur = best[d.topic];
7194
- if (!cur || newestDecisionFirst(d, cur) < 0) best[d.topic] = d;
7195
- });
7196
- var ids = {};
7197
- Object.keys(best).forEach(function (t) { ids[best[t].id] = true; });
7198
- return ids;
7199
- }
7200
- function isNowDecision(rec) {
7201
- return !!(rec && rec._kind === "decision" && hasTopic(rec) && nowDecisionIds()[rec.id]);
7202
- }
7203
- function nowBadge(rec) {
7204
- return isNowDecision(rec) ? el("span", { class: "badge now", title: "この論点で今有効な決定", text: "今" }) : null;
7205
- }
7206
7174
  /** 論点の札(一覧の行)。札が無ければ null */
7207
7175
  function topicBadge(rec) {
7208
7176
  return hasTopic(rec) ? el("span", { class: "badge topic", title: "論点", text: rec.topic }) : null;
@@ -7214,10 +7182,6 @@ ${calendarAddUrl.toString()}
7214
7182
  if (typeof f !== "string" || !Object.prototype.hasOwnProperty.call(FIRMNESS_CLASS, f)) return null;
7215
7183
  return el("span", { class: "badge firmness firmness-" + FIRMNESS_CLASS[f], title: "固さ", text: f });
7216
7184
  }
7217
- /** 置き換えられた決定を薄く出すか(論点の札を持つ決定だけ。欄の無い記録の見た目は変えない) */
7218
- function fadedClass(rec) {
7219
- return hasTopic(rec) && isRetired(rec) ? " is-faded" : "";
7220
- }
7221
7185
  /** 決めた人 1 人の札。関係者が名簿にあればそのページへ、{name, url} は url があれば元の URL へ */
7222
7186
  function decidedByChip(who) {
7223
7187
  if (!who || typeof who !== "object") return null;
@@ -8408,7 +8372,6 @@ ${calendarAddUrl.toString()}
8408
8372
  // 文中のリンクは「押したら進む=戻れる」に見えるので、そちらだけ積む
8409
8373
  function switchTab(tabKey, push) {
8410
8374
  listState.tab = tabKey;
8411
- storyFocus = null;
8412
8375
  listState.page = 1;
8413
8376
  if (push) history.pushState({}, "", tabUrl(tabKey));
8414
8377
  else history.replaceState(null, "", tabUrl(tabKey));
@@ -8545,7 +8508,7 @@ ${calendarAddUrl.toString()}
8545
8508
  }
8546
8509
  }
8547
8510
 
8548
- var listState = { tab: DEFAULT_TAB, q: "", category: "", month: "", status: "", topic: "", page: 1 };
8511
+ var listState = { tab: DEFAULT_TAB, q: "", month: "", status: "", topic: "", page: 1 };
8549
8512
 
8550
8513
  // 一覧のページネーション(描画コスト対策。1ページあたりの件数)
8551
8514
  var PAGE_SIZE = 30;
@@ -8690,8 +8653,6 @@ ${calendarAddUrl.toString()}
8690
8653
  var STORY_SUB_DEFAULT = "daily";
8691
8654
  var STORY_SUBS = [["daily", "日次"], ["weekly", "週次"], ["monthly", "月次"]];
8692
8655
  var storySub = STORY_SUB_DEFAULT;
8693
- // 記録の詳細の「この日のストーリー」から着いたときに目立たせる日(日次)・週の月曜(週次)。URL の ?day= / ?week=(engine #551)
8694
- var storyFocus = null;
8695
8656
 
8696
8657
  function storySubUrl(sub) {
8697
8658
  return sub === STORY_SUB_DEFAULT ? "?tab=story" : "?tab=story&sub=" + encodeURIComponent(sub);
@@ -8699,7 +8660,6 @@ ${calendarAddUrl.toString()}
8699
8660
  function switchStorySub(sub) {
8700
8661
  if (storySub === sub) return;
8701
8662
  storySub = sub;
8702
- storyFocus = null;
8703
8663
  history.replaceState(null, "", storySubUrl(sub));
8704
8664
  renderList();
8705
8665
  }
@@ -8722,7 +8682,7 @@ ${calendarAddUrl.toString()}
8722
8682
  ]));
8723
8683
  return;
8724
8684
  }
8725
- list.appendChild(el("section", { class: "story-card", "data-story-key": d.date }, [
8685
+ list.appendChild(el("section", { class: "story-card" }, [
8726
8686
  el("h3", { class: "story-card-heading", text: d.heading || d.date }),
8727
8687
  d.bodyHtml ? el("div", { class: "body", html: d.bodyHtml }) : null,
8728
8688
  // その日のファイルを GitHub で開く(表示の文字にファイル名を出さない)。URL が無い案件は出さない
@@ -8738,7 +8698,7 @@ ${calendarAddUrl.toString()}
8738
8698
  el("h4", { text: "人の追記" }),
8739
8699
  el("div", { class: "body", html: entry.humanHtml }),
8740
8700
  ]) : null;
8741
- return el("section", { class: "story-card", "data-story-key": entry.key }, [
8701
+ return el("section", { class: "story-card" }, [
8742
8702
  el("h3", { class: "story-card-heading", text: entry.heading }),
8743
8703
  entry.phase ? el("p", { class: "story-phase" }, [
8744
8704
  el("span", { class: "story-phase-label", text: phaseLabel }),
@@ -8840,53 +8800,6 @@ ${calendarAddUrl.toString()}
8840
8800
  if (storySub === "weekly") renderStoryWeekly();
8841
8801
  else if (storySub === "monthly") renderStoryMonthly();
8842
8802
  else renderStoryDaily();
8843
- // 記録の詳細から着いた日(週)のカードを目立たせて、そこまで送る
8844
- if (storyFocus) {
8845
- var focused = null;
8846
- app.querySelectorAll(".story-card[data-story-key]").forEach(function (c) {
8847
- if (!focused && c.getAttribute("data-story-key") === storyFocus) focused = c;
8848
- });
8849
- if (focused) {
8850
- focused.classList.add("story-card-focus");
8851
- if (typeof focused.scrollIntoView === "function") focused.scrollIntoView({ block: "start" });
8852
- }
8853
- }
8854
- }
8855
-
8856
- /**
8857
- * 記録の日付から「その日のストーリー」の行き先を決める(engine #551・オーナー決定 10/1)。
8858
- * その日の日次のカード(動きのあった日)があれば日次へ、無ければその日を含む週のあらすじへ。どちらも無ければ null(リンクを出さない)
8859
- */
8860
- function storyTargetOf(date) {
8861
- if (!date || !/^\\d{4}-\\d{2}-\\d{2}$/.test(date) || !hasTab("story")) return null;
8862
- var days = SITE.story || [];
8863
- for (var i = 0; i < days.length; i++) {
8864
- if (!days[i].quiet && days[i].date === date) return { sub: "daily", key: date, href: "?tab=story&day=" + encodeURIComponent(date) };
8865
- }
8866
- var weeks = (SITE.storyDigest && SITE.storyDigest.weeks) || [];
8867
- var monday = storyMondayOf(date);
8868
- for (var j = 0; j < weeks.length; j++) {
8869
- if (weeks[j].key === monday) return { sub: "weekly", key: monday, href: "?tab=story&sub=weekly&week=" + encodeURIComponent(monday) };
8870
- }
8871
- return null;
8872
- }
8873
- /** 記録の詳細の「この日のストーリー」(行き先が無ければ null) */
8874
- function storyLinkFor(rec) {
8875
- var target = storyTargetOf(rec && rec.date);
8876
- if (!target) return null;
8877
- var a = el("a", { class: "trace-btn story-link-btn", href: target.href, text: target.sub === "daily" ? "📖 この日のストーリー" : "📖 この週のストーリー" });
8878
- a.addEventListener("click", function (ev) {
8879
- // 新しいタブで開く操作(修飾キー・中ボタン)はブラウザに任せる(href は本物の URL)
8880
- if (ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey || (typeof ev.button === "number" && ev.button !== 0)) return;
8881
- ev.preventDefault();
8882
- listState.tab = "story";
8883
- storySub = target.sub;
8884
- storyFocus = target.key;
8885
- lastWasDetail = false;
8886
- history.pushState({}, "", target.href);
8887
- renderList();
8888
- });
8889
- return a;
8890
8803
  }
8891
8804
 
8892
8805
  // 導入経緯(overview.adoption)の表示情報。Home見出し横のチップに出すラベルだけを返す。
@@ -14245,6 +14158,22 @@ ${calendarAddUrl.toString()}
14245
14158
  var payload = { type: probeTypeOf(s.type), ref: s.ref };
14246
14159
  if (s.workspace) payload.workspace = s.workspace;
14247
14160
  try {
14161
+ // 🔴 **組織が分からない行は、確認の前に所属を判定し直す。** 表示のたびの自動判定
14162
+ // (requestOrgResolve)は 1 回きりで、アプリを招待したあとに押しても直らなかった。
14163
+ // 判定できたら、社内の鍵で測った結果(届かない)を出さず、反映したことと次の一手を伝える
14164
+ if (s.type === "slack" && s.orgUnknown === true) {
14165
+ try {
14166
+ var rr = await callIntake("slack-resolve", {});
14167
+ var rj = rr.ok ? await rr.json().catch(function () { return null; }) : null;
14168
+ if (rj && rj.resolved) {
14169
+ wrap.className = "ds-probe is-shown";
14170
+ msg.className = "ds-toggle-msg";
14171
+ msg.textContent = "✓ " + rj.resolved + "件の所属ワークスペースを反映しました。一覧の表示は次回の更新から正しくなります。";
14172
+ endBusy();
14173
+ return;
14174
+ }
14175
+ } catch (resolveErr) { /* 判定し直せなくても、そのまま確認へ進む */ }
14176
+ }
14248
14177
  var res = await callIntake("probe", payload);
14249
14178
  var j = await res.json().catch(function () { return {}; });
14250
14179
  if (!res.ok) {
@@ -19728,7 +19657,6 @@ ${calendarAddUrl.toString()}
19728
19657
  if (SITE.months && SITE.months.length) {
19729
19658
  filters.appendChild(buildSelect("すべての期間", SITE.months, listState.month, function (v) { listState.month = v; listState.page = 1; drawCards(); }, monthLabel));
19730
19659
  }
19731
- filters.appendChild(buildSelect("すべてのカテゴリー", SITE.categories, listState.category, function (v) { listState.category = v; listState.page = 1; drawCards(); }));
19732
19660
  var statusOptsD = statusFilterOptions(visibleRecords(SITE.decisions));
19733
19661
  if (statusOptsD.length) {
19734
19662
  filters.appendChild(buildSelect("すべての状態", statusOptsD, listState.status, function (v) { listState.status = v; listState.page = 1; drawCards(); }, statusLabel));
@@ -19763,7 +19691,7 @@ ${calendarAddUrl.toString()}
19763
19691
  }
19764
19692
 
19765
19693
  /**
19766
- * 今の絞り込み(検索語・期間・カテゴリー・状態)を当てた決定の一覧(並びは
19694
+ * 今の絞り込み(検索語・期間・状態・論点)を当てた決定の一覧(並びは
19767
19695
  * SITE.decisions の順=新しい順のまま)。drawCards と、詳細の「前へ/次へ」
19768
19696
  * (#2)の両方がここを通る——一覧の並びと前後移動の並びがずれないように、口を1つにする。
19769
19697
  */
@@ -19773,7 +19701,6 @@ ${calendarAddUrl.toString()}
19773
19701
  var all = visibleRecords(SITE.decisions);
19774
19702
  var out = all.filter(function (d) {
19775
19703
  if (listState.month && d.date.slice(0, 7) !== listState.month) return false;
19776
- if (listState.category && d.category !== listState.category) return false;
19777
19704
  if (!matchesStatusFilter(d)) return false;
19778
19705
  if (!matchesTopicFilter(d)) return false;
19779
19706
  if (q) {
@@ -19812,12 +19739,10 @@ ${calendarAddUrl.toString()}
19812
19739
 
19813
19740
  pg.slice.forEach(function (d) {
19814
19741
  var meta = el("div", { class: "card-meta" }, [
19815
- nowBadge(d),
19816
19742
  draftBadge(d),
19817
19743
  retiredBadge(d),
19818
19744
  latestBadge(d),
19819
19745
  el("span", { class: "mono", text: d.date || "----" }),
19820
- catBadge(d.category),
19821
19746
  firmnessBadge(d),
19822
19747
  topicBadge(d),
19823
19748
  ]);
@@ -19826,7 +19751,7 @@ ${calendarAddUrl.toString()}
19826
19751
  var traceD = el("a", { class: "mc-trace", href: "?tab=graph", text: "🕸 つながり" });
19827
19752
  traceD.addEventListener("click", function (ev) { ev.preventDefault(); ev.stopPropagation(); openExplorerFor(d); });
19828
19753
  meta.appendChild(traceD);
19829
- var card = el("div", { class: "card" + fadedClass(d) + (isNowDecision(d) ? " is-now" : ""), title: d.id, "data-record-id": d.id }, [
19754
+ var card = el("div", { class: "card", title: d.id, "data-record-id": d.id }, [
19830
19755
  meta,
19831
19756
  // 消したレコードは一覧でも取り消し線(次のビルドまで一覧には残る)
19832
19757
  cardTitleLink(d, d.deleted ? " is-deleted" : ""),
@@ -20717,7 +20642,7 @@ ${calendarAddUrl.toString()}
20717
20642
  // 警告帯が出ない記録の削除の口はここ(編集の行の末尾)。draft には出さない
20718
20643
  var delMsgR = attachDeleteToEditRow(r, editRowR);
20719
20644
  head.appendChild(el("div", { class: "detail-actions" }, [
20720
- el("div", { class: "detail-actions-row" }, [ traceBtn2, storyLinkFor(r) ]),
20645
+ el("div", { class: "detail-actions-row" }, [ traceBtn2 ]),
20721
20646
  editRowR.children.length ? editRowR : null,
20722
20647
  delMsgR,
20723
20648
  ]));
@@ -21659,19 +21584,17 @@ ${calendarAddUrl.toString()}
21659
21584
  // 警告帯が出ない記録の削除の口はここ(編集の行の末尾)。draft には出さない
21660
21585
  var delMsgD = attachDeleteToEditRow(d, editRowD);
21661
21586
  head.appendChild(el("div", { class: "detail-actions" }, [
21662
- el("div", { class: "detail-actions-row" }, [ traceBtn, storyLinkFor(d) ]),
21587
+ el("div", { class: "detail-actions-row" }, [ traceBtn ]),
21663
21588
  editRowD.children.length ? editRowD : null,
21664
21589
  delMsgD,
21665
21590
  ]));
21666
21591
  app.appendChild(head);
21667
21592
 
21668
21593
  var meta = el("div", { class: "detail-meta" }, [
21669
- nowBadge(d),
21670
21594
  draftBadge(d),
21671
21595
  retiredBadge(d),
21672
21596
  latestBadge(d),
21673
21597
  el("span", { class: "mono", text: d.date || "----" }),
21674
- catBadge(d.category),
21675
21598
  firmnessBadge(d),
21676
21599
  ]);
21677
21600
  meta.title = d.id;
@@ -22189,8 +22112,6 @@ ${calendarAddUrl.toString()}
22189
22112
  var validSub = false;
22190
22113
  STORY_SUBS.forEach(function (s) { if (s[0] === sub) validSub = true; });
22191
22114
  storySub = validSub ? sub : STORY_SUB_DEFAULT;
22192
- var focusKey = storySub === "weekly" ? getParam("week") : storySub === "daily" ? getParam("day") : null;
22193
- storyFocus = focusKey && /^\\d{4}-\\d{2}-\\d{2}$/.test(focusKey) ? focusKey : null;
22194
22115
  }
22195
22116
  renderList();
22196
22117
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.138",
3
+ "version": "0.12.140",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,