@takagaki/cortex-decisions-viewer 0.5.0 → 0.7.0

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 CHANGED
@@ -49,6 +49,20 @@ const repo_1 = require("./repo");
49
49
  // (引数で引き回すと呼び出し側の改修が広範囲になる)。build() の冒頭で1回だけ解決する。
50
50
  let LATEST_PATHS = new Set();
51
51
  const render_1 = require("./render");
52
+ /**
53
+ * この画面を作ったパッケージの版。**package.json を唯一の出どころにする。**
54
+ * 別に持つと、公開した版と画面に出る版がずれる(しかも気づけない)。
55
+ */
56
+ const PKG_VERSION = (() => {
57
+ try {
58
+ // dist/ から見て2つ上(パッケージのルート)
59
+ return require("../package.json").version;
60
+ }
61
+ catch {
62
+ // **落とさない。** 版が引けないだけでビルドを止めない
63
+ return "不明";
64
+ }
65
+ })();
52
66
  const DEFAULT_EXCLUDE = ["README.md", "template.md"];
53
67
  /** frontmatterのrelationsを安全に正規化する */
54
68
  function toRelations(value) {
@@ -112,6 +126,14 @@ function resolveKnowledgeRoot(decisionsDirAbs) {
112
126
  }
113
127
  return null;
114
128
  }
129
+ /**
130
+ * スペースごとの Backlog キーの登録状況で、画面へ運んでよい値。
131
+ *
132
+ * **Lambda 側(infra/lambda/intake/logic.mjs の FLEET_MAP_VALUE_ALLOW)と同じにすること。**
133
+ * 片方だけ増やすと、静的ビルドでは出ないものがライブ差し替えの瞬間だけ出る
134
+ * ——「朝は正しいのに、開いて数秒すると表示が変わる」という一番気づきにくい食い違いになる。
135
+ */
136
+ const SECRET_SPACE_STATES = ["new", "legacy", "false"];
115
137
  /**
116
138
  * リポジトリルートの fleet-status.json から externalSources / internalSources / pipelines を読む。
117
139
  * ファイルが無い・パース不能・当該フィールドが無い場合は undefined を返し、
@@ -209,6 +231,16 @@ async function readFleetSources(repoRoot) {
209
231
  // 設定を変えた直後だけ数字が出て、静的ビルドのページでは undefined になる
210
232
  unchecked: typeof o.unchecked === "number" ? o.unchecked : 0,
211
233
  source: String(o.source ?? ""),
234
+ // 🔴 **`Boolean(...)` にしないこと。** ここに来る値の元は engine 側の
235
+ // **インストールトークンそのもの**で、`Boolean("ghs_…")` は `true` になるので
236
+ // 型は守れても「素通ししていないこと」の保証にならない。**`=== true` の厳密比較**なら、
237
+ // 万一トークンが載ってきても `false` に落ちるだけで顧客の画面には出ない。
238
+ // 上の5フィールドも同じ理由で全部 `String(...)` / `typeof === "number"` で固定している。
239
+ //
240
+ // **`true` でないものを一律 `false` にしない。** `null`(その夜は確かめられなかった)を
241
+ // `false` に丸めると、App が入っている全組織に「入れてください」と誤案内する。
242
+ // 値が無い(この項目を知らない古い生成物)ときも `null` 側に倒す
243
+ appInstalled: o.appInstalled == null ? null : o.appInstalled === true,
212
244
  }))
213
245
  .filter((o) => o.owner !== "")
214
246
  : undefined;
@@ -351,7 +383,26 @@ async function readFleetSources(repoRoot) {
351
383
  const secretSources = obj.secretSources && typeof obj.secretSources === "object"
352
384
  ? obj.secretSources
353
385
  : undefined;
354
- return { externalSources, slackWorkspaces, internalSources, pipelines, capabilities, fleetGeneratedAt, secretSources, checks, githubOwners, backlogTarget };
386
+ // スペースごとの Backlog キーの登録状況(画面が接続先の行ごとに出す)。
387
+ //
388
+ // **値は列挙した3つだけを通す。** この値は顧客のブラウザまで届くので、engine が
389
+ // 語を増やしたときに知らない文字列をそのまま画面へ運ばない
390
+ // (Lambda 側の FLEET_MAP_VALUE_ALLOW と**同じ3つ**にそろえること。片方だけ増やすと、
391
+ // 静的では出ないものがライブ差し替えの瞬間だけ出る=一番気づきにくい食い違い)。
392
+ //
393
+ // **1つも残らなければキーごと落とす。** 空の器を通すと、画面が「確かめたうえで0件」と
394
+ // 読んで「未登録」と断定する。**知らないことは、キーが無いことで表す**
395
+ let secretSpaces;
396
+ if (obj.secretSpaces != null && typeof obj.secretSpaces === "object" && !Array.isArray(obj.secretSpaces)) {
397
+ const out = {};
398
+ for (const [space, v] of Object.entries(obj.secretSpaces)) {
399
+ if (typeof v === "string" && SECRET_SPACE_STATES.includes(v))
400
+ out[space] = v;
401
+ }
402
+ if (Object.keys(out).length)
403
+ secretSpaces = out;
404
+ }
405
+ return { externalSources, slackWorkspaces, internalSources, pipelines, capabilities, fleetGeneratedAt, secretSources, secretSpaces, checks, githubOwners, backlogTarget };
355
406
  }
356
407
  /** パスがディレクトリとして存在するか */
357
408
  async function isDirectory(dirAbs) {
@@ -1258,6 +1309,8 @@ async function build(opts) {
1258
1309
  const site = {
1259
1310
  title: opts.title,
1260
1311
  generatedAt: opts.generatedAt,
1312
+ // **package.json から読む。** 手で書くと、上げ忘れて嘘の版が出る
1313
+ viewerVersion: PKG_VERSION,
1261
1314
  repoBaseUrl: repo.baseUrl,
1262
1315
  branch: repo.branch,
1263
1316
  decisions,
@@ -1286,6 +1339,7 @@ async function build(opts) {
1286
1339
  slackWorkspaces: fleet.slackWorkspaces,
1287
1340
  fleetGeneratedAt: fleet.fleetGeneratedAt,
1288
1341
  secretSources: fleet.secretSources,
1342
+ secretSpaces: fleet.secretSpaces,
1289
1343
  internalSources: fleet.internalSources,
1290
1344
  pipelines: fleet.pipelines,
1291
1345
  capabilities: fleet.capabilities,
package/dist/cli.js CHANGED
@@ -19,7 +19,7 @@ program
19
19
  .option("--intake-url <url>", "投入フォームのLambda URL(環境変数 INTAKE_URL でも可)")
20
20
  .option("--intake-token <token>", "投入フォームの共有秘密トークン(環境変数 INTAKE_TOKEN でも可)")
21
21
  .option("--project-key <key>", "案件キー(投入フォームのルーティングキー)")
22
- .option("--secret-kinds <kinds>", "鍵の入力欄を出す連携(カンマ区切り。例: figma,external-sources,backlog)")
22
+ .option("--secret-kinds <kinds>", "鍵の入力欄を出す連携(カンマ区切り。例: figma,backlog)")
23
23
  .option("--webhook-url <url>", "Backlog Webhook 受信のLambda URL(環境変数 WEBHOOK_URL でも可)")
24
24
  .option("--webhook-token <token>", "リアルタイム同期の**案件別**トークン(環境変数 WEBHOOK_TOKEN でも可。艦隊共通トークンを渡さないこと)")
25
25
  .action(async (dir, opts) => {