@takagaki/cortex-decisions-viewer 0.12.14 → 0.12.16
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 +7 -274
- package/dist/meet-guide-images.js +29 -0
- package/dist/render.js +182 -131
- package/dist/repo.js +585 -0
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -26,6 +26,7 @@ exports.ingestedAtOf = ingestedAtOf;
|
|
|
26
26
|
exports.keyMissingText = keyMissingText;
|
|
27
27
|
exports.deriveCapTile = deriveCapTile;
|
|
28
28
|
exports.renderConnectionMap = renderConnectionMap;
|
|
29
|
+
const meet_guide_images_1 = require("./meet-guide-images");
|
|
29
30
|
/** SiteDataを単一の自己完結HTML(埋め込みデータ+CSS+JS)にレンダリングする */
|
|
30
31
|
function renderSite(site) {
|
|
31
32
|
// </script> によるブレイクアウトを防ぐため < をエスケープして埋め込む
|
|
@@ -2114,10 +2115,11 @@ a:hover { text-decoration: underline; }
|
|
|
2114
2115
|
padding-bottom: 6px; border-bottom: 1px solid var(--border);
|
|
2115
2116
|
}
|
|
2116
2117
|
.home-grounding > .home-grounding-title:first-child { margin-top: 0; }
|
|
2117
|
-
/* ---- レコード詳細の「AI
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2118
|
+
/* ---- レコード詳細の「AIによる最近の変更」(リポジトリの git 履歴 由来)----
|
|
2119
|
+
カードは詳細ページの提案(.proposals)と同系色にする——どちらも
|
|
2120
|
+
「AIがやったこと・言っていることを読む」もので種類が同じ。
|
|
2121
|
+
出どころは 0.12.15 で週次整理レポートから git 履歴に変えた(レポートは毎回全置換で、
|
|
2122
|
+
翌週の実行で前の履歴が消えたため) */
|
|
2121
2123
|
.ai-history { margin-top: 28px; padding-top: 16px; border-top: 1px solid var(--border); }
|
|
2122
2124
|
.ah-summary { cursor: pointer; font-size: 13.5px; font-weight: 700; color: var(--muted); }
|
|
2123
2125
|
.ah-item {
|
|
@@ -2128,12 +2130,14 @@ a:hover { text-decoration: underline; }
|
|
|
2128
2130
|
.ah-line { font-size: 13px; color: var(--muted); line-height: 1.8; word-break: break-word; }
|
|
2129
2131
|
.ah-meta { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-top: 10px; font-size: 13px; }
|
|
2130
2132
|
.ah-commit { font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
.ah-
|
|
2134
|
-
.ah-
|
|
2135
|
-
/*
|
|
2136
|
-
.ah-
|
|
2133
|
+
/* 変わった行のかたまり(消えた行/増えた行)。**ファイル全体の前後ではない**ので、
|
|
2134
|
+
ラベルを必ず添える(.ah-diff-label) */
|
|
2135
|
+
.ah-diff { margin-top: 10px; }
|
|
2136
|
+
.ah-diff-label { font-size: 12.5px; font-weight: 700; color: var(--muted); margin-bottom: 4px; }
|
|
2137
|
+
/* 何を見せていて何を見せられないのかの断り。節の末尾に置く */
|
|
2138
|
+
.ah-source { font-size: 12px; color: var(--muted); line-height: 1.7; margin: 12px 0 0; }
|
|
2139
|
+
/* 差分は数千字になりうる。折りたたみの中でも高さを縛って、開いたときにページ全体を押し流さない */
|
|
2140
|
+
.ah-diff-text {
|
|
2137
2141
|
margin: 8px 0 0; padding: 10px 12px; max-height: 320px; overflow: auto;
|
|
2138
2142
|
background: #fff; border: 1px solid var(--border); border-radius: 8px;
|
|
2139
2143
|
font-size: 12.5px; line-height: 1.7; white-space: pre-wrap; word-break: break-word;
|
|
@@ -2141,16 +2145,24 @@ a:hover { text-decoration: underline; }
|
|
|
2141
2145
|
/* ---- レコードの削除(?op=delete-record)----
|
|
2142
2146
|
置き場は2つ(2026-08-28 のオーナー裁定)。**未確認の記録は警告帯の中**で
|
|
2143
2147
|
「確認済みにする」と二択に、**警告帯が出ない記録は上の操作列の末尾**に置く。
|
|
2144
|
-
|
|
2145
|
-
|
|
2148
|
+
|
|
2149
|
+
**2026-08-29 のオーナーFBで、控えめな文字ボタンから同格のボタンへ変えた。**
|
|
2150
|
+
下線だけの文字は隣の「確認済みにする」より一段下に見え、二択のうち片方だけが
|
|
2151
|
+
本物のボタンに見えていた——選ばせたいのは対等な二択なので、寸法をそろえる。
|
|
2152
|
+
**配色は背景白・赤文字**(取り消せない操作であることは、塗りではなく赤で示す。
|
|
2153
|
+
帯と同じ濃さで塗ると「押してほしいほう」に見える)。
|
|
2154
|
+
なお、このビューアに**ダークテーマは無い**(:root の1組だけで prefers-color-scheme を
|
|
2155
|
+
使っていない)ので、暗色側の指定は置かない。押したあとの見た目は「取り消し線+無効化」 */
|
|
2146
2156
|
.record-delete-btn {
|
|
2147
|
-
|
|
2148
|
-
|
|
2157
|
+
flex: 0 0 auto; cursor: pointer; white-space: nowrap;
|
|
2158
|
+
padding: 8px 14px; border-radius: var(--radius);
|
|
2159
|
+
border: 1px solid #fca5a5; background: #fff; color: #b91c1c;
|
|
2160
|
+
font-size: 13.5px; font-weight: 600;
|
|
2149
2161
|
}
|
|
2150
|
-
/*
|
|
2151
|
-
.draft-note .record-delete-btn {
|
|
2152
|
-
.record-delete-btn:hover { color: #b91c1c; }
|
|
2153
|
-
.record-delete-btn:disabled { cursor: default;
|
|
2162
|
+
/* 警告帯の中では「確認済みにする」(.promote-btn)と寸法・丸みをそろえ、二択を同格に見せる */
|
|
2163
|
+
.draft-note .record-delete-btn { padding: 6px 14px; border-radius: 999px; font-size: 13px; }
|
|
2164
|
+
.record-delete-btn:hover { background: #fef2f2; border-color: #b91c1c; }
|
|
2165
|
+
.record-delete-btn:disabled { cursor: default; opacity: 0.6; }
|
|
2154
2166
|
.record-delete-msg { font-size: 13px; }
|
|
2155
2167
|
.record-delete-msg:empty { display: none; }
|
|
2156
2168
|
.record-delete-msg.is-error { color: #b91c1c; }
|
|
@@ -2690,6 +2702,22 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
2690
2702
|
/* 取り込みの条件は箇条書きで出す(ANDであることを読み飛ばせないように) */
|
|
2691
2703
|
.sec-how-list { margin: 4px 0; padding-left: 1.3em; }
|
|
2692
2704
|
.sec-how-list li { margin: 2px 0; }
|
|
2705
|
+
/* 会議の主催者向けの選択肢(Meet Recordings フォルダの共有・2026-08-29 オーナー承認)。
|
|
2706
|
+
**折りたたまない。** 週次整理の節が「誰も見ない」で撤去された経緯があるので、
|
|
2707
|
+
知ってほしい選択肢を <details> の中に隠さない。従来の bot 招待の説明の下に、
|
|
2708
|
+
枠で囲った別の話として置く(差し替えではなく追加であることを見た目でも示す) */
|
|
2709
|
+
.mt-share { border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; margin: 8px 0 0; background: #fff; }
|
|
2710
|
+
.mt-share-title { font-size: 12.5px; font-weight: 700; color: var(--text); margin-bottom: 4px; }
|
|
2711
|
+
/* 共有すると何が起きるかの1行。**説明文より強く出す**(.ds-scope-note と同じ理由) */
|
|
2712
|
+
.mt-share-note { color: var(--text); margin-top: 6px; }
|
|
2713
|
+
/* フォルダを探す手間をなくすリンク。検索URLなので**誰のドライブでも1本で効く**
|
|
2714
|
+
(フォルダIDは人ごとに違うので、固定URLは作れない) */
|
|
2715
|
+
.mt-share-open { display: inline-block; margin: 6px 0 2px; font-weight: 700; }
|
|
2716
|
+
/* 手順の番号つきリスト。**文章だけで完結させる**(画像はその補助) */
|
|
2717
|
+
.mt-share-steps { margin: 6px 0 0; padding-left: 1.3em; }
|
|
2718
|
+
.mt-share-steps li { margin: 4px 0; }
|
|
2719
|
+
/* 手順の画像。モーダルの中なので幅で潰れないようにし、枠で「画面の写し」だと分かるようにする */
|
|
2720
|
+
.mt-shot { display: block; max-width: 100%; height: auto; margin: 6px 0 0; border: 1px solid var(--border); border-radius: 6px; }
|
|
2693
2721
|
/* 0件を黙って見せない(追加フォームだけだと「未登録」か「読めていない」か区別できない) */
|
|
2694
2722
|
.ds-empty { color: var(--muted); font-size: 12.5px; margin: 4px 0 10px; }
|
|
2695
2723
|
.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); }
|
|
@@ -3031,6 +3059,20 @@ ${deriveCapTile.toString()}
|
|
|
3031
3059
|
* 議事録の取り込みでも同じアカウントを使っている。
|
|
3032
3060
|
*/
|
|
3033
3061
|
var DRIVE_INGEST_ACCOUNT = "cortex-notetaker@classmethod.jp";
|
|
3062
|
+
/**
|
|
3063
|
+
* 自分の「Meet Recordings」フォルダへの入口。
|
|
3064
|
+
*
|
|
3065
|
+
* **フォルダIDは人ごとに違うので、フォルダを直接指すURLは作れない。** 代わりに
|
|
3066
|
+
* ドライブの検索URLを使う——開いた人のドライブの中で検索が走るので、**1本で全員に効く**。
|
|
3067
|
+
* フォルダはマイドライブ直下にでき、日本語環境でも名前は英語のまま作られる。
|
|
3068
|
+
*
|
|
3069
|
+
* **共有ダイアログを直接開くURLは無い。** リンクの先で「右クリック → 共有」の1手が要ることは、
|
|
3070
|
+
* 押す前に画面へ書く(リンクだけ置くと、開いた先で止まる人が出る)。
|
|
3071
|
+
*/
|
|
3072
|
+
var MEET_FOLDER_SEARCH_URL = "https://drive.google.com/drive/search?q=type:folder%20Meet%20Recordings";
|
|
3073
|
+
// 手順の画像(data URI)。中身と埋め込み方の理由は src/meet-guide-images.ts に書いてある
|
|
3074
|
+
var MEET_SHOT_STEP1 = "${meet_guide_images_1.MEET_SHARE_STEP1}";
|
|
3075
|
+
var MEET_SHOT_STEP2 = "${meet_guide_images_1.MEET_SHARE_STEP2}";
|
|
3034
3076
|
|
|
3035
3077
|
function copyRow(text) {
|
|
3036
3078
|
// **input と button を使わない。** 追加フォームの中に置くので、input を足すと
|
|
@@ -4103,9 +4145,59 @@ ${deriveCapTile.toString()}
|
|
|
4103
4145
|
ul.appendChild(el("li", { text: "会議名に上の目印が入っている" }));
|
|
4104
4146
|
wrap.appendChild(ul);
|
|
4105
4147
|
wrap.appendChild(el("p", { text: "どちらか一方だけでは取り込まれません。" }));
|
|
4148
|
+
wrap.appendChild(meetingFolderShare());
|
|
4106
4149
|
return wrap;
|
|
4107
4150
|
}
|
|
4108
4151
|
|
|
4152
|
+
/**
|
|
4153
|
+
* 主催者向けの選択肢: 「Meet Recordings」フォルダを1回共有すると、以後は招待が要らない。
|
|
4154
|
+
*
|
|
4155
|
+
* **上の bot 招待の説明は残したまま足す(2026-08-29 オーナー承認)。** 招待方式は
|
|
4156
|
+
* 参加するだけの会議・他社主催の会議で今も唯一の手段なので、置き換えではない。
|
|
4157
|
+
*
|
|
4158
|
+
* **手順の細目は書かない。** 正本は apps-script/docs/meet-recordings-sharing.md で、
|
|
4159
|
+
* 「マイドライブの直下しか見ない」「メモを移すと対象外になる」等はそちらが持つ。
|
|
4160
|
+
* 画面が担うのは**選択肢があることと、共有すると何が起きるかの1行**まで
|
|
4161
|
+
*(同じ説明を2箇所で維持すると、必ず片方が古くなる)。
|
|
4162
|
+
*
|
|
4163
|
+
* 🔴 **注意の1行を落とさない。** フォルダごと共有するので、目印の無い会議
|
|
4164
|
+
*(1on1・面談)のメモも bot から**見える状態にはなる**。取り込まれないことと
|
|
4165
|
+
* 見えないことは別なので、両方を1行で正直に書く。
|
|
4166
|
+
*/
|
|
4167
|
+
// 注: ここは埋め込みJSのテンプレートリテラル内。コメントでもバッククォートを使わない
|
|
4168
|
+
function meetingFolderShare() {
|
|
4169
|
+
var box = el("div", { class: "mt-share" });
|
|
4170
|
+
box.appendChild(el("div", { class: "mt-share-title", text: "毎回の招待をやめる方法(会議の主催者向け・任意)" }));
|
|
4171
|
+
box.appendChild(el("p", { text: "自分の Google ドライブにある「Meet Recordings」フォルダを、下のアカウントに「閲覧者」で1回だけ共有すると、以後あなたが主催する会議は招待が要らなくなります。会議名の目印はこれまでどおり必要です。" }));
|
|
4172
|
+
box.appendChild(copyRow(DRIVE_INGEST_ACCOUNT));
|
|
4173
|
+
|
|
4174
|
+
// **フォルダを探すところから助ける。** フォルダIDは人ごとに違うので固定URLは作れないが、
|
|
4175
|
+
// 検索URLなら**1本で全員に効く**(開いた人のドライブの中で検索が走る)。
|
|
4176
|
+
// **共有ダイアログを直接開くURLは作れない**ので、リンクの先で1手かかることを
|
|
4177
|
+
// 押す前に書いておく(押した先で迷子にしない)
|
|
4178
|
+
box.appendChild(el("a", {
|
|
4179
|
+
class: "mt-share-open", href: MEET_FOLDER_SEARCH_URL, target: "_blank", rel: "noopener",
|
|
4180
|
+
text: "自分の「Meet Recordings」フォルダを開く →",
|
|
4181
|
+
}));
|
|
4182
|
+
var steps = el("ol", { class: "mt-share-steps" });
|
|
4183
|
+
steps.appendChild(el("li", { text: "上のリンクを開くと、自分のドライブの中から「Meet Recordings」フォルダが検索されます。" }));
|
|
4184
|
+
steps.appendChild(el("li", { text: "そのフォルダを右クリック(または右上の ⋮)して「共有」→「共有」を選びます。" }, [
|
|
4185
|
+
// **寸法を属性で書く。** 書かないと、モーダルを開いた瞬間に画像の高さのぶんだけ
|
|
4186
|
+
// 下の手順がずれる。loading=lazy は付けない——**data: URI には取得が無いので
|
|
4187
|
+
// 何もしない**のに、付いていると「遅延読み込みしている」という誤解が仕様として残る
|
|
4188
|
+
el("img", { class: "mt-shot", src: MEET_SHOT_STEP1, width: "664", height: "425",
|
|
4189
|
+
alt: "Googleドライブの検索結果。Meet Recordings フォルダのメニューで「共有」を選び、右に開いたサブメニューの「共有」を指している画面。" }),
|
|
4190
|
+
]));
|
|
4191
|
+
steps.appendChild(el("li", { text: "上のアカウントを貼り付け、権限を「閲覧者」にして「共有」を押します(通知のチェックは外して構いません)。" }, [
|
|
4192
|
+
el("img", { class: "mt-shot", src: MEET_SHOT_STEP2, width: "425", height: "220",
|
|
4193
|
+
alt: "「Meet Recordings」を共有するダイアログ。宛先に cortex-notetaker のアカウントが入り、権限が「閲覧者」に設定され、右下に「共有」ボタンがある画面。" }),
|
|
4194
|
+
]));
|
|
4195
|
+
box.appendChild(steps);
|
|
4196
|
+
|
|
4197
|
+
box.appendChild(el("p", { class: "mt-share-note", text: "共有すると、そのフォルダに入る会議メモは bot から見える状態になります(実際に取り込まれるのは、会議名に目印が入っている会議だけです)。" }));
|
|
4198
|
+
return box;
|
|
4199
|
+
}
|
|
4200
|
+
|
|
4109
4201
|
/**
|
|
4110
4202
|
* Slack の承認画面へ進むボタン(2026-08-20 に接続カードから切り出した)。
|
|
4111
4203
|
*
|
|
@@ -10341,49 +10433,47 @@ ${deriveCapTile.toString()}
|
|
|
10341
10433
|
}
|
|
10342
10434
|
|
|
10343
10435
|
/* ---------------------------------------------------------------------------
|
|
10344
|
-
* AI
|
|
10436
|
+
* AIによる最近の変更(リポジトリの git 履歴 由来)
|
|
10345
10437
|
* ---------------------------------------------------------------------------
|
|
10346
|
-
*
|
|
10438
|
+
* 夜間のパイプラインは、記録を勝手に起票し、draft の記録を勝手に書き換える。
|
|
10347
10439
|
* **黙って書き換えられた記録を作らないための面**がこれ——AIが何をしたかを、
|
|
10348
10440
|
* 変えられた記録自身のページに畳んで置く。
|
|
10349
10441
|
*
|
|
10350
|
-
*
|
|
10351
|
-
*
|
|
10352
|
-
*
|
|
10353
|
-
*
|
|
10442
|
+
* 🔴 **出どころを週次整理レポートから git 履歴に変えた(0.12.15)。**
|
|
10443
|
+
* レポート(.cortex/weekly-curation-report.json)は毎回全置換で、翌週の実行で
|
|
10444
|
+
* 差し替わると**前の履歴が画面から消えた**——オーナーが実際に踏んだ(前日に見た変更が
|
|
10445
|
+
* 翌日には無くなっていた)。1週間で消える履歴は、この節の目的を果たさない。
|
|
10446
|
+
* git のコミットは消えないので、ビルド時にそこから作る(repo.ts の collectAiChangeHistory)。
|
|
10354
10447
|
*
|
|
10355
|
-
*
|
|
10356
|
-
*
|
|
10448
|
+
* **取れないものは取れないと言う。** git には「なぜそう直したか」の根拠(引用)が
|
|
10449
|
+
* 残らないので、出せるのは**変わった行・コミットメッセージ・日時**まで。
|
|
10450
|
+
* 節の末尾でそれを1行断る(根拠があるように見せない)。
|
|
10451
|
+
*
|
|
10452
|
+
* **人のコミットは混ぜない。** 受け口の Lambda は人の操作の代理でコミットするので
|
|
10453
|
+
*(「Gold確認: …」「レコード削除: …」)、bot 名義だけで拾うと人の操作がAIの仕業として
|
|
10454
|
+
* 出る。切り分けは repo.ts の isAiCommit(ビルド時)。
|
|
10357
10455
|
*
|
|
10358
10456
|
* 🔴 **値はすべて textContent 経由で入れる**(el の text オプション)。
|
|
10359
|
-
*
|
|
10360
|
-
* innerHTML
|
|
10457
|
+
* 差分の中身・コミットメッセージは**リポジトリの生テキスト**で、記録の本文がそのまま
|
|
10458
|
+
* 入る。innerHTML に渡すと記録の中身が画面のコードになる。
|
|
10361
10459
|
*/
|
|
10362
10460
|
|
|
10363
|
-
/**
|
|
10364
|
-
function
|
|
10365
|
-
var
|
|
10366
|
-
if (!
|
|
10461
|
+
/** そのレコードに対するAIの変更(新しい順・ビルド側で最大5件に絞ってある) */
|
|
10462
|
+
function aiHistoryEntries(rec) {
|
|
10463
|
+
var map = SITE.aiHistory;
|
|
10464
|
+
if (!map) return [];
|
|
10367
10465
|
var p = repoPathOf(rec);
|
|
10368
10466
|
if (!p) return [];
|
|
10369
|
-
return
|
|
10370
|
-
// 統合は**勝者のページ**に出す(敗者はファイルごと消えていて、開く先が無い)。
|
|
10371
|
-
// 精製と未知の kind は path で照合する——読めない kind でも
|
|
10372
|
-
// 「この記録に何かをした」ことは出す(読めないまま消えるより、読めないまま出す)
|
|
10373
|
-
if (act.winner && act.loser) return !!act.winner.path && act.winner.path === p;
|
|
10374
|
-
return !!act.path && act.path === p;
|
|
10375
|
-
});
|
|
10467
|
+
return map[p] || [];
|
|
10376
10468
|
}
|
|
10377
10469
|
/**
|
|
10378
|
-
*
|
|
10379
|
-
*
|
|
10380
|
-
* Date に通さず ISO の字面(YYYY-MM-DD)から切り出す——閲覧者のタイムゾーンで
|
|
10381
|
-
* 日付がずれると、レポート自身が書いた実行日と食い違う(CI の UTC でも同じずれが出る)
|
|
10470
|
+
* 見出しに出す日付(YYYY/M/D)。**Date に通さない**——閲覧者のタイムゾーンで日付がずれると、
|
|
10471
|
+
* コミット自身が持っている日付と食い違う。読めない値は素のまま出す
|
|
10382
10472
|
*/
|
|
10383
|
-
function
|
|
10473
|
+
function ahDate(iso) {
|
|
10384
10474
|
var m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(String(iso));
|
|
10385
10475
|
if (!m) return String(iso);
|
|
10386
|
-
return parseInt(m[2], 10) + "/" + parseInt(m[3], 10);
|
|
10476
|
+
return m[1] + "/" + parseInt(m[2], 10) + "/" + parseInt(m[3], 10);
|
|
10387
10477
|
}
|
|
10388
10478
|
// コミットへのリンク。repoBaseUrl が無ければ短縮SHAだけ出す(どの変更かは残る)
|
|
10389
10479
|
function ahCommitEl(sha) {
|
|
@@ -10395,96 +10485,55 @@ ${deriveCapTile.toString()}
|
|
|
10395
10485
|
target: "_blank", rel: "noopener", text: "コミット " + short,
|
|
10396
10486
|
});
|
|
10397
10487
|
}
|
|
10398
|
-
|
|
10399
|
-
|
|
10400
|
-
|
|
10401
|
-
|
|
10402
|
-
|
|
10403
|
-
|
|
10404
|
-
|
|
10405
|
-
|
|
10406
|
-
|
|
10407
|
-
el("span", { class: "proposal-value", text: chg.before || "(未記入)" }),
|
|
10408
|
-
]),
|
|
10409
|
-
el("div", { class: "proposal-row proposal-row-new" }, [
|
|
10410
|
-
el("span", { class: "proposal-label", text: "変更後" }),
|
|
10411
|
-
el("span", { class: "proposal-value", text: chg.after || "(未記入)" }),
|
|
10412
|
-
]),
|
|
10413
|
-
]),
|
|
10488
|
+
/**
|
|
10489
|
+
* 変わった行のかたまり。**「消えた行/増えた行」と書く。**
|
|
10490
|
+
* 出しているのは差分(-U0)であってファイル全体の前後ではないので、
|
|
10491
|
+
* 「変更前」だけだと**記録の全文が載っていると誤読される**
|
|
10492
|
+
*/
|
|
10493
|
+
function ahDiffEl(label, text) {
|
|
10494
|
+
return el("div", { class: "ah-diff" }, [
|
|
10495
|
+
el("div", { class: "ah-diff-label", text: label }),
|
|
10496
|
+
el("pre", { class: "ah-diff-text", text: text }),
|
|
10414
10497
|
]);
|
|
10415
10498
|
}
|
|
10416
|
-
function ahEvidenceEl(list) {
|
|
10417
|
-
var ul = el("ul", { class: "proposal-evidence" });
|
|
10418
|
-
list.forEach(function (evi) {
|
|
10419
|
-
// 引用が無くても出典は出す(公開範囲フィルタで引用だけ落ちることがある)
|
|
10420
|
-
var li = el("li", {}, [el("span", { class: "proposal-source", text: evi.source })]);
|
|
10421
|
-
if (evi.quote) li.appendChild(el("blockquote", { class: "proposal-quote", text: evi.quote }));
|
|
10422
|
-
ul.appendChild(li);
|
|
10423
|
-
});
|
|
10424
|
-
return ul;
|
|
10425
|
-
}
|
|
10426
|
-
// 汎用行(未知の kind)。**捨てずに「名前: 値」で並べる**——engine が先に kind を
|
|
10427
|
-
// 増やしても「何かがあったこと」は画面に残る
|
|
10428
|
-
function ahGenericRow(row) {
|
|
10429
|
-
var box = el("div", { class: "ah-item" }, [el("div", { class: "ah-item-head", text: row.kind })]);
|
|
10430
|
-
var pairs = [["対象", row.title], ["種別", row.type], ["理由", row.reason],
|
|
10431
|
-
["なぜ", row.why], ["状態", row.status],
|
|
10432
|
-
["一致度", row.score != null ? String(row.score) : ""]];
|
|
10433
|
-
pairs.forEach(function (kv) {
|
|
10434
|
-
if (!kv[1]) return;
|
|
10435
|
-
box.appendChild(el("div", { class: "ah-line", text: kv[0] + ": " + kv[1] }));
|
|
10436
|
-
});
|
|
10437
|
-
var commit = ahCommitEl(row.commit);
|
|
10438
|
-
if (commit) box.appendChild(el("div", { class: "ah-meta" }, [commit]));
|
|
10439
|
-
return box;
|
|
10440
|
-
}
|
|
10441
10499
|
/** AIがこの記録にしたこと1件 */
|
|
10442
|
-
function
|
|
10443
|
-
|
|
10444
|
-
|
|
10445
|
-
|
|
10446
|
-
|
|
10447
|
-
|
|
10448
|
-
|
|
10449
|
-
|
|
10450
|
-
if (
|
|
10451
|
-
|
|
10452
|
-
|
|
10453
|
-
|
|
10454
|
-
|
|
10455
|
-
|
|
10456
|
-
box.appendChild(el("
|
|
10457
|
-
el("summary", { class: "ah-body-summary", text: "取り込んで削除した記録の全文" }),
|
|
10458
|
-
el("pre", { class: "ah-body-text", text: act.loser.body }),
|
|
10459
|
-
]));
|
|
10500
|
+
function ahEntryEl(e) {
|
|
10501
|
+
var what = e.kind === "add" ? "AIがこの記録を作成しました" : "AIがこの記録を書き換えました";
|
|
10502
|
+
var box = el("div", { class: "ah-item" }, [
|
|
10503
|
+
el("div", { class: "ah-item-head", text: ahDate(e.at) + " " + what }),
|
|
10504
|
+
]);
|
|
10505
|
+
if (e.subject) box.appendChild(el("div", { class: "ah-line", text: e.subject }));
|
|
10506
|
+
if (e.kind !== "add") {
|
|
10507
|
+
if (e.before) box.appendChild(ahDiffEl("変更前(消えた行)", e.before));
|
|
10508
|
+
if (e.after) box.appendChild(ahDiffEl("変更後(増えた行)", e.after));
|
|
10509
|
+
// **空欄で済ませない。** ビルドは「中身が変わっていないと言い切れる変更」
|
|
10510
|
+
//(権限だけの変更・純粋な移動)はエントリにしないので、ここへ来るのは
|
|
10511
|
+
// **中身は変わったのに差分を出せなかった**もの(記録を binary 扱いにしている案件・
|
|
10512
|
+
// 履歴の窓の外)だけ。落とすと本物の変更が黙って消えるので、断りを出して残す
|
|
10513
|
+
if (!e.before && !e.after) {
|
|
10514
|
+
box.appendChild(el("div", { class: "ah-line", text: "変わった行をここに出せませんでした。コミットを開くと中身を確認できます。" }));
|
|
10460
10515
|
}
|
|
10461
|
-
|
|
10462
|
-
|
|
10463
|
-
if (act.changes && act.changes.length) {
|
|
10464
|
-
var refined = el("div", { class: "ah-item" }, [
|
|
10465
|
-
el("div", { class: "ah-item-head", text: "AIがこの記録を精製しました" }),
|
|
10466
|
-
]);
|
|
10467
|
-
act.changes.forEach(function (chg) { refined.appendChild(ahChangeEl(chg)); });
|
|
10468
|
-
if (act.evidence && act.evidence.length) {
|
|
10469
|
-
refined.appendChild(el("div", { class: "section-label", text: "根拠" }));
|
|
10470
|
-
refined.appendChild(ahEvidenceEl(act.evidence));
|
|
10516
|
+
if (e.truncated) {
|
|
10517
|
+
box.appendChild(el("div", { class: "ah-line", text: "※ 長いので途中までを出しています。全部はコミットで見られます。" }));
|
|
10471
10518
|
}
|
|
10472
|
-
var refineCommit = ahCommitEl(act.commit);
|
|
10473
|
-
if (refineCommit) refined.appendChild(el("div", { class: "ah-meta" }, [refineCommit]));
|
|
10474
|
-
return refined;
|
|
10475
10519
|
}
|
|
10476
|
-
|
|
10520
|
+
var commit = ahCommitEl(e.commit);
|
|
10521
|
+
if (commit) box.appendChild(el("div", { class: "ah-meta" }, [commit]));
|
|
10522
|
+
return box;
|
|
10477
10523
|
}
|
|
10478
10524
|
/** 「AIによる最近の変更」の折りたたみ。該当が0件なら null(節ごと出さない) */
|
|
10479
10525
|
function buildAiHistory(rec) {
|
|
10480
|
-
var
|
|
10481
|
-
if (!
|
|
10482
|
-
var wc = SITE.weeklyCuration;
|
|
10483
|
-
var when = wc.ranAt ? aiHistoryWhen(wc.ranAt) + " の週次整理" : "週次整理";
|
|
10526
|
+
var list = aiHistoryEntries(rec);
|
|
10527
|
+
if (!list.length) return null;
|
|
10484
10528
|
var det = el("details", { class: "ai-history" }, [
|
|
10485
|
-
el("summary", { class: "ah-summary", text: "AIによる最近の変更(" +
|
|
10529
|
+
el("summary", { class: "ah-summary", text: "AIによる最近の変更(" + list.length + "件)" }),
|
|
10486
10530
|
]);
|
|
10487
|
-
|
|
10531
|
+
list.forEach(function (e) { det.appendChild(ahEntryEl(e)); });
|
|
10532
|
+
// 🔴 何を見せていて、何を見せられないのかを最後に断る
|
|
10533
|
+
det.appendChild(el("p", {
|
|
10534
|
+
class: "ah-source",
|
|
10535
|
+
text: "この一覧はリポジトリの変更履歴(コミット)から作っています。AIがなぜそう直したかの根拠は履歴に残らないため、変わった行とコミットだけを出しています。ファイルの移動やデータ構造の入れ替えなど、記録の中身が変わっていない変更は出していません。件数が多いときは新しいほうから5件までです。",
|
|
10536
|
+
}));
|
|
10488
10537
|
return det;
|
|
10489
10538
|
}
|
|
10490
10539
|
|
|
@@ -10632,9 +10681,10 @@ ${deriveCapTile.toString()}
|
|
|
10632
10681
|
if (humanConfirmedStatus(rec)) return null;
|
|
10633
10682
|
var path = deletableRecordPath(rec);
|
|
10634
10683
|
if (!path) return null;
|
|
10635
|
-
//
|
|
10636
|
-
//
|
|
10637
|
-
|
|
10684
|
+
// **語尾の「…」は 2026-08-29 のオーナーFBで外した。** 二択の相方(「確認済みにする」)と
|
|
10685
|
+
// 語の形が揃わず、片方だけが下書きのように見えていた。押した先に確認モーダルが必ず出ることは
|
|
10686
|
+
// 語尾ではなく操作そのもの(confirmDanger を await する下の行)で担保している
|
|
10687
|
+
var btn = el("button", { class: "record-delete-btn", type: "button", text: "削除する" });
|
|
10638
10688
|
var msg = el("div", { class: "record-delete-msg" });
|
|
10639
10689
|
btn.addEventListener("click", async function () {
|
|
10640
10690
|
// **確認を await する。** 落とすと Promise が truthy で確認なしに消える
|
|
@@ -10857,16 +10907,17 @@ ${deriveCapTile.toString()}
|
|
|
10857
10907
|
// ---------- グラフ(force-directed / canvas) ----------
|
|
10858
10908
|
// Gold層(Cortexのレコード)だけ色付け。それ以外(課題・議事録・資料・外部リンク)は一律グレー
|
|
10859
10909
|
/* 濃紺の背景に小さな点で出るので、Gold 4区画+Home は明るい色で互いに離す
|
|
10860
|
-
*
|
|
10861
|
-
* 2026-08-
|
|
10910
|
+
* (決定事項=青・用語集=緑・メンバー=ピンク・ルール=黄・Home=オレンジ。
|
|
10911
|
+
* レポートは黄が近いのでシアンへ)。**Home とルールは 2026-08-29 のオーナーFBで
|
|
10912
|
+
* 入れ替えた**——案件の顔である Home のほうが強い色(オレンジ)を持つ。
|
|
10862
10913
|
* 凡例の表記は日本語に統一する(区画名は画面のタブ名と同じ言葉を使う) */
|
|
10863
10914
|
var GROUP_STYLE = {
|
|
10864
10915
|
decision: { color: "#60a5fa", label: "決定事項" },
|
|
10865
10916
|
term: { color: "#4ade80", label: "用語集" },
|
|
10866
10917
|
member: { color: "#f472b6", label: "メンバー" },
|
|
10867
|
-
rule: { color: "#
|
|
10918
|
+
rule: { color: "#fde047", label: "ルール" },
|
|
10868
10919
|
report: { color: "#22d3ee", label: "レポート" },
|
|
10869
|
-
overview: { color: "#
|
|
10920
|
+
overview: { color: "#fb923c", label: "Home" },
|
|
10870
10921
|
record: { color: "#0e7490", label: "その他レコード" },
|
|
10871
10922
|
silver: { color: "#9ca3af", label: "コンテキスト(課題・議事録・資料・リンク等)" },
|
|
10872
10923
|
bronze: { color: "#9ca3af", label: "コンテキスト(課題・議事録・資料・リンク等)" },
|