@takagaki/cortex-decisions-viewer 0.4.72 → 0.4.74

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.
Files changed (2) hide show
  1. package/dist/render.js +49 -18
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -641,7 +641,7 @@ function tutorialChallenge4Prompt(decisions) {
641
641
  * 規約はプロンプトに書き写さず、規約のあるファイル(README.md・template.md)をAIに読ませ、
642
642
  * 中身は利用者に聞き返させる(AI導線ボタンのプロンプトと同じ方針)。
643
643
  * 規約がどこにも無い手順(外部サービスへのつなぎ方・投稿経路の判定)だけを骨子として残す。
644
- * スキルが使える環境ではそちらを優先させる旨を冒頭に添える。
644
+ * 対応するスキルがある操作は、スキルが使える環境ではそちらを優先させる旨を冒頭に添える。
645
645
  */
646
646
  const TUT_MEMBER_PROMPT = [
647
647
  "(update-member スキルが使える環境なら、そのスキルの手順を優先してください。)",
@@ -652,16 +652,13 @@ const TUT_MEMBER_PROMPT = [
652
652
  "書き込む前に、作成・変更する内容を提示して承認を得てください。",
653
653
  ].join("\n");
654
654
  const TUT_BACKLOG_PROMPT = [
655
- "(backlog-push スキルが使える環境なら、そのスキルの手順を優先してください。)",
656
- "",
657
655
  "Backlogの課題に、わたしの名義でコメントを1件投稿してください。Backlogの画面を開かずにAIから記票する練習です。",
658
656
  "どの課題に何を書くかは、まずわたしに質問してください(課題は 課題管理/issues/ から選べます。課題キーは各ファイルの「基本情報 > 課題キー」)。",
659
657
  "",
660
658
  "投稿経路は次の優先順で判定し、Backlog上の名義とあわせて先に伝えてください。",
661
659
  "1. mcp__backlog__ で始まるツール(あなた本人の名義。手元にAPIキーは不要)",
662
660
  "2. 環境変数 DOMAIN / PROJECT_KEY / BACKLOG_API_KEY があれば Backlog REST API を直接呼ぶ(キーの持ち主の名義)",
663
- "3. 課題管理/backlog-proxy.json(url / projectKey / token)の中央プロキシ(共有bot名義になるため、本文の冒頭に自分の名前を記名する)",
664
- "4. どれも無ければ、つなぎ方(手元の Claude Code なら /mcp コマンドから backlog、クラウドならセッションのコネクタ設定)を案内して止まる",
661
+ "3. どちらも無ければ、つなぎ方(手元の Claude Code なら /mcp コマンドから backlog、クラウドならセッションのコネクタ設定)を案内して止まる",
665
662
  "",
666
663
  "投稿する前に、課題キー・本文・経路・名義を提示して承認を得てください。投稿後は投稿先のURLを報告してください。",
667
664
  "今回はコメントの追加だけです。課題の削除・クローズ・属性変更はしないでください。",
@@ -2908,17 +2905,22 @@ ${capabilityState.toString()}
2908
2905
  // 別名は上のチップ(読み取り専用の記録)で見せるに留める。Lambda 側も add/remove とも断る。
2909
2906
  used = true;
2910
2907
  } else if (s.kind === "会議" && usable("会議", "google-meet")) {
2908
+ // **文面に設定ファイル名を出さない(2026-08-12 の文言原則)。** ここが見ているのは
2909
+ // 会議の取り込み設定(ingest-config.json の有無と enabled)だが、それは
2910
+ // 注: ここは埋め込みJSのテンプレートリテラル内。コメントでもバッククォートを使わない
2911
+ // 読む人の操作対象ではない——画面から直せないものなので、次の一歩は「担当者へ連絡」。
2912
+ // 「手で直してください」も出さない(PM に設定ファイルを編集させる案内になっていた)。
2911
2913
  if (s.ingestState === "unset") {
2912
- box.appendChild(el("p", { class: "sec-how", text: "会議の取り込み設定がこのリポジトリにありません(ingest-config.json)。先に設置が必要です。" }));
2914
+ box.appendChild(el("p", { class: "sec-how", text: "この案件では議事録の自動取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
2913
2915
  used = true;
2914
2916
  } else if (s.ingestState === "broken") {
2915
- box.appendChild(el("p", { class: "sec-how", text: "会議の取り込み設定(ingest-config.json)が壊れているため、ここからは変更できません。手で直してください。" }));
2917
+ box.appendChild(el("p", { class: "sec-how", text: "議事録の取り込み設定を読み取れないため、この画面からは変更できません。cortex の担当者にご連絡ください。" }));
2916
2918
  used = true;
2917
2919
  } else if (s.ingestState === "off") {
2918
2920
  // 自動取り込みを止めている案件(例: Teams を使っていて手動で取り込む運用)。
2919
2921
  // ここでトグルを出すと「押せば始まる」と読めるが、実際は設定ファイルの意思表示なので
2920
2922
  // 画面から気軽に反転させるものではない。状態だけを伝える。
2921
- box.appendChild(el("p", { class: "sec-how", text: "この案件は会議の自動取り込みを行わない設定です(ingest-config.json の enabled が false)。" }));
2923
+ box.appendChild(el("p", { class: "sec-how", text: "この案件は議事録の自動取り込みを停止しています。" }));
2922
2924
  used = true;
2923
2925
  }
2924
2926
  }
@@ -2945,10 +2947,13 @@ ${capabilityState.toString()}
2945
2947
  // 同期ミラー(backlog-settings.json)の位置から決めている。ミラーが1つも
2946
2948
  // 無い案件では正本をどこへ置けばよいかも決められないので、条件は変わらない
2947
2949
  if (!s.url) {
2948
- box.appendChild(el("p", { class: "sec-how", text: "この案件の課題管理の設定ファイル(同期ミラーの backlog-settings.json)がまだありません。接続先の正本(issues-config.json)の置き場もここから決められないため、先に初回の同期を実行するか、担当者にご連絡ください。" }));
2950
+ box.appendChild(el("p", { class: "sec-how", text: "この案件はまだ一度も Backlog と同期していないため、この画面からは接続先を設定できません。先に初回の同期を実行するか、cortex の担当者にご連絡ください。" }));
2949
2951
  used = true;
2950
2952
  } else box.appendChild(addForm({
2951
2953
  title: "接続先を変更",
2954
+ // **「追加」ではなく「保存」。** 接続先は1件しか持てない置き換えで、
2955
+ // 「追加」だと2つ目を足せると読める(実機テストでの指摘・複数対応は #127)
2956
+ submitLabel: "保存",
2952
2957
  placeholder: "https://<スペース>.backlog.jp/projects/<プロジェクトキー>",
2953
2958
  requiredNote: "BacklogのURLを入力してください(プロジェクトキーが入った形。数字だけのURLは受け付けません)。",
2954
2959
  hint: "Backlog でこの案件のプロジェクトを開き、ブラウザのURLをそのまま貼ってください(課題の画面のURLでも構いません)。APIキーは下の「Backlog のAPIキー」から別に登録します。",
@@ -2980,12 +2985,14 @@ ${capabilityState.toString()}
2980
2985
  }
2981
2986
 
2982
2987
  if (s.kind === "共有資料" && usable("共有資料", "google-drive")) {
2988
+ // 状態の出どころは資料の取り込み設定(materials-config.json)だが、会議と同じく
2989
+ // 文面には出さない(2026-08-12 の文言原則)。画面から直せない状態の次の一歩は担当者への連絡。
2983
2990
  if (s.driveState === "unset") {
2984
- box.appendChild(el("p", { class: "sec-how", text: "資料の同期設定がこのリポジトリにありません(materials-config.json)。先に設置が必要です。" }));
2991
+ box.appendChild(el("p", { class: "sec-how", text: "この案件では共有資料の取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
2985
2992
  used = true;
2986
2993
  } else if (s.driveState === "broken") {
2987
2994
  // 壊れていると書き込みも失敗する。フォームを出して押させない
2988
- box.appendChild(el("p", { class: "sec-how", text: "資料の同期設定(materials-config.json)が壊れているため、ここからは変更できません。手で直してください。" }));
2995
+ box.appendChild(el("p", { class: "sec-how", text: "共有資料の取り込み設定を読み取れないため、この画面からは変更できません。cortex の担当者にご連絡ください。" }));
2989
2996
  used = true;
2990
2997
  } else if (s.driveState) {
2991
2998
  // フォルダが1件も無いのに ON/OFF だけ出しても意味が無いので、追加フォームを先に出す
@@ -3363,14 +3370,21 @@ ${capabilityState.toString()}
3363
3370
 
3364
3371
  /**
3365
3372
  * 「+…を追加」のフォーム。URLをそのまま貼れるようにする(IDだけを要求すると転記ミスが増える)。
3366
- * @param opts { title, placeholder, hint, needsName, confirmLines, build(values) }
3373
+ *
3374
+ * **ボタンの語は呼び出し側が決める(既定は「追加」)。** 課題管理の「接続先を変更」だけは
3375
+ * 1件しか持てない設定の**置き換え**なのに、ボタンが「追加」だと**複数登録できる**と読める
3376
+ * (実機テストでの指摘。複数接続先の対応は #127 の将来要件で、いまは持てない)。
3377
+ * 押した結果の表示(+/追加済み)も同じ理由で語を揃える。
3378
+ *
3379
+ * @param opts { title, placeholder, hint, needsName, confirmLines, build(values), submitLabel }
3367
3380
  */
3368
3381
  function addForm(opts) {
3369
3382
  var main = el("input", { class: "sec-input", type: "text", placeholder: opts.placeholder, autocomplete: "off" });
3370
3383
  var name = opts.needsName
3371
3384
  ? el("input", { class: "sec-input", type: "text", placeholder: opts.namePlaceholder || "表示名", autocomplete: "off" })
3372
3385
  : null;
3373
- var btn = el("button", { class: "ds-toggle-btn", type: "button", text: "追加" });
3386
+ var submitLabel = opts.submitLabel || "追加";
3387
+ var btn = el("button", { class: "ds-toggle-btn", type: "button", text: submitLabel });
3374
3388
  var msg = el("div", { class: "ds-toggle-msg" });
3375
3389
 
3376
3390
  btn.addEventListener("click", function () {
@@ -3398,9 +3412,9 @@ ${capabilityState.toString()}
3398
3412
  // (実際にそうなった)。だから押した結果をここで見せる。
3399
3413
  pending.appendChild(
3400
3414
  el("div", { class: "ds-pending-item" }, [
3401
- el("span", { class: "ds-pending-mark", text: "+" }),
3415
+ el("span", { class: "ds-pending-mark", text: opts.submitLabel ? "✓" : "+" }),
3402
3416
  el("span", { class: "ds-pending-name", text: addedName || added }),
3403
- el("span", { class: "ds-pending-note", text: "追加済み・反映中" }),
3417
+ el("span", { class: "ds-pending-note", text: submitLabel + "済み・反映中" }),
3404
3418
  ]),
3405
3419
  );
3406
3420
  });
@@ -3531,8 +3545,19 @@ ${capabilityState.toString()}
3531
3545
 
3532
3546
  /**
3533
3547
  * 登録の由来の表示(#118)。値は fleet-status.json の origin
3534
- * (explicit … 登録ファイルに手で書いた / derived … .gitmodules 等からの自動導出 / both)。
3548
+ * (explicit … 登録ファイルに手で書いた / derived … 自動導出 / both)。
3535
3549
  * **知らない値には何も出さない**(生の内部値を顧客の画面に出さないため)。
3550
+ *
3551
+ * **#119 で、開発リポの自動導出は無くなった。** .gitmodules の submodule を登録として
3552
+ * 扱うのをやめた(手元でコードを読みたいという案件のカスタマイズであって、中身を顧客可視の
3553
+ * Gold に上げてよいという同意ではない)ので、いま engine が derived を付けるのは
3554
+ * Slack だけ。**新しく生成されるデータでは github の行は必ず explicit になる。**
3555
+ *
3556
+ * **それでも derived / both の表示と、下の削除の出し分けは残す。** 再生成前の
3557
+ * fleet-status.json にはまだ derived が入っている(艦隊の実データで確認: cortex-context
3558
+ * 5件・mitsubishi 5件・verdy 4件・gdo 1件)。ここを消すと、その案件では
3559
+ * **「登録から削除」が出てはいけない行に出て**、押しても翌日また現れる。
3560
+ * 全案件の再生成が回りきったら、github 側のこの分岐を落とす。
3536
3561
  */
3537
3562
  var ORIGIN_LABEL = { explicit: "明示登録", derived: "自動検出", both: "明示登録+自動検出" };
3538
3563
  var ORIGIN_HELP = {
@@ -3557,7 +3582,9 @@ ${capabilityState.toString()}
3557
3582
  // 登録の由来(#118)。**「登録から削除」が出る/出ないの理由がこれ。** 導出されたリポは
3558
3583
  // 登録ファイルから消しても翌日また現れるので削除を出していないが、画面には
3559
3584
  // 「同じ見た目の行なのに、片方にだけ削除がある」としか映らず、毎回考え直すことになる。
3560
- // GitHub の行だけに出す(削除の出し分けがあるのはここだけで、他は全部 explicit)
3585
+ // **GitHub の行だけに出す。** 由来で出し分けているのはここだけだから——Slack も
3586
+ // channels.json 由来の derived だが、あちらに削除は無く、由来を見せても打つ手が増えない。
3587
+ // #119 以降、新しいデータの github は必ず explicit(詳細は ORIGIN_LABEL)
3561
3588
  if (String(s.type).indexOf("github") === 0 && ORIGIN_LABEL[s.origin]) {
3562
3589
  badges.appendChild(el("span", {
3563
3590
  class: "badge ds-origin",
@@ -3599,9 +3626,13 @@ ${capabilityState.toString()}
3599
3626
  return { op: "set-github-source-enabled", repo: s.ref, value: next };
3600
3627
  },
3601
3628
  }));
3602
- // **削除は「手で登録したもの」にだけ出す。** .gitmodules 等から自動で見つかったリポは
3629
+ // **削除は「手で登録したもの」にだけ出す。** 自動で見つかったリポは
3603
3630
  // 登録ファイルから消しても翌日また現れる(=消えないのに消せたように見える)。
3604
3631
  // 止めたいだけなら上の「読み取りを止める」で足りる。
3632
+ //
3633
+ // **#119 以降、新しいデータの github は必ず explicit** なので、この条件は
3634
+ // いずれ常に真になる。それまでは残す——再生成前のスナップショットには derived が
3635
+ // まだ入っており、条件を外すと押しても戻ってくる削除ボタンが出る(ORIGIN_LABEL 参照)。
3605
3636
  if (s.origin === "explicit") {
3606
3637
  card.appendChild(removeButton({
3607
3638
  label: "登録から削除",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.4.72",
3
+ "version": "0.4.74",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,