@takagaki/cortex-decisions-viewer 0.12.43 → 0.12.44

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 +32 -97
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -67,8 +67,8 @@ function renderSite(site, assets) {
67
67
  // </script> によるブレイクアウトを防ぐため < をエスケープして埋め込む
68
68
  // Claude Code Web ディープリンク(この案件リポ+狙ったプロンプトで開く)。repoBaseUrl から slug を導出(追加入力なし)。
69
69
  const repoSlug = projectRepoSlug(site.repoBaseUrl);
70
- // ヘッダーの「AIに聞く」と、接続マップの下の「Claude Code で開く」(#465)は
71
- // **同じ askAiUrl を呼ぶ**(同じ先を開くことを、引数の写しではなく構造で保証する)
70
+ // ヘッダーの「AIに聞く」の押し先。組み立ては askAiUrl 1か所に置いてある
71
+ // (claudeCodeUrl を直に呼ぶと、引数を1つ落とした側だけが違う先を開く)
72
72
  const askUrl = askAiUrl(site);
73
73
  // ※ 投入フォーム設定 site.intake は build.ts が --intake-url/--intake-token/--project-key から付与する。
74
74
  const dataJson = JSON.stringify(site).replace(/</g, "\\u003c");
@@ -384,9 +384,8 @@ exports.CLAUDE_CODE_LINK = { home: CLAUDE_CODE_HOME };
384
384
  /**
385
385
  * 「この案件について聞く」導線の指示文。
386
386
  *
387
- * ヘッダーの「💬 プロジェクトについてAIに聞く」と、接続マップの下の
388
- * 「Claude Code で開く」(#465)が**同じ先を開くと決めた**ので、指示文はここ1か所に置く。
389
- * 片方に書き写すと、URL は同じでも**開いた先の AI への最初の一言が2通り**になる。
387
+ * **AI 導線の指示文はここ1か所に持つ。** 書き写した先が増えると、URL は同じでも
388
+ * **開いた先の AI への最初の一言が2通り**になる(`askAiUrl` と対で読む)。
390
389
  *
391
390
  * `data-ai-prompt` にも同じ値を残す(接続状況が届いたら href を組み直す・syncAiLinks)。
392
391
  */
@@ -394,8 +393,8 @@ const ASK_PROMPT = "このプロジェクトの概要について教えてくだ
394
393
  /**
395
394
  * `repoBaseUrl`(https://github.com/owner/repo)から Claude Code に渡す `owner/repo`。
396
395
  *
397
- * **ヘッダーの導線(renderSite)と図の下の箱(renderConnectionMap)が同じ先を開く**ので、
398
- * 導出もここ1か所に置く。形の検査は claudeCodeUrl 側(isRepositorySlug)が行うため、
396
+ * **AI 導線の slug の導出はここ1か所に置く**(`askAiUrl` と対)。形の検査は
397
+ * claudeCodeUrl 側(isRepositorySlug)が行うため、
399
398
  * ここは「取れなければ空文字」に留める——呼び出し側は空でもそのまま渡してよい
400
399
  * (claudeCodeUrl が素のリンクへ倒す)。
401
400
  */
@@ -409,9 +408,10 @@ function projectRepoSlug(repoBaseUrl) {
409
408
  /**
410
409
  * 「この案件を Claude Code Web で開く」URL。
411
410
  *
412
- * 🔴 **ヘッダーの「AIに聞く」と、図の下の「Claude Code で開く」(#465)はこの1本を呼ぶ。**
413
- * 呼び出し側で `claudeCodeUrl` を組み直すと、引数を1つ落とした側だけが
414
- * **開発リポジトリを載せない/ツールの段落を付けない**——「同じ先」が静かに割れる。
411
+ * 🔴 **AI 導線はこの1本を呼ぶ(`claudeCodeUrl` の呼び出しを写さない)。** 呼び出し側で
412
+ * 組み直すと、引数を1つ落とした側だけが**開発リポジトリを載せない/ツールの段落を
413
+ * 付けない**——「同じ先」が静かに割れる。指示文・slug の導出・URL の組み立ての3つを、
414
+ * ここと ASK_PROMPT / projectRepoSlug に閉じておく。
415
415
  *
416
416
  * `?? []` は必須——build.ts は fleet-status.json が無い案件で externalSources を持たない。
417
417
  * 第4引数は使っているツールの段落(#275・全導線に同じ段落を付ける)。
@@ -2477,22 +2477,11 @@ function repoNameOf(repoBaseUrl) {
2477
2477
  // owner だけの URL(github.com/owner)を名前と取り違えない
2478
2478
  return slug.includes("/") ? name : "";
2479
2479
  }
2480
- /**
2481
- * 図の下(「Claude Code で開く」の箱の直下)に出す注釈(#465)。
2482
- *
2483
- * 🔴 **社内の手続き(Slack のチャンネル名・宛先・申請文)は書かない。** 他社をテナントと
2484
- * して入れる前提の画面に、クラスメソッド社内の申請の宛先を一律で出さない。
2485
- * 🔴 **出し分けない。** Claude GitHub App が追加済みかは Cortex からは確かめられない
2486
- * (追加先を一覧する API は組織オーナー権限か App 自身の資格が要る)。**判定できないものを
2487
- * 出し分けると必ずどちらかで嘘になる**ので、1行を常に出す。
2488
- */
2489
- const CONN_MAP_NOTE = "Claude Code でこのリポジトリが選べないときは、あなたにこのリポジトリを見る GitHub の権限があるか、GitHub App「Claude」にこのリポジトリが追加されているかを、GitHub 組織の管理者に確かめてください";
2490
2480
  /**
2491
2481
  * 操作タブ最上部の接続マップを組み立てる(ビルド時。`<template id="conn-map">` に焼く)。
2492
2482
  *
2493
- * 戻り値は **SVG の図+その下の注釈 1 行(`<p class="conn-map-note">`)** で、
2494
- * クライアント側(`renderConnMap`)は丸ごと clone して置くだけ。注釈を SVG の中に
2495
- * 入れないのは、SVG の `<text>` が折り返せないため(CONN_MAP_NOTE の項)。
2483
+ * 戻り値は **SVG の図 1 枚**で、クライアント側(`renderConnMap`)は丸ごと clone して
2484
+ * 置くだけ。
2496
2485
  */
2497
2486
  function renderConnectionMap(site) {
2498
2487
  const internals = site.internalSources ?? [];
@@ -2638,7 +2627,7 @@ function renderConnectionMap(site) {
2638
2627
  // 案件の表示名へ落とす——名前の無い箱にしない。
2639
2628
  const repoName = repoNameOf(site.repoBaseUrl) || site.title;
2640
2629
  const repoLabel = repoName.length > 24 ? repoName.slice(0, 23) + "…" : repoName;
2641
- // 中央の箱のジオメトリ(下の「Claude Code で開く」もここから導く。数字を2度書かない)
2630
+ // 中央の箱のジオメトリ(rect の座標をここから導く。数字を2度書かない)
2642
2631
  const REPO_LEFT = REPO_X - 170;
2643
2632
  const REPO_W = 340;
2644
2633
  const REPO_Y = 240;
@@ -2657,44 +2646,17 @@ function renderConnectionMap(site) {
2657
2646
  `<g class="cm-repo-logo" transform="translate(${startX.toFixed(1)}, ${266 - ICON / 2 - 1})">${GITHUB_ICON}</g>` +
2658
2647
  `<text class="cm-repo-label" x="${(startX + ICON + GAP).toFixed(1)}" y="272">${escapeHtml(repoLabel)}</text>` +
2659
2648
  `</g>`;
2660
- // ---- 「Claude Code で開く」(#465)------------------------------------------
2661
- // **図の流れを1本にする。** つないだツール → コンテキストリポジトリ →
2662
- // **それを読む Claude Code**。押す先はヘッダーの「AIに聞く」と同じ(askAiUrl)。
2663
- //
2664
- // 🔴 **線は実線・静止。** 点線+流れ(.cm-link.cm-ok の animation)は「いまデータが
2665
- // 通っている経路」の合図として上の6本で使っている。ここは経路ではなく
2666
- // 「このリポジトリを Claude Code が読む」という関係なので、同じ記号を使うと嘘になる。
2667
- //
2668
- // 🔴 **クラス名に `cm-link` を使わない。** 図の線を数えるテスト(connection-map の
2669
- // linkStates・new-project-onboarding)が6本を前提にしており、派生名でも当たる。
2670
- //
2671
- // 🔴 **`data-ai-prompt` を付ける。** 接続状況が届いたときの貼り替え(syncAiLinks)の
2672
- // 対象に入る=登録した開発リポジトリが当日から載る。ヘッダーと同じ先を保つ唯一の道。
2673
- const OPEN_Y = 336;
2674
- const OPEN_H = 46;
2675
- const openBox = `<path class="cm-open-line" d="M ${REPO_X} ${REPO_Y + REPO_H} L ${REPO_X} ${OPEN_Y}"></path>` +
2676
- `<a class="cm-open" href="${escapeHtml(askAiUrl(site))}" data-ai-prompt="${escapeHtml(ASK_PROMPT)}"` +
2677
- ` target="_blank" rel="noopener">` +
2678
- `<rect x="${REPO_LEFT}" y="${OPEN_Y}" width="${REPO_W}" height="${OPEN_H}" rx="12"></rect>` +
2679
- `<text class="cm-open-label" x="${REPO_X}" y="${OPEN_Y + 29}" text-anchor="middle">Claude Code で開く</text>` +
2680
- `</a>`;
2681
- // 🔴 **箱と線は cm-repo より前に連結する。** connection-map.test.mjs の repoNode() は
2682
- // 「cm-repo から文字列の末尾まで」を切って「図が外部から画像を読んでいないか」を見ており、
2683
- // 後ろに置くと href の https://claude.ai がその検査に当たる(描画順は重ならないので自由)。
2684
- //
2685
- // 注釈は **SVG の外の HTML 1行**(#465)。SVG の <text> は折り返せず、図は 760px まで
2686
- // 縮むので、中に入れると読めない大きさになる。**判定はしないので常に出す**——
2687
- // 「追加済みか」は API で確かめられない(組織オーナー権限か App 自身の資格が要る)。
2688
- return (`<svg class="cm-svg" viewBox="0 0 ${W} 402" xmlns="http://www.w3.org/2000/svg"` +
2689
- // 🔴 **role="img" にしない。** 中に本物のリンク(cm-open)が入ったので、
2690
- // 1枚の画像として名乗ると「キーボードでは押せるのに読み上げは何も言わない」になる
2649
+ // 🔴 **図はリポジトリの箱で終わる。** 高さは箱の底(292)+余白ぶんだけ取る
2650
+ // ——余らせると、図の下に空白の帯が残る。
2651
+ return (`<svg class="cm-svg" viewBox="0 0 ${W} 312" xmlns="http://www.w3.org/2000/svg"` +
2652
+ // 🔴 **role="img" に戻さない。** 6つの能力のノードは role="link" tabindex="0" を
2653
+ // 名乗っていて、押すと下の詳細カードへ飛ぶ。1枚の画像として名乗ると子孫が
2654
+ // アクセシビリティツリーから落ち、**キーボードでは押せるのに読み上げは何も言わない**
2691
2655
  ` role="group" aria-label="データソースとの接続マップ">` +
2692
2656
  links.join("") +
2693
2657
  nodes.join("") +
2694
- openBox +
2695
2658
  repo +
2696
- `</svg>` +
2697
- `<p class="conn-map-note">${escapeHtml(CONN_MAP_NOTE)}</p>`);
2659
+ `</svg>`);
2698
2660
  }
2699
2661
  /**
2700
2662
  * 「はじめに」セクション(Homeタブ下部)のチュートリアルデータをビルド時に生成する。
@@ -3635,22 +3597,6 @@ a.ds-name:hover { text-decoration: underline; }
3635
3597
  .cm-repo-label { font-size: 14px; font-weight: 700; fill: #1e3a8a; }
3636
3598
  /* GitHubロゴは fill="currentColor" なので、色は color で渡す(ラベルと同色に揃える) */
3637
3599
  .cm-repo-logo { color: #1e3a8a; }
3638
- /* ---- 図の下の「Claude Code で開く」(#465)----
3639
- リポジトリの箱と同じ幅・同じ中心で、実線1本でつなぐ。**流れ(animation)は付けない**
3640
- ——動く点線は「いまデータが通っている」の合図で、ここは経路ではなく関係だから。 */
3641
- /* a:hover の下線(HTML のリンクの規則)は SVG の中では二重の強調になるので外す
3642
- ——押せることは箱の塗り替えで見せている */
3643
- .cm-open, .cm-open:hover { cursor: pointer; text-decoration: none; }
3644
- .cm-open rect { fill: var(--surface); stroke: var(--accent); stroke-width: 1.5; }
3645
- .cm-open:hover rect { fill: var(--accent-weak); }
3646
- /* 🔴 **outline: none を書かない。** ここは本物のリンクで、キーボードだけで使う人が
3647
- 「いまどこにいるか」を失う。枠を太らせる強調は、その上に重ねる */
3648
- .cm-open:focus rect, .cm-open:focus-visible rect { fill: var(--accent-weak); stroke-width: 2.5; }
3649
- .cm-open-label { font-size: 14px; font-weight: 700; fill: var(--accent); }
3650
- .cm-open-line { fill: none; stroke: var(--accent); stroke-width: 1.6; }
3651
- /* 注釈は図の外(HTML)。**横スクロールしても居残らせる**(.conn-map は overflow-x: auto で、
3652
- 図は min-width 760px。左端に貼っておかないと、右へスクロールした人の視界から消える) */
3653
- .conn-map-note { position: sticky; left: 0; color: var(--muted); font-size: 12.5px; line-height: 1.7; margin: 2px 0 0; }
3654
3600
  /* 未使用(非活性)行: アダプターとして存在するが、この案件では設定されていないもの */
3655
3601
  .ds-card.ds-inactive, .ds-pipe.ds-inactive { background: #f8f9fa; border-style: dashed; box-shadow: none; }
3656
3602
  .ds-inactive .ds-icon { filter: grayscale(1); opacity: .55; }
@@ -4832,11 +4778,10 @@ ${calendarAddUrl.toString()}
4832
4778
  // 届いたときに走るので、**画面が畳まれた後に届く**ことがある(テストの window.close()・
4833
4779
  // 実機のタブを閉じた直後)。掴んだノード越しなら、その後でも例外を投げずに済む
4834
4780
  // ——投げると応答の後段(取り直しの停止など)が丸ごと落ちる
4835
- // 🔴 **setAttribute で貼る(プロパティ代入にしない)。** 接続マップの中の
4836
- // 「Claude Code で開く」(#465)は SVG の a で、SVG の href は読み取り専用
4837
- // SVGAnimatedString)——代入は例外も出さずに黙って無視され、**その箱だけが
4838
- // ビルド時の値のまま**(登録した開発リポジトリが載らない)になる。
4839
- // HTML の a では setAttribute と .href = は同じ結果になる。
4781
+ // 🔴 **setAttribute で貼る(プロパティ代入にしない)。** HTML の a では
4782
+ // 「.href = で代入」と同値なので、いまの画面ではどちらでも同じ結果になる。SVG の a では
4783
+ // href が読み取り専用(SVGAnimatedString)で、**代入は例外も出さずに黙って無視される**
4784
+ // ——図の中にリンクを置いても壊れない側に倒してある。
4840
4785
  function syncAiLinks() {
4841
4786
  var as = app.ownerDocument.querySelectorAll("a[data-ai-prompt]");
4842
4787
  for (var i = 0; i < as.length; i++) as[i].setAttribute("href", codeUrl(as[i].getAttribute("data-ai-prompt")));
@@ -12518,8 +12463,9 @@ ${calendarAddUrl.toString()}
12518
12463
 
12519
12464
  function renderOps() {
12520
12465
  renderConnMap();
12521
- // 追加申請の枠(#94)はここに出していたが、撤去した(#465)。
12522
- // 一手は図の下の「Claude Code で開く」と、その直下の注釈 1 行(CONN_MAP_NOTE)に集約。
12466
+ // 追加申請の枠(#94)はここに出していたが、#465 で撤去した。その代わりに図の下へ
12467
+ // 置いた箱と注釈も、#477 で撤去した。**この一手の案内は立ち上げ完了画面
12468
+ // (ポータル)が持つ**——操作タブは繋がっているものを見せる場所に戻す。
12523
12469
  // 🔴 **先読みが飛行中なら、いま作った図を確認中へ倒す(#264)。**
12524
12470
  // 先読み(起動時の loadLiveFleet)は操作タブを開く前に走るので、
12525
12471
  // 確認中へ倒す口(loadLiveFleet の connMapConfirmingShown の1回)は
@@ -13078,11 +13024,11 @@ ${calendarAddUrl.toString()}
13078
13024
  if (target && target.scrollIntoView) target.scrollIntoView({ behavior: "smooth", block: "center" });
13079
13025
  }
13080
13026
  wrap.addEventListener("click", jumpToNode);
13081
- // 🔴 **キーボードでも押せるようにする(#465 の実装レビュー)。** 6つのノードは
13082
- // 前から role="link" tabindex="0" を名乗っているのに、押す手はクリックだけだった。
13083
- // 図の role img から group に変えた(中に本物のリンクが入ったため)ので、
13084
- // **この瞬間からノードが支援技術に「リンク」として読み上げられる**——名乗っている
13085
- // 以上、Enter / Space で同じ場所へ飛べないと「押せないリンク」を配ることになる。
13027
+ // 🔴 **キーボードでも押せるようにする(#465 の実装レビュー・#477 で維持)。**
13028
+ // 6つのノードは role="link" tabindex="0" を名乗っており、図の role が group なので
13029
+ // **支援技術に「リンク」として読み上げられる**——名乗っている以上、Enter / Space
13030
+ // 同じ場所へ飛べないと「押せないリンク」を配ることになる。図を role="img" へ戻すと
13031
+ // その6つが読み上げから消えて、ここも無意味になるので、両方まとめて残してある。
13086
13032
  wrap.addEventListener("keydown", function (ev) {
13087
13033
  if (ev.key !== "Enter" && ev.key !== " " && ev.key !== "Spacebar") return;
13088
13034
  var g = ev.target && ev.target.closest ? ev.target.closest("[data-target]") : null;
@@ -13092,17 +13038,6 @@ ${calendarAddUrl.toString()}
13092
13038
  jumpToNode(ev);
13093
13039
  });
13094
13040
  app.appendChild(wrap);
13095
- // 🔴 **横にはみ出す図は、中央(リポジトリと「Claude Code で開く」の列)を出しておく。**
13096
- // 図は最小 760px で、狭い画面では左端=いちばん左の能力の箱が出る。押す箱は中央に
13097
- // あるので、そのままだと**スクロールしないと見えない**。溢れていないときは 0 のまま
13098
- if (wrap.scrollWidth > wrap.clientWidth) {
13099
- wrap.scrollLeft = (wrap.scrollWidth - wrap.clientWidth) / 2;
13100
- }
13101
- // 🔴 **図の中の「Claude Code で開く」(#465)を、いまの値で貼り直す。**
13102
- // 図はビルド時に焼いてあるので、**起動時の貼り替え(syncAiLinks)はこの箱が
13103
- // まだ文書に無いときに終わっている**——ここで呼ばないと、仮置きのリポジトリを
13104
- // 持つ人や応答が届かない案件で、**この箱だけがヘッダーと違う先**を開く
13105
- syncAiLinks();
13106
13041
  updateConnMapAsOf();
13107
13042
  applyStateToConnMap();
13108
13043
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.43",
3
+ "version": "0.12.44",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,