@takagaki/cortex-decisions-viewer 0.10.2 → 0.10.4
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 +4 -0
- package/dist/render.js +64 -7
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -166,6 +166,10 @@ async function readFleetSources(repoRoot) {
|
|
|
166
166
|
goldState: s.goldState != null ? String(s.goldState) : undefined,
|
|
167
167
|
notify: typeof s.notify === "boolean" ? s.notify : undefined,
|
|
168
168
|
gate: s.gate != null ? String(s.gate) : undefined,
|
|
169
|
+
// gate が missing_scope のときに Slack が名指しした不足スコープ(段B)。
|
|
170
|
+
// **列挙し忘れると静かに消える**(この対応は素通しではなく明示の許可リスト)。
|
|
171
|
+
// 落とすと「権限が足りません」とだけ出て、何を頼めばよいか画面から分からない
|
|
172
|
+
needed: s.needed != null ? String(s.needed) : undefined,
|
|
169
173
|
// どこから来たか(derived / explicit / both)。**削除を出してよいかの判断に要る。**
|
|
170
174
|
// 自動導出されたものは登録ファイルから消しても翌日また現れるので、
|
|
171
175
|
// explicit のときだけ削除ボタンを出す。
|
package/dist/render.js
CHANGED
|
@@ -601,7 +601,20 @@ function sanitizeStateNow(v) {
|
|
|
601
601
|
/**
|
|
602
602
|
* ストアの「届くか」を行に重ねる。**まとめ表より新しいときだけ**——古い確認結果で
|
|
603
603
|
* 新しい実測を潰さない(時刻の比較は ISO 文字列の辞書順で足りる)。
|
|
604
|
-
*
|
|
604
|
+
*
|
|
605
|
+
* 対象はチャットと開発の行(段B。夜間チェックがこの2つを書く)。
|
|
606
|
+
*
|
|
607
|
+
* 🔴 **突き合わせの鍵は能力ごとに違う。**
|
|
608
|
+
* - chat … ワークスペース + チャンネルID。チャンネルIDはワークスペースの中でしか
|
|
609
|
+
* 一意でないので、IDだけで突き合わせると別ワークスペースの同IDを同じものと見る
|
|
610
|
+
* - dev … owner/repo の生文字列(devRowsToAdd と同じ)。**ワークスペースは持たない。**
|
|
611
|
+
* 同じリポジトリの github-issues と github-discussions は**同じ行**を指すので、
|
|
612
|
+
* 2つの行に同じ判定が載るのが正しい(書く側が SK で dedupe している)
|
|
613
|
+
*
|
|
614
|
+
* **needed(足りないスコープ)も載せる。** 載せないと、夜間が missing_scope を
|
|
615
|
+
* 書いた行だけスコープ名が消え、「権限が足りません」とだけ出て何を直せばよいか
|
|
616
|
+
* 分からない状態に戻る。上書きするときは空でも必ず載せる——夜間の古い needed が
|
|
617
|
+
* 新しい判定の横に残ると、直したはずのスコープ名がいつまでも出る
|
|
605
618
|
*/
|
|
606
619
|
function overlayStateOnFleet(view, rows, generatedAt) {
|
|
607
620
|
const v = view || {};
|
|
@@ -609,21 +622,33 @@ function overlayStateOnFleet(view, rows, generatedAt) {
|
|
|
609
622
|
return v;
|
|
610
623
|
const byKey = {};
|
|
611
624
|
for (const r of rows) {
|
|
612
|
-
if (r.
|
|
625
|
+
if (r.question !== "reachable")
|
|
613
626
|
continue;
|
|
614
|
-
|
|
627
|
+
if (r.cap === "chat")
|
|
628
|
+
byKey["chat\t" + String(r.workspace || "") + "\t" + String(r.ref)] = r;
|
|
629
|
+
else if (r.cap === "dev")
|
|
630
|
+
byKey["dev\t" + String(r.ref)] = r;
|
|
615
631
|
}
|
|
616
632
|
let changed = false;
|
|
617
633
|
const externals = v.externalSources.map((s) => {
|
|
618
|
-
if (!s ||
|
|
634
|
+
if (!s || !s.ref)
|
|
619
635
|
return s;
|
|
620
|
-
|
|
636
|
+
let hit = null;
|
|
637
|
+
if (s.type === "slack")
|
|
638
|
+
hit = byKey["chat\t" + String(s.workspace || "") + "\t" + String(s.ref)];
|
|
639
|
+
else if (String(s.type || "").indexOf("github") === 0)
|
|
640
|
+
hit = byKey["dev\t" + String(s.ref)];
|
|
621
641
|
if (!hit)
|
|
622
642
|
return s;
|
|
623
643
|
if (generatedAt && hit.at <= generatedAt)
|
|
624
644
|
return s;
|
|
625
645
|
changed = true;
|
|
626
|
-
return Object.assign({}, s, {
|
|
646
|
+
return Object.assign({}, s, {
|
|
647
|
+
gate: hit.status,
|
|
648
|
+
gateAt: hit.at,
|
|
649
|
+
gateBy: hit.by,
|
|
650
|
+
needed: hit.needed || "",
|
|
651
|
+
});
|
|
627
652
|
});
|
|
628
653
|
return changed ? Object.assign({}, v, { externalSources: externals }) : v;
|
|
629
654
|
}
|
|
@@ -2143,6 +2168,8 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
2143
2168
|
.rt-card { margin-top: 10px; }
|
|
2144
2169
|
.rt-steps { margin: 0; padding-left: 1.4em; color: var(--text); font-size: 13px; line-height: 1.9; }
|
|
2145
2170
|
.rt-steps li { margin: 2px 0; }
|
|
2171
|
+
/* 通知イベントのチェック名(10個)。1行に並べると読めないので、種別ごとに折る */
|
|
2172
|
+
.rt-steps li ul { margin: 2px 0 6px; padding-left: 1.1em; list-style: disc; color: var(--muted); line-height: 1.7; }
|
|
2146
2173
|
/* URLは長いので、入力欄を伸ばしてボタンを右に置く(折り返しても崩れないように wrap) */
|
|
2147
2174
|
.rt-url-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
2148
2175
|
.rt-copy { margin: 6px 0 10px; }
|
|
@@ -5486,6 +5513,12 @@ ${nextStateDelay.toString()}
|
|
|
5486
5513
|
// 古い「X分前に確認」を残さない(下に出るいまの結果と、時刻が2つ並ぶ)
|
|
5487
5514
|
var oldAt = card.querySelector(".ds-gate-at");
|
|
5488
5515
|
if (oldAt) oldAt.remove();
|
|
5516
|
+
// 🔴 **古いスコープ名の札も必ず消してから出し直す。** 行には夜間の判定に添えた
|
|
5517
|
+
// 札が出ていることがあり(段B)、置き換えた「接続OK」の横に古いスコープ名が
|
|
5518
|
+
// 残ると、同じ行が2つのことを言う——この節が何度も直してきた形そのもの。
|
|
5519
|
+
// 押し直すたびに札が増えていくのも、まとめてここで断つ
|
|
5520
|
+
var oldScopes = card.querySelectorAll(".ds-probe-scope");
|
|
5521
|
+
for (var oi = 0; oi < oldScopes.length; oi++) oldScopes[oi].remove();
|
|
5489
5522
|
// 不足スコープは**状態の語のすぐ横**に出す(「権限が足りません:groups:read」)。
|
|
5490
5523
|
// 本文へ落とすと、いちばん要る情報が説明文に埋もれる
|
|
5491
5524
|
if (j.gate === "missing_scope") {
|
|
@@ -6939,6 +6972,17 @@ ${nextStateDelay.toString()}
|
|
|
6939
6972
|
badges,
|
|
6940
6973
|
gateEl,
|
|
6941
6974
|
]);
|
|
6975
|
+
// 足りないスコープは**状態の語のすぐ横**に出す(「権限が足りません:groups:read」)。
|
|
6976
|
+
//
|
|
6977
|
+
// **押した瞬間の結果と同じ見た目にする**(probeSection が同じ class を付けている)。
|
|
6978
|
+
// 出どころは2つあるが、読む人にとっては同じ情報:
|
|
6979
|
+
// - 夜間チェックが書いた needed(fleet-status.json 経由)
|
|
6980
|
+
// - 状態ストアの行が上書きした needed(overlayStateOnFleet 経由)
|
|
6981
|
+
// ここが無いと「権限が足りません」とだけ出て、**どのスコープを頼めばよいか
|
|
6982
|
+
// 画面から分からない**——押して確かめた人にしか分からない状態に戻る
|
|
6983
|
+
if (s.gate === "missing_scope" && s.needed) {
|
|
6984
|
+
card.appendChild(el("code", { class: "ds-probe-scope", text: String(s.needed) }));
|
|
6985
|
+
}
|
|
6942
6986
|
if (gateAtEl) card.appendChild(gateAtEl);
|
|
6943
6987
|
// チャンネルの登録解除。書き込み経路(intake Lambda)がある案件でだけ出す。
|
|
6944
6988
|
// **Slack だけ。** github は登録ファイルが別(dev-sources.json)で、下のトグルと
|
|
@@ -7386,7 +7430,20 @@ ${nextStateDelay.toString()}
|
|
|
7386
7430
|
el("ol", { class: "rt-steps" }, [
|
|
7387
7431
|
el("li", { text: "Backlog のプロジェクト設定 → インテグレーション → Webhook を開く" }),
|
|
7388
7432
|
el("li", { text: "「WebHook URL」に下の案件専用URLを貼り付ける" }),
|
|
7389
|
-
|
|
7433
|
+
// **チェック名は受信側が処理する10種を全部並べる。** 「等」で省くと、担当者は
|
|
7434
|
+
// 課題の3つだけにチェックして「設定した」と思い、Wikiとドキュメントの更新は
|
|
7435
|
+
// 夜間まで届かない(画面は稼働中と出るので、欠けていることに気づけない)。
|
|
7436
|
+
// ここを増減するときは受信側(backlog-webhook/logic.mjs の HANDLED_TYPES)と
|
|
7437
|
+
// 揃える——ずれると realtime-sync-card.test.mjs が赤くなる。
|
|
7438
|
+
// **「他はチェック不要」とは言い切らない。** 未対応の type(ドキュメントの更新等)は
|
|
7439
|
+
// 「無視した」ログから見つける設計なので、外させると発見の経路が塞がる
|
|
7440
|
+
el("li", { text: "通知イベントで次の10個にチェックを入れて保存する(他のイベントはチェックしても取り込まれません)" }, [
|
|
7441
|
+
el("ul", {}, [
|
|
7442
|
+
el("li", { text: "課題:「課題の追加」「課題の更新」「課題にコメント」「課題の削除」「課題をまとめて更新」" }),
|
|
7443
|
+
el("li", { text: "Wiki:「Wikiページを追加」「Wikiページを更新」「Wikiページを削除」" }),
|
|
7444
|
+
el("li", { text: "ドキュメント:「ドキュメントの追加」「ドキュメントの削除」" }),
|
|
7445
|
+
]),
|
|
7446
|
+
]),
|
|
7390
7447
|
]),
|
|
7391
7448
|
el("div", { class: "rt-url-row" }, [field, copyBtn]),
|
|
7392
7449
|
msg,
|
package/package.json
CHANGED