@takagaki/cortex-decisions-viewer 0.12.21 → 0.12.22
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/render.js +204 -38
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -759,7 +759,7 @@ const STATE_STATUSES = {
|
|
|
759
759
|
reachable: ["ok", "not_in_channel", "missing_scope", "no_token", "unreachable", "unknown", "not_in_space", "no_credentials"],
|
|
760
760
|
ingested: ["ok", "failed", "skipped"],
|
|
761
761
|
};
|
|
762
|
-
const STATE_ROW_FIELDS = ["cap", "ref", "workspace", "question", "status", "at", "by", "needed", "lastOkAt", "lastFailAt"];
|
|
762
|
+
const STATE_ROW_FIELDS = ["cap", "ref", "workspace", "question", "status", "at", "by", "needed", "detail", "lastOkAt", "lastFailAt"];
|
|
763
763
|
/** stateNow はライブ専用キーで build.ts の網にかからない。画面側でも許可リストを通す */
|
|
764
764
|
function sanitizeStateNow(v) {
|
|
765
765
|
if (!Array.isArray(v))
|
|
@@ -820,6 +820,11 @@ function sanitizeStateNow(v) {
|
|
|
820
820
|
* 書いた行だけスコープ名が消え、「権限が足りません」とだけ出て何を直せばよいか
|
|
821
821
|
* 分からない状態に戻る。上書きするときは空でも必ず載せる——夜間の古い needed が
|
|
822
822
|
* 新しい判定の横に残ると、直したはずのスコープ名がいつまでも出る
|
|
823
|
+
*
|
|
824
|
+
* **detail(最後に測った理由)も載せる(#346)。** 夜間が書く理由文はここを通らないと
|
|
825
|
+
* 画面に届かない(fleet-status.json には焼き込まれないので、ライブが届かない案件では出ない
|
|
826
|
+
* ——それは意図。古いスナップショットの理由を出すより、出さないほうが嘘にならない)。
|
|
827
|
+
* needed と同じく、上書きするときは空でも必ず載せる
|
|
823
828
|
*/
|
|
824
829
|
function overlayStateOnFleet(view, rows) {
|
|
825
830
|
const v = view || {};
|
|
@@ -855,6 +860,7 @@ function overlayStateOnFleet(view, rows) {
|
|
|
855
860
|
gateAt: hit.at,
|
|
856
861
|
gateBy: hit.by,
|
|
857
862
|
needed: hit.needed || "",
|
|
863
|
+
detail: hit.detail || "",
|
|
858
864
|
});
|
|
859
865
|
});
|
|
860
866
|
return changed ? Object.assign({}, v, { externalSources: externals }) : v;
|
|
@@ -4472,6 +4478,99 @@ ${deriveCapTile.toString()}
|
|
|
4472
4478
|
cls: "ds-gate-muted",
|
|
4473
4479
|
},
|
|
4474
4480
|
};
|
|
4481
|
+
/**
|
|
4482
|
+
* 休止状態の行に、状態の語に添えて**押す前から**出す定型の補足(#346)。
|
|
4483
|
+
* 鍵は「アダプタ種別(helpTypeOf)× 状態」。値は文のパーツの配列で、文字列はテキスト、
|
|
4484
|
+
* { link: <リンクの文字列> } は GitHub App のインストール設定へのリンク(GITHUB_APP_INSTALL_URL)。
|
|
4485
|
+
*
|
|
4486
|
+
* ## なぜ画面の表で持つのか
|
|
4487
|
+
* サーバの needed / detail は「何が起きているか」と「どこを開くか」までを持つが、
|
|
4488
|
+
* **誰がその操作をできるか**(リポジトリの admin なら自分で・でなければ admin に依頼・
|
|
4489
|
+
* request は組織オーナーの承認待ち)は、夜間(engine)とボタン(Lambda)の2つの書き手が
|
|
4490
|
+
* 別々に文を作るので、サーバ側で足すと片方だけ古くなる。判定と URL はサーバ、定型の補足は
|
|
4491
|
+
* ここ、という役割分担にする。
|
|
4492
|
+
*
|
|
4493
|
+
* 🔴 **DS_GATE には入れない**(実測が返す語彙の表で、突き合わせテストの対象)。
|
|
4494
|
+
* DS_GATE_NO_TOKEN と同じく、仕組みはアダプタ非依存・データだけがアダプタ固有。
|
|
4495
|
+
*
|
|
4496
|
+
* 🔴 **DS_GATE[状態] が help を持つ状態にはエントリを置かない。** 置くと行の補足が2段になる
|
|
4497
|
+
* (github-state-reason.test.mjs の「行の補足は最大1段」が見張る)。
|
|
4498
|
+
*
|
|
4499
|
+
* 🔴 **URL を文字列で書き写さない**(帯・押した結果と同じ定数を使う。写経すると張り替えで
|
|
4500
|
+
* 片方だけ古くなる)。
|
|
4501
|
+
*
|
|
4502
|
+
* エントリがある状態では**この文だけ**を出し、サーバの needed / detail は出さない
|
|
4503
|
+
* ——理由文・補足・確認の一文の3段が issues / discussions の2行 × N リポに並ぶと、
|
|
4504
|
+
* 一覧が案内で埋まる(DS_GATE_NO_TOKEN.github の項と同じ判断)。needed は押した結果が持つ。
|
|
4505
|
+
*/
|
|
4506
|
+
var GITHUB_ADMIN_HELP = "このリポジトリの admin(管理者権限を持つ人)であれば、Configure から自分で追加できます(承認は不要です)。"
|
|
4507
|
+
+ "admin でない場合は、そのリポジトリの admin の人に「Cortex の GitHub App の対象にこのリポジトリを追加してください」と依頼してください。"
|
|
4508
|
+
+ "GitHub 側で request と表示された場合は、組織オーナーの承認待ちです。"
|
|
4509
|
+
+ "追加したあと「接続を確認」を押して、読めるようになったことを確かめてください。";
|
|
4510
|
+
var DS_GATE_RESTING_HELP = {
|
|
4511
|
+
github: {
|
|
4512
|
+
unreachable: [
|
|
4513
|
+
"App は導入済みですが、このリポジトリが読み取り対象に選ばれていない(または移動・改名・削除された)可能性があります。",
|
|
4514
|
+
{ link: "インストール設定を開く" },
|
|
4515
|
+
" の Configure から対象の組織を選び、Repository access に追加してください。",
|
|
4516
|
+
GITHUB_ADMIN_HELP,
|
|
4517
|
+
],
|
|
4518
|
+
},
|
|
4519
|
+
};
|
|
4520
|
+
/**
|
|
4521
|
+
* 表を引くときのアダプタ種別。**probeTypeOf を使わない**——あちらは「op=probe の受け口」の
|
|
4522
|
+
* 語彙で、Google Chat に空文字を返す(実測の口が無いため)。ここで使うと Google Chat の
|
|
4523
|
+
* エントリを永久に置けない
|
|
4524
|
+
*/
|
|
4525
|
+
function helpTypeOf(type) {
|
|
4526
|
+
var t = String(type || "");
|
|
4527
|
+
return t.indexOf("github") === 0 ? "github" : t;
|
|
4528
|
+
}
|
|
4529
|
+
/** 表のパーツ(無ければ null)。行と押した結果の**両方**がここを通す(写経しない) */
|
|
4530
|
+
function restingHelpPartsOf(type, gate) {
|
|
4531
|
+
var byType = DS_GATE_RESTING_HELP[helpTypeOf(type)];
|
|
4532
|
+
return (byType && byType[gate]) || null;
|
|
4533
|
+
}
|
|
4534
|
+
/** パーツを1段落にする。包む要素の class は置き場所で違う(行は ds-gate-help・押した結果は ds-probe-help) */
|
|
4535
|
+
function restingHelpNode(parts, cls) {
|
|
4536
|
+
var p = el("p", { class: cls });
|
|
4537
|
+
parts.forEach(function (part) {
|
|
4538
|
+
if (typeof part === "string") p.appendChild(document.createTextNode(part));
|
|
4539
|
+
else if (part && part.link) p.appendChild(el("a", { href: GITHUB_APP_INSTALL_URL, target: "_blank", rel: "noopener", text: part.link }));
|
|
4540
|
+
});
|
|
4541
|
+
return p;
|
|
4542
|
+
}
|
|
4543
|
+
/**
|
|
4544
|
+
* 休止状態の行に出す「最後に測った理由」(表にエントリが無い状態のフォールバック)。
|
|
4545
|
+
* needed(次の一手・URL 込み)を優先し、無ければ detail。
|
|
4546
|
+
*
|
|
4547
|
+
* 🔴 **書き手が button の detail は出さない。** ボタンは detail に判定の語そのもの
|
|
4548
|
+
* ("unreachable")や生のエラー("ratelimited")を書く——lastFailDetail を空で潰さない
|
|
4549
|
+
* ための痕跡で、表示用の値ではない(intake の op=probe のコメント)。人向けの文を持つのは
|
|
4550
|
+
* needed の側。夜間(gold)の detail は人向けの文なので出す
|
|
4551
|
+
*/
|
|
4552
|
+
function stateReasonOf(s) {
|
|
4553
|
+
if (s.needed) return String(s.needed);
|
|
4554
|
+
if (s.detail && s.gateBy !== "button") return String(s.detail);
|
|
4555
|
+
return "";
|
|
4556
|
+
}
|
|
4557
|
+
/**
|
|
4558
|
+
* この行に、押す前から理由・補足を出してよいか(#346)。**語の列挙で持たない**——
|
|
4559
|
+
* 別の作業が DS_GATE に語や help を足した日に、黙って漏れたり2段になったりしないよう
|
|
4560
|
+
* 導出で決める:
|
|
4561
|
+
* - 状態がある(未測定の行には出すものが無い)
|
|
4562
|
+
* - ok でない
|
|
4563
|
+
* - missing_scope でない(スコープ名の札 .ds-probe-scope が既に持つ)
|
|
4564
|
+
* - no_token でない(GitHub は組織の帯が導線を1つだけ持つ設計・Slack は DS_GATE_NO_TOKEN の help)
|
|
4565
|
+
* - not_in_channel でない(help は無いが、**状態の語そのものが操作の指示**
|
|
4566
|
+
* 「Slackで招待してください」。その下に夜間の「読めませんでした: not_in_channel」を
|
|
4567
|
+
* 並べても情報が増えず、招待という具体的な指示を薄める。help の有無とは別の軸)
|
|
4568
|
+
* - dsGateOf(s).help が無い(あれば DS_GATE の固定文が次の一手を持っている)
|
|
4569
|
+
*/
|
|
4570
|
+
function showsRestingReason(s) {
|
|
4571
|
+
if (!s.gate || s.gate === "ok" || s.gate === "missing_scope" || s.gate === "no_token" || s.gate === "not_in_channel") return false;
|
|
4572
|
+
return !dsGateOf(s).help;
|
|
4573
|
+
}
|
|
4475
4574
|
/**
|
|
4476
4575
|
* Slack のチャンネルが社内ワークスペースのものか。**workspace の有無だけで決まる**
|
|
4477
4576
|
* (省略=社内。#104 でこの値が画面まで届いていることは slack-workspace.test.mjs が見張る)。
|
|
@@ -5017,9 +5116,14 @@ ${deriveCapTile.toString()}
|
|
|
5017
5116
|
var owners = githubOwnersView();
|
|
5018
5117
|
var out = [];
|
|
5019
5118
|
groupGithubByOwner(items, owners).forEach(function (g) {
|
|
5020
|
-
// **行ごとに meta を引く。** issues と discussions
|
|
5119
|
+
// **行ごとに meta を引く。** issues と discussions でアイコンとラベルが違う。
|
|
5120
|
+
// Issues と Discussions は同じ接続先(同じ dev 行)なので、理由・補足は1本目だけが
|
|
5121
|
+
// 持つ(#346)。同じ長文が2行に並ぶと一覧が案内で埋まる
|
|
5122
|
+
var seenRef = {};
|
|
5021
5123
|
var cards = g.items.map(function (x) {
|
|
5022
|
-
|
|
5124
|
+
var again = !!(x.ref && seenRef[x.ref]);
|
|
5125
|
+
if (x.ref) seenRef[x.ref] = 1;
|
|
5126
|
+
return extSourceCard(x, DS_TYPE[x.type] || { icon: "🔗", label: x.type || "その他" }, { quietHelp: again });
|
|
5023
5127
|
});
|
|
5024
5128
|
if (g.state === "warn") {
|
|
5025
5129
|
out.push(orgNoteBox(githubNotConnectedNodes(g), cards));
|
|
@@ -5082,10 +5186,18 @@ ${deriveCapTile.toString()}
|
|
|
5082
5186
|
var repos = o.repos != null ? o.repos : g.repos != null ? g.repos : g.items.length;
|
|
5083
5187
|
var unread = o.unreadable != null ? o.unreadable : g.unread != null ? g.unread : g.items.length;
|
|
5084
5188
|
var installed = o.appInstalled;
|
|
5085
|
-
out.push(el("div", { class: "ds-orgnote-title", text: "⚠️ " + g.title + " はまだ接続されていません" }));
|
|
5086
5189
|
// **読める件数を出す。** 総数だけ出すと、同じ画面の集計と食い違う(#101 で3度直した形)
|
|
5087
5190
|
var head = repos + "リポジトリ中 " + unread + "件が読めていません。";
|
|
5191
|
+
// 🔴 **見出しは 「installed」 の分岐の中で出す(#346)。** ここで1つに畳んでいたので、
|
|
5192
|
+
// App 導入済みの組織にも「まだ接続されていません」と出て、**同じ帯の本文と矛盾**した
|
|
5193
|
+
// (実機でオーナーが踏み、利用者が「組織の接続からやり直し」と誤解した)
|
|
5088
5194
|
if (installed === true) {
|
|
5195
|
+
// **見出しでは「読み取り対象に選ばれていません」と言い切らない。** 下のコメントの
|
|
5196
|
+
// とおり②未選択と③移動・改名・削除は分かれないので、見出しは事実だけを言う
|
|
5197
|
+
out.push(el("div", {
|
|
5198
|
+
class: "ds-orgnote-title",
|
|
5199
|
+
text: "⚠️ " + g.title + " は App 導入済みですが、" + unread + "件のリポジトリを読み取れていません",
|
|
5200
|
+
}));
|
|
5089
5201
|
// App は入っている。**インストールをもう一度促さないこと**——済んでいる操作を促すのは
|
|
5090
5202
|
// 「設定する必要が無いものに設定を促す」偽の警告と同じで、しかも直らない
|
|
5091
5203
|
//
|
|
@@ -5094,15 +5206,19 @@ ${deriveCapTile.toString()}
|
|
|
5094
5206
|
// 「対象に選ばれていません」と言い切ると、③の人は一覧に無いリポジトリを
|
|
5095
5207
|
// 探し続けることになる(押しても直らない導線と同じ形)。逃げ道を1文で示す。
|
|
5096
5208
|
//
|
|
5097
|
-
//
|
|
5098
|
-
//
|
|
5099
|
-
//
|
|
5100
|
-
//
|
|
5209
|
+
// **設定画面の宛先は App 個別ページに統一した(#346)。** 以前の
|
|
5210
|
+
// 「/settings/installations」 は**押した本人が入れた App しか出ない**個人の一覧で、
|
|
5211
|
+
// App を入れたのが別のメンバーなら着いた先が空だった(そのための断り書きも要らなくなった)。
|
|
5212
|
+
// いまの宛先と、そこに着ける人の条件は 「appSettingsLink」 の項にある。
|
|
5213
|
+
//
|
|
5214
|
+
// **誰がその操作をできるかまで書く(2026-09-02 の実測)。** リポジトリの admin なら
|
|
5215
|
+
// Configure から自分で追加でき、admin でなければ GitHub が 「request」 を出して
|
|
5216
|
+
// 組織オーナーの承認待ちになる。片方に断定せず両方の道を並べる
|
|
5101
5217
|
out.push(el("p", {
|
|
5102
5218
|
class: "ds-group-note",
|
|
5103
|
-
text: head + "GitHub App
|
|
5104
|
-
+ "
|
|
5105
|
-
+
|
|
5219
|
+
text: head + "GitHub App はこの組織に入っていますが、これらのリポジトリが読み取りの対象に選ばれていない(または移動・改名・削除された)可能性があります。"
|
|
5220
|
+
+ "「インストール設定を開く」から " + g.title + " の Configure を開き、Repository access に対象のリポジトリを追加してください。"
|
|
5221
|
+
+ GITHUB_ADMIN_HELP
|
|
5106
5222
|
+ "リポジトリ自体が一覧に見当たらない場合は、移動・改名・削除されている可能性があるので、登録から外してください。"
|
|
5107
5223
|
+ "お客様の組織では、組織のオーナーに承認を依頼してください。",
|
|
5108
5224
|
}));
|
|
@@ -5110,6 +5226,7 @@ ${deriveCapTile.toString()}
|
|
|
5110
5226
|
return out;
|
|
5111
5227
|
}
|
|
5112
5228
|
if (installed === false) {
|
|
5229
|
+
out.push(el("div", { class: "ds-orgnote-title", text: "⚠️ " + g.title + " はまだ接続されていません" }));
|
|
5113
5230
|
out.push(el("p", {
|
|
5114
5231
|
class: "ds-group-note",
|
|
5115
5232
|
text: head + "この組織に Cortex の GitHub App を入れると読めるようになります(Issues の読み取りだけ)。"
|
|
@@ -5120,7 +5237,13 @@ ${deriveCapTile.toString()}
|
|
|
5120
5237
|
}
|
|
5121
5238
|
// 「null」(確かめられなかった)と、この値を知らない古い fleet-status.json。
|
|
5122
5239
|
// **導線を出さない。** どちらが原因か分からないので、押させると外れたほうを
|
|
5123
|
-
//
|
|
5240
|
+
// 押させることになる(済んでいるインストールをもう一度、あるいは効かない設定画面へ)。
|
|
5241
|
+
//
|
|
5242
|
+
// 見出しは件数を言わない(件数は本文だけが持つ・見出しと二重に言わない)。
|
|
5243
|
+
// 「githubUnsureNodes」 の「接続を確認できませんでした」(=その夜、確かめる処理自体が
|
|
5244
|
+
// 走らなかった)とは意味が違う——こちらは**読めなかった事実はあるが、App の導入状況が
|
|
5245
|
+
// 分からない**ので、語を分ける
|
|
5246
|
+
out.push(el("div", { class: "ds-orgnote-title", text: "⚠️ " + g.title + " のリポジトリが読めていません(原因は確かめられていません)" }));
|
|
5124
5247
|
out.push(el("p", {
|
|
5125
5248
|
class: "ds-group-note",
|
|
5126
5249
|
text: head + "原因(GitHub App が入っていない/入っているがこれらのリポジトリが選ばれていない)は、"
|
|
@@ -5360,29 +5483,37 @@ ${deriveCapTile.toString()}
|
|
|
5360
5483
|
/**
|
|
5361
5484
|
* すでに入っている App の**インストール設定**(対象リポジトリの追加)へ行くリンク。
|
|
5362
5485
|
*
|
|
5363
|
-
*
|
|
5364
|
-
*
|
|
5365
|
-
*
|
|
5366
|
-
*
|
|
5367
|
-
*
|
|
5368
|
-
*
|
|
5369
|
-
*
|
|
5370
|
-
*
|
|
5371
|
-
*
|
|
5372
|
-
*
|
|
5373
|
-
*
|
|
5374
|
-
*
|
|
5375
|
-
*
|
|
5376
|
-
*
|
|
5377
|
-
*
|
|
5378
|
-
*
|
|
5486
|
+
* **宛先は App 個別ページ(「GITHUB_APP_INSTALL_URL」 と同じ定数・#346)。**
|
|
5487
|
+
* 「infra/lambda/shared/github-gate.mjs」 の 「githubConfigureUrl」 とも同じ宛先なので、
|
|
5488
|
+
* **押す前(この帯・行の補足)と押した後(確認結果の文中)でリンク先が割れない**。
|
|
5489
|
+
* 関数は残してある——呼び手が「入れる」ではなく「設定を開く」意図で呼ぶ場所だから。
|
|
5490
|
+
*
|
|
5491
|
+
* ## なぜ他の2つの宛先を使わないか
|
|
5492
|
+
*
|
|
5493
|
+
* - 個人の一覧 「github.com/settings/installations」 は**「個人アカウントに入れた App」の
|
|
5494
|
+
* 画面**で、組織のインストールは別立て
|
|
5495
|
+
* (https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps )。
|
|
5496
|
+
* 押した本人が入れた App しか出ないので、**別の人が入れた組織では空**になる。
|
|
5497
|
+
* 0.12.21 まではこちらを指しており、着いた先が空の人が詰まった(#346)
|
|
5498
|
+
* - 組織の設定ページ 「github.com/organizations/<組織>/settings/installations」 は
|
|
5499
|
+
* **owner 以外 404**(2026-09-01 オーナーが踏んだ実害)。読み取り対象の組織の
|
|
5500
|
+
* オーナーが Cortex の利用者とは限らない(お客様の組織がまさにそれ)
|
|
5501
|
+
*
|
|
5502
|
+
* ⚠ **App 個別ページが「導入済みの組織で Configure に着く」ことは、GitHub の文書に
|
|
5503
|
+
* 記述が無い。根拠は 2026-09-02 のオーナーの実測**(cortex-test と GitHub の Configure
|
|
5504
|
+
* 画面で、admin のリポジトリは即追加・admin でないリポジトリには 「request」 タグ)。
|
|
5505
|
+
* 文書化されている一次ソースは次の2つで、**着いた先の画面そのものは書かれていない**:
|
|
5506
|
+
* - インストール URL と repository admin の設置条件
|
|
5507
|
+
* https://docs.github.com/en/apps/using-github-apps/installing-a-github-app-from-a-third-party
|
|
5508
|
+
* - 非オーナーの申請は組織オーナーへ通知される
|
|
5509
|
+
* https://docs.github.com/en/apps/using-github-apps/requesting-a-github-app-from-your-organization-owner
|
|
5510
|
+
* **GitHub 側の画面が変わったらここが最初に嘘になる。** 宛先を変えるときは
|
|
5511
|
+
* 「githubConfigureUrl」(サーバ)と揃えること。
|
|
5379
5512
|
*/
|
|
5380
|
-
var GITHUB_APP_SETTINGS_URL = "https://github.com/settings/installations";
|
|
5381
|
-
|
|
5382
5513
|
function appSettingsLink(label) {
|
|
5383
5514
|
return el("a", {
|
|
5384
5515
|
class: "ds-owner-install",
|
|
5385
|
-
href:
|
|
5516
|
+
href: GITHUB_APP_INSTALL_URL,
|
|
5386
5517
|
target: "_blank", rel: "noopener",
|
|
5387
5518
|
text: label || "インストール設定を開く →",
|
|
5388
5519
|
});
|
|
@@ -8216,9 +8347,13 @@ ${deriveCapTile.toString()}
|
|
|
8216
8347
|
* 「<a>」 の組み立てだけで作る(この画面の他の表示と同じ流儀)。
|
|
8217
8348
|
*
|
|
8218
8349
|
* **URL 以外は素のまま出す。** 言い換えると検索できないので、サーバの文言を削らない。
|
|
8350
|
+
*
|
|
8351
|
+
* **行に置くときは 「ds-gate-help」 を付ける**(第2引数)。「.ds-card」 は横並びの flex で、
|
|
8352
|
+
* 自分の行を占めるのは 「flex: 1 1 100%」 の 「.ds-gate-help」 だけ。押した結果で置き換える
|
|
8353
|
+
* とき 「probeSection」 が 「.ds-gate-help」 をまとめて隠すので、この class が要る。
|
|
8219
8354
|
*/
|
|
8220
|
-
function neededNode(text) {
|
|
8221
|
-
var p = el("p", { class: "ds-probe-help" });
|
|
8355
|
+
function neededNode(text, cls) {
|
|
8356
|
+
var p = el("p", { class: cls || "ds-probe-help" });
|
|
8222
8357
|
splitNeededParts(text).forEach(function (part) {
|
|
8223
8358
|
if (part.url) p.appendChild(el("a", { href: part.text, target: "_blank", rel: "noopener", text: part.text }));
|
|
8224
8359
|
else p.appendChild(document.createTextNode(part.text));
|
|
@@ -8233,10 +8368,20 @@ ${deriveCapTile.toString()}
|
|
|
8233
8368
|
* 「App が入っていない」と「App は入っているがこのリポジトリが選ばれていない」の
|
|
8234
8369
|
* 言い分けも、設定ページの URL もあちらが決める——**画面で分岐を書き足さない**
|
|
8235
8370
|
* (書いた瞬間に判定が2箇所になり、夜間の実測とボタンでずれる)。
|
|
8371
|
+
* **ただし admin の定型補足だけは画面の表(DS_GATE_RESTING_HELP)から引く**(#346)——
|
|
8372
|
+
* 「誰がその操作をできるか」はサーバの2つの書き手が別々に文を作るので、片方だけ古くなる。
|
|
8236
8373
|
*/
|
|
8237
8374
|
function githubProbeHelpNodes(r) {
|
|
8238
8375
|
if (r.gate === "ok") return [];
|
|
8239
|
-
if (r.needed)
|
|
8376
|
+
if (r.needed) {
|
|
8377
|
+
var nodes = [neededNode(r.needed)];
|
|
8378
|
+
// 定型の補足(admin なら自分で・でなければ admin に依頼)は**行と同じ表から引く**。
|
|
8379
|
+
// 言い分けと URL はサーバ(needed)、定型の補足だけ画面の表——ここに文を直書きすると
|
|
8380
|
+
// 休止状態の行と押した結果で言うことが割れる。理由と URL は needed が既に持っているので、
|
|
8381
|
+
// 表のパーツ全部ではなく admin の4文(GITHUB_ADMIN_HELP)だけを添える
|
|
8382
|
+
if (restingHelpPartsOf("github", r.gate)) nodes.push(restingHelpNode([GITHUB_ADMIN_HELP], "ds-probe-help"));
|
|
8383
|
+
return nodes;
|
|
8384
|
+
}
|
|
8240
8385
|
// needed が無いのは gate に落とし込めなかったとき。**生のエラーは隠さない**
|
|
8241
8386
|
return [el("p", { class: "ds-probe-help", text: "GitHub の応答:" + (r.error || "不明") + "。時間をおいて再度お試しください。" })];
|
|
8242
8387
|
}
|
|
@@ -8485,9 +8630,12 @@ ${deriveCapTile.toString()}
|
|
|
8485
8630
|
at.textContent = "いま測った結果(" + (dsFmtTime(j.checkedAt) || "たった今") + ")";
|
|
8486
8631
|
probeHelpNodes(s, j).forEach(function (n) { body.appendChild(n); });
|
|
8487
8632
|
// **夜間の判定に添えてあった案内は隠す。** 置き換えた判定と食い違う案内が
|
|
8488
|
-
// 下に残ると、同じ行に2
|
|
8489
|
-
|
|
8490
|
-
|
|
8633
|
+
// 下に残ると、同じ行に2つのことが書いてある状態になる。
|
|
8634
|
+
// **1つ目だけでなく全部隠す(#346)。** 理由文(.ds-gate-reason)・定型補足
|
|
8635
|
+
// (.ds-gate-resting)・DS_GATE の help のどれが付いていても、押した結果と
|
|
8636
|
+
// 食い違う案内を残さない
|
|
8637
|
+
var stale = card.querySelectorAll(".ds-gate-help");
|
|
8638
|
+
for (var si = 0; si < stale.length; si++) stale[si].hidden = true;
|
|
8491
8639
|
// 表示名を Slack の実名へ自動で揃える(差分表示も更新ボタンも出さない)。
|
|
8492
8640
|
// **GitHub は揃えない。** 行の名前は owner/repo そのもので、書き換える口
|
|
8493
8641
|
//(op=config の refresh-channel-name)は channels.json 専用
|
|
@@ -10278,7 +10426,11 @@ ${deriveCapTile.toString()}
|
|
|
10278
10426
|
}
|
|
10279
10427
|
|
|
10280
10428
|
|
|
10281
|
-
|
|
10429
|
+
/**
|
|
10430
|
+
* 接続先1件の行。「opts.quietHelp」 が真なら休止状態の補足(#346)を出さない
|
|
10431
|
+
* ——同じリポジトリの2本目の行(Discussions)用で、同じ長文が2行に並ぶのを避ける
|
|
10432
|
+
*/
|
|
10433
|
+
function extSourceCard(s, meta, opts) {
|
|
10282
10434
|
var badges = el("div", { class: "ds-badges" });
|
|
10283
10435
|
// **Gold 対象かのバッジは持たない。** 一覧に並ぶ Slack チャンネルは例外なく全て対象で、
|
|
10284
10436
|
// 行ごとに「対象です」と書いても情報が増えない。
|
|
@@ -10458,6 +10610,20 @@ ${deriveCapTile.toString()}
|
|
|
10458
10610
|
// **ボタンより後ろに置く。** カードは横並びの flex なので、間に挟むと
|
|
10459
10611
|
// 「登録を解除」が案内文の下の行へ落ちて、既存案件の行の形が変わる
|
|
10460
10612
|
if (gate.help) card.appendChild(el("p", { class: "ds-gate-help", text: gate.help }));
|
|
10613
|
+
// **最後に測った理由と直し方を、押す前から出す(#346)。** 「アクセス不可 8時間前に確認」
|
|
10614
|
+
// だけでは、押さない人(初見の PM 等)が止まる。表にエントリがある状態は定型の補足
|
|
10615
|
+
// (リンク込み)だけ、無い状態は needed → detail のフォールバック。どちらも ds-gate-help
|
|
10616
|
+
// を付ける——押した結果で置き換えるとき probeSection がまとめて隠す。
|
|
10617
|
+
// **同じリポジトリの2本目の行(Discussions)には出さない**(opts.quietHelp)。
|
|
10618
|
+
// 同じ長文が2行に並ぶと一覧が案内で埋まる。URL のリンク化は neededNode(innerHTML は使わない)
|
|
10619
|
+
if (!(opts && opts.quietHelp) && showsRestingReason(s)) {
|
|
10620
|
+
var restingParts = restingHelpPartsOf(s.type, s.gate);
|
|
10621
|
+
if (restingParts) card.appendChild(restingHelpNode(restingParts, "ds-gate-help ds-gate-resting"));
|
|
10622
|
+
else {
|
|
10623
|
+
var reason = stateReasonOf(s);
|
|
10624
|
+
if (reason) card.appendChild(neededNode(reason, "ds-gate-help ds-gate-reason"));
|
|
10625
|
+
}
|
|
10626
|
+
}
|
|
10461
10627
|
// 「接続を確認」(2026-08-19)。**押せる人を絞らない**——読むだけで設定を変えないので、
|
|
10462
10628
|
// 気づいた人がその場で確かめられるほうがよい(オーナー判断)。書き込みになる
|
|
10463
10629
|
// 「表示名を更新する」は、押した結果の中から別のボタンとして出る(probeSection)。
|
package/package.json
CHANGED