@takagaki/cortex-decisions-viewer 0.12.43 → 0.12.45
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 +22 -51
- package/dist/render.js +32 -97
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -978,48 +978,19 @@ async function walkMd(dirAbs) {
|
|
|
978
978
|
* - minute:{定例名}:{YYYYMMDD} → 議事録ファイルのGitHub blobリンク
|
|
979
979
|
*/
|
|
980
980
|
/**
|
|
981
|
-
*
|
|
982
|
-
* の `findDirByMarker` と同じ考え方)。
|
|
981
|
+
* 能力ディレクトリの名前(#479)。**固定値。探索しない。**
|
|
983
982
|
*
|
|
984
|
-
*
|
|
985
|
-
*
|
|
986
|
-
*
|
|
983
|
+
* かつては「案件によって置き場が違うかもしれない」前提で、マーカーファイル
|
|
984
|
+
* (`ingest-config.json` など)の在り処からディレクトリ名を求める探索を持っていた。旧構成の案件は
|
|
985
|
+
* 2026-09-07 に全部標準構成へ移り、艦隊 35 リポすべてがこの配置になったので、その分岐は撤去した。
|
|
986
|
+
*
|
|
987
|
+
* **無い案件では探索版も既定名(=この値)に落ちていた**ので、ここを固定にしても
|
|
988
|
+
* 「置き場が見つからないときの挙動」は変わらない——その先の `walkMd` / `fs.readdir` が
|
|
989
|
+
* 実在しないディレクトリを catch して空を返す(空扱い・警告なし)。
|
|
987
990
|
*/
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
if (!d.isDirectory() || d.name === "node_modules" || d.name.startsWith("."))
|
|
992
|
-
continue;
|
|
993
|
-
try {
|
|
994
|
-
await node_fs_1.promises.stat(path.join(repoRoot, d.name, marker));
|
|
995
|
-
return d.name;
|
|
996
|
-
}
|
|
997
|
-
catch {
|
|
998
|
-
// 直下に無ければ1階層下も見る(backlog-settings.json は issues/ の下に置かれる)
|
|
999
|
-
}
|
|
1000
|
-
try {
|
|
1001
|
-
for (const sub of await node_fs_1.promises.readdir(path.join(repoRoot, d.name), { withFileTypes: true })) {
|
|
1002
|
-
if (!sub.isDirectory())
|
|
1003
|
-
continue;
|
|
1004
|
-
try {
|
|
1005
|
-
await node_fs_1.promises.stat(path.join(repoRoot, d.name, sub.name, marker));
|
|
1006
|
-
return d.name;
|
|
1007
|
-
}
|
|
1008
|
-
catch {
|
|
1009
|
-
// 次へ
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
catch {
|
|
1014
|
-
// 読めないディレクトリは飛ばす
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
catch {
|
|
1019
|
-
// repoRoot が読めなければ既定名で進む
|
|
1020
|
-
}
|
|
1021
|
-
return fallback;
|
|
1022
|
-
}
|
|
991
|
+
const MEETING_DIR = "会議";
|
|
992
|
+
const DESIGN_DIR = "デザイン";
|
|
993
|
+
const MATERIALS_DIR = "共有資料";
|
|
1023
994
|
/** 会議の回を入れるディレクトリの名前(`会議/<会議名>/20260120/`) */
|
|
1024
995
|
const MEETING_DATE_DIR = /^\d{8}$/;
|
|
1025
996
|
/**
|
|
@@ -1041,8 +1012,7 @@ const MEETING_DATE_DIR = /^\d{8}$/;
|
|
|
1041
1012
|
* 同じ日に文字起こしを足しても議事録は作り直されないので、送る前に画面で伝えるために使う。
|
|
1042
1013
|
*/
|
|
1043
1014
|
async function collectMeetings(repoRoot) {
|
|
1044
|
-
const
|
|
1045
|
-
const rootAbs = path.join(repoRoot, meetingDir);
|
|
1015
|
+
const rootAbs = path.join(repoRoot, MEETING_DIR);
|
|
1046
1016
|
const out = [];
|
|
1047
1017
|
const hasMinute = async (dirAbs) => {
|
|
1048
1018
|
try {
|
|
@@ -1098,12 +1068,13 @@ const BACKLOG_SECTIONS = ["issues", "documents", "wiki"];
|
|
|
1098
1068
|
/**
|
|
1099
1069
|
* 課題管理の能力ディレクトリ(`<ここ>/issues` に課題ミラーが入る)を探す。
|
|
1100
1070
|
*
|
|
1101
|
-
*
|
|
1102
|
-
*
|
|
1103
|
-
*
|
|
1104
|
-
*
|
|
1105
|
-
*
|
|
1071
|
+
* 🔴 **他の能力(会議・デザイン・共有資料)のように固定値にできない(#479 の対象外)。**
|
|
1072
|
+
* `backlog-settings.json` は能力ディレクトリの直下ではなく**区画の中**
|
|
1073
|
+
* (`<課題管理>/issues/` 等)にあり、しかも接続先が複数になるとさらに1階層落ちる
|
|
1074
|
+
* (`<課題管理>/<キー>/{issues,…}/`・#127)。`課題管理` 決め打ちだと、入れ子形の案件では
|
|
1075
|
+
* `課題管理/issues` という実在しないパスを見に行き、**課題キー→Backlog URL の表が空になる**
|
|
1106
1076
|
* (グラフの課題ノードが全部リポ内パス止まりになり、Backlog へ飛べない)。
|
|
1077
|
+
* 標準構成への移行(#479)で揃ったのは**能力ディレクトリの名前**であって、区画の入れ子ではない。
|
|
1107
1078
|
*
|
|
1108
1079
|
* 規則の出どころは cortex-engine の `plugin/scripts/issues-config.mjs`(`findBacklogDir`)。
|
|
1109
1080
|
* **あちらを変えたらここも変えること**(`viewer/test/backlog-nested-layout.test.mjs` が見張る)。
|
|
@@ -1152,9 +1123,9 @@ async function findBacklogDir(repoRoot, fallback) {
|
|
|
1152
1123
|
async function buildTargetUrlMap(repoRoot, repoBaseUrl, branch) {
|
|
1153
1124
|
const map = new Map();
|
|
1154
1125
|
const issuesDir = await findBacklogDir(repoRoot, "課題管理");
|
|
1155
|
-
const designDir =
|
|
1156
|
-
const meetingDir =
|
|
1157
|
-
const materialsDir =
|
|
1126
|
+
const designDir = DESIGN_DIR;
|
|
1127
|
+
const meetingDir = MEETING_DIR;
|
|
1128
|
+
const materialsDir = MATERIALS_DIR;
|
|
1158
1129
|
// 課題キー → Backlog URL({課題管理}/issues/ の同期mdの基本情報から抽出)
|
|
1159
1130
|
for (const file of await walkMd(path.join(repoRoot, issuesDir, "issues"))) {
|
|
1160
1131
|
try {
|
|
@@ -1221,7 +1192,7 @@ async function buildTargetUrlMap(repoRoot, repoBaseUrl, branch) {
|
|
|
1221
1192
|
// minute:{定例名}:{YYYYMMDD} → 議事録ファイルのGitHubリンク
|
|
1222
1193
|
// パス規約: {会議}/{フェーズ}/{定例名}/{YYYYMMDD}/*minutes*.md
|
|
1223
1194
|
//
|
|
1224
|
-
// **以前は存在しない `ミーティング/` を見ていた**(艦隊は全案件
|
|
1195
|
+
// **以前は存在しない `ミーティング/` を見ていた**(艦隊は全案件 `会議/`)。
|
|
1225
1196
|
// そのため minute: の解決は一度も効いていなかった。
|
|
1226
1197
|
if (repoBaseUrl) {
|
|
1227
1198
|
for (const file of await walkMd(path.join(repoRoot, meetingDir))) {
|
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
|
|
71
|
-
//
|
|
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
|
-
*
|
|
388
|
-
*
|
|
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
|
-
*
|
|
398
|
-
*
|
|
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
|
-
* 🔴
|
|
413
|
-
*
|
|
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
|
|
2494
|
-
*
|
|
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
|
-
//
|
|
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
|
-
//
|
|
2661
|
-
//
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
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
|
-
//
|
|
4837
|
-
//
|
|
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
|
|
12522
|
-
//
|
|
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
|
|
13082
|
-
//
|
|
13083
|
-
//
|
|
13084
|
-
//
|
|
13085
|
-
//
|
|
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