@takagaki/cortex-decisions-viewer 0.4.65 → 0.4.67
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 +18 -1
- package/dist/render.js +89 -17
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -168,6 +168,22 @@ async function readFleetSources(repoRoot) {
|
|
|
168
168
|
}))
|
|
169
169
|
.filter((c) => c.id !== "")
|
|
170
170
|
: undefined;
|
|
171
|
+
// 組織ごとの GitHub 接続状況。**「N件が読めていません」だけでは次の一歩が決まらない**
|
|
172
|
+
// ——トークンは組織ごとにしか効かないので、どの組織かが要る
|
|
173
|
+
const githubOwners = Array.isArray(obj.githubOwners)
|
|
174
|
+
? obj.githubOwners
|
|
175
|
+
.filter((o) => o != null && typeof o === "object")
|
|
176
|
+
.map((o) => ({
|
|
177
|
+
owner: String(o.owner ?? ""),
|
|
178
|
+
repos: typeof o.repos === "number" ? o.repos : 0,
|
|
179
|
+
unreadable: typeof o.unreadable === "number" ? o.unreadable : 0,
|
|
180
|
+
// **写し忘れるとライブ経路とだけ食い違う。** op=state は素通しなので、
|
|
181
|
+
// 設定を変えた直後だけ数字が出て、静的ビルドのページでは undefined になる
|
|
182
|
+
unchecked: typeof o.unchecked === "number" ? o.unchecked : 0,
|
|
183
|
+
source: String(o.source ?? ""),
|
|
184
|
+
}))
|
|
185
|
+
.filter((o) => o.owner !== "")
|
|
186
|
+
: undefined;
|
|
171
187
|
const internalSources = Array.isArray(obj.internalSources)
|
|
172
188
|
? obj.internalSources
|
|
173
189
|
.filter((s) => s != null && typeof s === "object")
|
|
@@ -248,7 +264,7 @@ async function readFleetSources(repoRoot) {
|
|
|
248
264
|
const secretSources = obj.secretSources && typeof obj.secretSources === "object"
|
|
249
265
|
? obj.secretSources
|
|
250
266
|
: undefined;
|
|
251
|
-
return { externalSources, internalSources, pipelines, tools, fleetGeneratedAt, secretSources, checks };
|
|
267
|
+
return { externalSources, internalSources, pipelines, tools, fleetGeneratedAt, secretSources, checks, githubOwners };
|
|
252
268
|
}
|
|
253
269
|
/** パスがディレクトリとして存在するか */
|
|
254
270
|
async function isDirectory(dirAbs) {
|
|
@@ -1125,6 +1141,7 @@ async function build(opts) {
|
|
|
1125
1141
|
pipelines: fleet.pipelines,
|
|
1126
1142
|
tools: fleet.tools,
|
|
1127
1143
|
checks: fleet.checks,
|
|
1144
|
+
githubOwners: fleet.githubOwners,
|
|
1128
1145
|
};
|
|
1129
1146
|
// サムネイル(デザイン画面等)をサイトに同梱し、ノードのパスをサイト内相対に書き換える
|
|
1130
1147
|
await node_fs_1.promises.mkdir(outAbs, { recursive: true });
|
package/dist/render.js
CHANGED
|
@@ -33,9 +33,6 @@ function renderSite(site) {
|
|
|
33
33
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
34
34
|
<meta name="robots" content="noindex, nofollow" />
|
|
35
35
|
<title>${safeTitle}</title>
|
|
36
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
37
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
38
|
-
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
|
39
36
|
<style>${CSS}</style>
|
|
40
37
|
</head>
|
|
41
38
|
<body>
|
|
@@ -545,7 +542,13 @@ body {
|
|
|
545
542
|
background: linear-gradient(135deg, #ffffff 0%, #f4f8fe 45%, #dceafd 100%);
|
|
546
543
|
background-attachment: fixed;
|
|
547
544
|
color: var(--text);
|
|
548
|
-
|
|
545
|
+
/* 閲覧者の端末にあるフォントだけを使う。外部URLを参照しないのは ADAPTER_ICONS と同じ理由——
|
|
546
|
+
この画面は顧客が見るので、参照すると顧客のブラウザが Google のサーバへ接続しに行く。
|
|
547
|
+
Webフォントの埋め込みは選ばなかった: 日本語フォントは unicode-range で496分割して配信されており、
|
|
548
|
+
しかもこの画面は顧客のデータ(チャンネル名・人名・用語)を出すので、
|
|
549
|
+
ビルド時に必要な文字を確定できない。サブセットすると想定外の漢字が化ける。 */
|
|
550
|
+
font-family: system-ui, -apple-system, "Hiragino Kaku Gothic ProN", "Hiragino Sans",
|
|
551
|
+
"Yu Gothic UI", "Yu Gothic", Meiryo, sans-serif;
|
|
549
552
|
line-height: 1.7;
|
|
550
553
|
font-size: 15px;
|
|
551
554
|
}
|
|
@@ -1018,6 +1021,13 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
1018
1021
|
.ds-gate-warn { color: #b45309; }
|
|
1019
1022
|
.ds-gate-muted { color: #6b7280; }
|
|
1020
1023
|
.ds-pipes { display: flex; flex-direction: column; gap: 8px; }
|
|
1024
|
+
/* 組織ごとの接続状況。トークンは組織ごとにしか効かないので、ここが判断の単位になる */
|
|
1025
|
+
.ds-owners { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
|
|
1026
|
+
.ds-owner { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 8px 12px;
|
|
1027
|
+
border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
|
|
1028
|
+
.ds-owner-name { font-weight: 700; font-size: 13px; }
|
|
1029
|
+
.ds-owner-state { font-size: 12.5px; }
|
|
1030
|
+
.ds-owner-install { font-size: 12.5px; margin-left: auto; white-space: nowrap; }
|
|
1021
1031
|
/* 実行状況の行に直し方を添える。同じ run の未達を別の節にも出すと画面に2回並ぶ */
|
|
1022
1032
|
.ds-pipe-wrap { display: flex; flex-direction: column; gap: 3px; }
|
|
1023
1033
|
.ds-pipe-todo { font-size: 12.5px; color: var(--muted); line-height: 1.7; padding-left: 4px; }
|
|
@@ -1998,6 +2008,58 @@ ${capabilityState.toString()}
|
|
|
1998
2008
|
// 畳まれる(既定は閉)。中に入れると**新規案件(0件)=一番追加したい場面**で消える。
|
|
1999
2009
|
var adders = renderExternalAdders();
|
|
2000
2010
|
pushCap("チャット", adders.querySelector('[data-adder="slack"]'));
|
|
2011
|
+
// **組織ごとの接続状況を、開発の一番上に置く。** トークンは組織ごとにしか
|
|
2012
|
+
// 効かない(Fine-grained PAT も GitHub App のインストールトークンも1組織分)ので、
|
|
2013
|
+
// 「N件が読めていません」だけでは何をすればよいか決まらない。
|
|
2014
|
+
// どの組織が繋がっていないかと、そこへの導線を出す
|
|
2015
|
+
var owners = fleetVal("githubOwners") || [];
|
|
2016
|
+
if (owners.length) {
|
|
2017
|
+
var obox = el("div", { class: "ds-owners" });
|
|
2018
|
+
obox.appendChild(el("div", { class: "ds-sub", text: "組織ごとの接続状況" }));
|
|
2019
|
+
owners.forEach(function (o) {
|
|
2020
|
+
var ok = o.source === "app" || o.source === "token";
|
|
2021
|
+
// **確かめられなかった夜は、そう言う。** gh の不在・タイムアウト・ネットワーク断で
|
|
2022
|
+
// 起きる。「接続OK」と出すと、同じ画面の集計行が「⚠️ 2件に問題」と言っている
|
|
2023
|
+
// 横で食い違う。「未接続」と出すと、繋がっている組織に設定を促す偽の警告になる。
|
|
2024
|
+
// どちらも嘘なので、確かめていないことをそのまま出す
|
|
2025
|
+
var unsure = o.source === "unknown";
|
|
2026
|
+
var row = el("div", { class: "ds-owner" }, [
|
|
2027
|
+
el("span", { class: "ds-owner-name", text: o.owner }),
|
|
2028
|
+
el("span", { class: "ds-owner-state ds-gate-" + (ok ? "ok" : "warn"),
|
|
2029
|
+
// **読める件数を出す。** 総数だけ出すと、同じ画面の
|
|
2030
|
+
// 「⚠️ 15件が読めていません」と食い違う(#101 で3度直した形)
|
|
2031
|
+
// **確かめられなかった件数を出す。** 未接続側は「18リポジトリ中 15件が
|
|
2032
|
+
// 読めていません」と出しているのに、こちらだけ総数だと同じ節の中で
|
|
2033
|
+
// 表現が揃わない。4リポ中1つだけ揺れた夜に「4リポジトリを確かめられて
|
|
2034
|
+
// いません」と読めるのも実態と違う
|
|
2035
|
+
text: unsure
|
|
2036
|
+
? "⚠️ 確認できませんでした " + o.repos + "リポジトリ中 " +
|
|
2037
|
+
(o.unchecked || o.repos) + "件の接続を確かめられていません"
|
|
2038
|
+
: ok
|
|
2039
|
+
? "● 接続OK " + o.repos + "リポジトリ" + (o.source === "app" ? "(GitHub App)" : "")
|
|
2040
|
+
: "⚠️ 未接続 " + o.repos + "リポジトリ中 " + o.unreadable + "件が読めていません" }),
|
|
2041
|
+
]);
|
|
2042
|
+
// **未接続のときだけ導線を出す。** 繋がっている組織に「インストール」を
|
|
2043
|
+
// 出すと、押す必要が無いものを押させることになる。
|
|
2044
|
+
// 確かめられなかっただけの組織にも出さない——すでに入っているかもしれないので
|
|
2045
|
+
if (!ok && !unsure) {
|
|
2046
|
+
row.appendChild(el("a", {
|
|
2047
|
+
class: "ds-owner-install",
|
|
2048
|
+
// **文書化されている形だけを使う。** target_id に組織のログイン名を渡す形は
|
|
2049
|
+
// GitHub の文書に無く(GitHub自身のUIは数値のアカウントIDを入れる)、
|
|
2050
|
+
// 未ログインだとログイン画面へ転送されて 200 が返るので、
|
|
2051
|
+
// 効いているかを外から確かめられない。**確かめられないものを顧客に押させない。**
|
|
2052
|
+
// どの組織かはこの行に出ているので、選ばせる形で足りる
|
|
2053
|
+
href: "https://github.com/apps/classmethod-cortex-app/installations/new",
|
|
2054
|
+
target: "_blank", rel: "noopener",
|
|
2055
|
+
text: "この組織にインストール →",
|
|
2056
|
+
}));
|
|
2057
|
+
}
|
|
2058
|
+
obox.appendChild(row);
|
|
2059
|
+
});
|
|
2060
|
+
pushCap("開発", obox);
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2001
2063
|
pushCap("開発", adders.querySelector('[data-adder="github"]'));
|
|
2002
2064
|
|
|
2003
2065
|
// 連携の鍵は、その能力のところへ置く(画面下まで往復させない)
|
|
@@ -2396,18 +2458,24 @@ ${capabilityState.toString()}
|
|
|
2396
2458
|
// 宣言で隠すと、動いているのに説明が出ない状態になる。
|
|
2397
2459
|
if (s.kind === "会議" && s.ingestState === "on") {
|
|
2398
2460
|
box.appendChild(meetingHowTo());
|
|
2399
|
-
//
|
|
2400
|
-
//
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2461
|
+
// **別名の追加は、既に別名がある案件にだけ出す(#117)。**
|
|
2462
|
+
// 別名は括弧付きの合図運用へ移った際の経過措置で、既存案件のメンバーに定例の
|
|
2463
|
+
// 改名を強いないために置いたもの。新規案件は合図1つだけで運用する。
|
|
2464
|
+
// ここでフォームを出し続けると「新しい定例は名前を登録して足す」と読まれ、
|
|
2465
|
+
// 畳むはずの仕組みが案件をまたいで増えていく(Lambda 側でも同じ条件で断る)。
|
|
2466
|
+
if ((s.meetingAliases || []).length) {
|
|
2467
|
+
box.appendChild(addForm({
|
|
2468
|
+
title: "+ 会議名をそのまま取り込み対象にする",
|
|
2469
|
+
placeholder: "例: GDO様 定例",
|
|
2470
|
+
requiredNote: "会議名を入力してください。",
|
|
2471
|
+
// 先頭の1文が「これは増やすものではない」を伝える。使い方の説明はその後
|
|
2472
|
+
hint: "既存の定例を改名せずに拾うための経過措置の設定です。新しい会議は会議名に合図(【…】)を入れてください。ここに入れた名前と**完全に一致する**会議だけが取り込まれます(部分一致はしません)。カレンダーに出ている会議名だけを入れてください——日付や「- Gemini によるメモ」のような後ろに付く文字列を含めると、どの会議とも一致しません。Bot の招待は別途必要です。",
|
|
2473
|
+
confirmLines: function (v) {
|
|
2474
|
+
return ["この名前の会議を取り込み対象にします。", "", v, "", "追加しますか?"];
|
|
2475
|
+
},
|
|
2476
|
+
build: function (alias) { return { op: "add-meeting-alias", alias: alias }; },
|
|
2477
|
+
}));
|
|
2478
|
+
}
|
|
2411
2479
|
used = true;
|
|
2412
2480
|
} else if (s.kind === "会議" && usable("会議", "google-meet")) {
|
|
2413
2481
|
if (s.ingestState === "unset") {
|
|
@@ -2435,8 +2503,12 @@ ${capabilityState.toString()}
|
|
|
2435
2503
|
// backlog-settings.json が1つも無い(固定IP経由の同期で、UIからの投入は
|
|
2436
2504
|
// 鍵と同じく対応していない)。会議・共有資料は unset / broken を文言で
|
|
2437
2505
|
// 伝えてフォームを出さない形なので、課題管理だけ不揃いだった
|
|
2506
|
+
//
|
|
2507
|
+
// **接続先の正本は issues-config.json(#111)**だが、その置き場は
|
|
2508
|
+
// 同期ミラー(backlog-settings.json)の位置から決めている。ミラーが1つも
|
|
2509
|
+
// 無い案件では正本をどこへ置けばよいかも決められないので、条件は変わらない
|
|
2438
2510
|
if (!s.url) {
|
|
2439
|
-
box.appendChild(el("p", { class: "sec-how", text: "
|
|
2511
|
+
box.appendChild(el("p", { class: "sec-how", text: "この案件の課題管理の設定ファイル(同期ミラーの backlog-settings.json)がまだありません。接続先の正本(issues-config.json)の置き場もここから決められないため、先に初回の同期を実行するか、担当者にご連絡ください。" }));
|
|
2440
2512
|
used = true;
|
|
2441
2513
|
} else box.appendChild(addForm({
|
|
2442
2514
|
title: "接続先を変更",
|
package/package.json
CHANGED