@takagaki/cortex-decisions-viewer 0.12.65 → 0.12.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 CHANGED
@@ -756,8 +756,24 @@ async function readGoldProposals(repoRoot) {
756
756
  // 27案件を実測したところ、案件の目的が記入済みなのは3件だけだった。
757
757
  // 残る24案件では、毎晩のAI生成が**案件を知らないまま**抽出を続けている。
758
758
  // ビューアの仕事は、その未記入を見えるようにして「書かせる圧」をかけること。
759
- /** 新しい形の自己記述の節。画面の最上部に出す */
760
- const HOME_GROUNDING_HEADINGS = ["この案件について", "ゴール", "体制"];
759
+ /**
760
+ * 記入されていないと困る自己記述の節。**未記入の赤い帯はここだけを見る。**
761
+ *
762
+ * 🔴 **旧見出し「この案件について」への両対応は入れない**(#626 便 2・オーナー決定)。
763
+ * engine のマイグレーション 0093 が全プロジェクトの Home.md を改名済みで、旧見出しは
764
+ * どこにも残っていない。両対応にすると、次に見出しが動いたときにどちらが正本か
765
+ * 分からなくなる(改名は engine 側の 1 回きりの操作として完了している)。
766
+ *
767
+ * 🔴 **見出し名を「出す節」と「必須の節」で別々に書かない。** 片方だけ直すと
768
+ * 「節は最上部に出ているのに未記入の赤い帯も出る」という食い違った画面になる
769
+ * (0.12.66 の事故がまさにこの形だった)。必須から並びを組み立てる向きにしておくと、
770
+ * 任意の節を改名しても必須に昇格しない。
771
+ */
772
+ const HOME_REQUIRED_GROUNDING_HEADINGS = ["このプロジェクトについて", "ゴール"];
773
+ /** あれば出すが、無くてよい節(未記入の判定には使わない) */
774
+ const HOME_OPTIONAL_GROUNDING_HEADINGS = ["体制"];
775
+ /** 新しい形の自己記述の節。画面の最上部に、この並び順で出す */
776
+ const HOME_GROUNDING_HEADINGS = [...HOME_REQUIRED_GROUNDING_HEADINGS, ...HOME_OPTIONAL_GROUNDING_HEADINGS];
761
777
  /** 旧い形。1つの節に「解きたいこと」「達成した状態」が同居していた */
762
778
  const HOME_LEGACY_GROUNDING_HEADING = "このプロジェクトが目指すもの";
763
779
  /**
@@ -830,9 +846,9 @@ async function buildHomeGrounding(rawMarkdown) {
830
846
  html: await renderGroundingSection(hit.body),
831
847
  });
832
848
  }
833
- // 未記入の判定。新形式は「この案件について」と「ゴール」の2つ、旧形式は1つの節を見る。
834
- // **どちらの節も無ければ未記入。** 節ごと消えている案件が実在する
835
- const checkHeadings = hasNew ? ["この案件について", "ゴール"] : [HOME_LEGACY_GROUNDING_HEADING];
849
+ // 未記入の判定。新形式は「このプロジェクトについて」と「ゴール」の2つ、旧形式は1つの節を見る。
850
+ // **どちらの節も無ければ未記入。** 節ごと消えているプロジェクトが実在する
851
+ const checkHeadings = hasNew ? HOME_REQUIRED_GROUNDING_HEADINGS : [HOME_LEGACY_GROUNDING_HEADING];
836
852
  const unfilled = checkHeadings.some((h) => {
837
853
  const hit = find(h);
838
854
  return !hit || !hit.body.trim() || isUnwritten(hit.body);
package/dist/render.js CHANGED
@@ -100,7 +100,7 @@ function renderSite(site, assets) {
100
100
  const githubBtn = site.repoBaseUrl
101
101
  ? `<a class="gh-btn" href="${escapeHtml(site.repoBaseUrl)}" target="_blank" rel="noopener" title="コンテキストリポジトリをGitHubで開く">${GITHUB_ICON}</a>`
102
102
  : "";
103
- const askBtn = `<a class="ask-ai-btn" href="${escapeHtml(askUrl)}" data-ai-prompt="${escapeHtml(ASK_PROMPT)}" target="_blank" rel="noopener" title="Claude Code Web でこの案件のリポジトリと、登録済みの開発リポジトリを開き、プロジェクトについて質問・調査できます">💬 プロジェクトについてAIに聞く</a>`;
103
+ const askBtn = `<a class="ask-ai-btn" href="${escapeHtml(askUrl)}" data-ai-prompt="${escapeHtml(ASK_PROMPT)}" target="_blank" rel="noopener" title="Claude Code Web でこのプロジェクトのリポジトリと、登録済みの開発リポジトリを開いて、質問・調査できます">💬 プロジェクトについてAIに聞く</a>`;
104
104
  // CSPでインラインが拒否される環境向けの外部参照形。省略時は従来どおり埋め込む
105
105
  const styleTag = assets
106
106
  ? `<link rel="stylesheet" href="${escapeHtml(assets.css)}" />`
@@ -398,7 +398,7 @@ const CLAUDE_CODE_HOME = "https://claude.ai/code/";
398
398
  /** 素のリンクを**テストから固定するための入れ物**(LIVE_CONFIRM_LIMITS と同じ作法) */
399
399
  exports.CLAUDE_CODE_LINK = { home: CLAUDE_CODE_HOME };
400
400
  /**
401
- * 「この案件について聞く」導線の指示文。
401
+ * 「このプロジェクトについて聞く」導線の指示文。
402
402
  *
403
403
  * **AI 導線の指示文はここ1か所に持つ。** 書き写した先が増えると、URL は同じでも
404
404
  * **開いた先の AI への最初の一言が2通り**になる(`askAiUrl` と対で読む)。
@@ -3556,7 +3556,7 @@ function buildTutorialData(site, repoSlug) {
3556
3556
  },
3557
3557
  {
3558
3558
  title: "ドメインを可視化する",
3559
- desc: "案件の概念と関係を図にする",
3559
+ desc: "プロジェクトの概念と関係を図にする",
3560
3560
  prompt: "このプロジェクトの主要なドメイン概念(用語集)と、それらの関係性を、HTML アーティファクトで見やすく可視化してください。カードやボックスと線でノードと関係を表す軽量な作りにし、描画に時間のかかる精密な SVG 座標計算は避けてください。",
3561
3561
  },
3562
3562
  {
@@ -3616,7 +3616,7 @@ function buildTutorialData(site, repoSlug) {
3616
3616
  if (usesSlack) {
3617
3617
  specs.push({
3618
3618
  title: "Slackに完了を知らせよう",
3619
- desc: "チュートリアルの完了を案件のチャンネルに投稿する",
3619
+ desc: "チュートリアルの完了をプロジェクトのチャンネルに投稿する",
3620
3620
  prompt: TUT_SLACK_PROMPT,
3621
3621
  });
3622
3622
  }
@@ -3681,13 +3681,13 @@ const TUT_DESIGN_PROMPT = [
3681
3681
  "読むだけの練習です。インベントリはFigmaからの同期で上書きされる生成物なので、手で編集しないでください。",
3682
3682
  ].join("\n");
3683
3683
  const TUT_SLACK_PROMPT = [
3684
- "Cortex のチュートリアルを完了したことを、この案件の Slack チャンネルに投稿してください。最後のステップです。",
3684
+ "Cortex のチュートリアルを完了したことを、このプロジェクトの Slack チャンネルに投稿してください。最後のステップです。",
3685
3685
  "",
3686
3686
  "1. チャット/channels.json を読んで投稿先のチャンネルを選ぶ(複数あれば description を見て判断し、迷ったらわたしに聞く)",
3687
3687
  "2. 次の雛形で本文を作る({名前} は Cortex/Members/records/ にあるわたしのレコードの表記に合わせる)",
3688
3688
  "",
3689
3689
  "🎉 {名前} さんが Cortex のチュートリアルを完了しました",
3690
- "できるようになったこと: Gold層から案件を把握する・自分の情報を更新する・Backlogに記票する・資料を投入する",
3690
+ "できるようになったこと: Gold層からプロジェクトを把握する・自分の情報を更新する・Backlogに記票する・資料を投入する",
3691
3691
  "使い方の質問はこのチャンネルへどうぞ",
3692
3692
  "",
3693
3693
  "3. 投稿先と本文をプレビューして承認を得てから投稿し、メッセージのリンクを報告する",
@@ -4258,11 +4258,6 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
4258
4258
  background: #ecfdf5; border: 1px solid #a7f3d0; border-radius: 8px;
4259
4259
  padding: 10px 14px; margin: 12px 0 4px; font-size: 13.5px; color: #047857; line-height: 1.7;
4260
4260
  }
4261
- .adoption-note {
4262
- display: flex; gap: 8px; align-items: flex-start;
4263
- background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px;
4264
- padding: 10px 14px; margin: 0 0 14px; font-size: 13.5px; color: #1e40af; line-height: 1.7;
4265
- }
4266
4261
  .chip.adoption-existing, .chip.adoption-migration { background: #eff6ff; color: #1e40af; border-color: #bfdbfe; }
4267
4262
  .chip.adoption-new { background: #ecfdf5; color: #047857; border-color: #a7f3d0; }
4268
4263
  .chip {
@@ -5762,10 +5757,10 @@ ${calendarAddUrl.toString()}
5762
5757
  // 顧客も押すボタンなので、内側の運用事情を文面に出さない。
5763
5758
  var AI_COMMON = "";
5764
5759
  // Home(案件の入口)のAI編集。Gold層の4区画と違い規約READMEが無いので、Home自身を読ませて直させる。
5765
- // 「このプロジェクトが目指すもの」はAIが判断の方向を決める材料なので、未記入なら埋めることを促す。
5760
+ // 「このプロジェクトについて」「ゴール」はAIが判断の方向を決める材料なので、未記入なら埋めることを促す。
5766
5761
  var HOME_EDIT_PROMPT = [
5767
- "Cortex/Home.md を読んでから、この案件の入口ページを修正してください。",
5768
- "何を直すかは、まずわたしに質問してください。「この案件について」「ゴール」が未記入なら、そこを埋めるところから始めてください。",
5762
+ "Cortex/Home.md を読んでから、このプロジェクトの入口ページを修正してください。",
5763
+ "何を直すかは、まずわたしに質問してください。「このプロジェクトについて」「ゴール」が未記入なら、そこを埋めるところから始めてください。",
5769
5764
  "frontmatter(識別カード・engine 設定)は触らないでください。日付・進捗・実績値は書かないでください(変わるものの正本は課題管理ツール等の外部にあります)。",
5770
5765
  "このサイトの使い方の説明は書かないでください(説明は画面の側が持っています)。",
5771
5766
  "書き込む前に、変更内容を提示して承認を得てください。",
@@ -5779,10 +5774,10 @@ ${calendarAddUrl.toString()}
5779
5774
  * 「何をする案件か・誰のためか・どうなったら成功か」を必ず聞かせる。
5780
5775
  */
5781
5776
  var HOME_WRITE_PROMPT = [
5782
- "Cortex/Home.md を読んでから、この案件の「この案件について」「ゴール」の2つの節を埋めてください。",
5783
- "まず、わたしに質問して内容を聞き出してください。少なくとも次の3つを確かめてください: 何をする案件か/誰のための案件か(顧客・利用者は誰か)/どうなったら成功と言えるか。",
5777
+ "Cortex/Home.md を読んでから、「このプロジェクトについて」「ゴール」の2つの節を埋めてください。",
5778
+ "まず、わたしに質問して内容を聞き出してください。少なくとも次の3つを確かめてください: 何をするプロジェクトか/誰のためのプロジェクトか(顧客・利用者は誰か)/どうなったら成功と言えるか。",
5784
5779
  "聞き出した内容をもとに、2つの節を具体的な散文で書いてください。雛形の {{…}} は残さず、実際の内容に置き換えてください。",
5785
- "この2つの節は、毎晩のAI生成(決定事項・用語集・メンバー・ルールの抽出)が案件を理解するために読む場所です。抽象的な言葉ではなく、この案件に固有の具体で書いてください。",
5780
+ "この2つの節は、毎晩のAI生成(決定事項・用語集・メンバー・ルールの抽出)がプロジェクトを理解するために読む場所です。抽象的な言葉ではなく、このプロジェクトに固有の具体で書いてください。",
5786
5781
  "このサイトの使い方の説明は書かないでください(説明は画面の側が持っています)。",
5787
5782
  "frontmatter(識別カード・engine 設定)は触らないでください。日付・進捗・実績値は書かないでください(変わるものの正本は課題管理ツール等の外部にあります)。",
5788
5783
  "書き込む前に、書いた内容を提示して承認を得てください。",
@@ -5844,7 +5839,7 @@ ${calendarAddUrl.toString()}
5844
5839
  noun: "ルール",
5845
5840
  dir: "Cortex/Rules",
5846
5841
  add: [
5847
- "Cortex/Rules/README.md と Cortex/Rules/template.md を読んで登録の規約を把握してから、ルール(案件で継続的に守る制約)を1件登録してください。",
5842
+ "Cortex/Rules/README.md と Cortex/Rules/template.md を読んで登録の規約を把握してから、ルール(プロジェクトで継続的に守る制約)を1件登録してください。",
5848
5843
  "何を登録するかは、まずわたしに質問してください。",
5849
5844
  "書き込む前に、作成するファイルの内容を提示して承認を得てください。",
5850
5845
  ].join("\\n"),
@@ -6201,22 +6196,22 @@ ${calendarAddUrl.toString()}
6201
6196
  var base = SITE.repoBaseUrl;
6202
6197
  var INFO = {
6203
6198
  "decisions": {
6204
- text: "議事録・課題から確定した決定が毎晩自動で追記されます。",
6199
+ text: "このプロジェクトで決まったことの記録です。何を・いつ・誰が決めたかと、その根拠になった会議や課題を辿れます。",
6205
6200
  btnLabel: "実行履歴を確認 →",
6206
6201
  btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
6207
6202
  },
6208
6203
  "dir:Glossary": {
6209
- text: "毎晩の自動走査が新しい用語を draft として直接追加します。AIが生成した定義は仮のものです。「AI生成・未確認」の用語は必ず内容を確認し、適切な定義に置き換えて status: active にしてください。",
6204
+ text: "このプロジェクトで使う言葉の意味をそろえる辞書です。人によって呼び方が分かれる言葉や、このプロジェクトだけの用語を載せます。",
6210
6205
  btnLabel: "実行履歴を確認 →",
6211
6206
  btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
6212
6207
  },
6213
6208
  "dir:Members": {
6214
- text: "プロジェクト関係者の名簿です。人名の表記ゆれを解決する根拠になります。毎晩の自動走査が新しい参加者を draft として追加します。",
6209
+ text: "このプロジェクトに関わる人の名簿です。役割と所属を持ち、資料ごとに違う表記(漢字・ローマ字など)を同じ人として結び付けます。",
6215
6210
  btnLabel: "実行履歴を確認 →",
6216
6211
  btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
6217
6212
  },
6218
6213
  "dir:Rules": {
6219
- text: "案件で継続的に守る制約・ルールの一覧です。AIはここを読んで、違反する提案を避けます。",
6214
+ text: "このプロジェクトで継続して守る決まりごとです。一度きりの決定ではなく、以後ずっと適用される制約や作法を集めます。",
6220
6215
  btnLabel: "実行履歴を確認 →",
6221
6216
  btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
6222
6217
  },
@@ -6253,20 +6248,15 @@ ${calendarAddUrl.toString()}
6253
6248
  renderGenericList();
6254
6249
  }
6255
6250
 
6256
- // 導入経緯(overview.adoption)の表示情報。existing/migration は Decision の薄さを注記する。
6251
+ // 導入経緯(overview.adoption)の表示情報。Home見出し横のチップに出すラベルだけを返す。
6257
6252
  function adoptionInfo(v) {
6258
- // existing/migration は同一文言で「導入前の意思決定が揃わない」旨を注記する
6259
- var note = "この案件はAIS導入前から進行しているため、導入以前の意思決定はDecisionログに残っていない場合があります。";
6260
- if (v === "existing") return { label: "既存案件に導入", note: note };
6261
- if (v === "migration") return { label: "Cortex移行", note: note };
6262
- if (v === "new") return { label: "新規導入", note: "" };
6253
+ // 3種とも同じ形(ラベルのみ)。導入前のDecisionの薄さの注記は出さない
6254
+ if (v === "existing") return { label: "既存プロジェクトに導入" };
6255
+ if (v === "migration") return { label: "Cortex移行" };
6256
+ if (v === "new") return { label: "新規導入" };
6263
6257
  return null;
6264
6258
  }
6265
6259
 
6266
- function homeAdoption() {
6267
- return SITE.home && SITE.home.fm ? adoptionInfo(SITE.home.fm.adoption) : null;
6268
- }
6269
-
6270
6260
  // ---------- はじめに(チュートリアル・Homeタブ下部に統合) ----------
6271
6261
  // localStorageキーは案件別(repoSlug)。同一ブラウザで複数案件のビューアを見ても混ざらない
6272
6262
  function tutStoreKey(n) { return "cortex-tutorial-done:" + ((TUTORIAL && TUTORIAL.slug) || "") + ":" + n; }
@@ -6564,7 +6554,7 @@ ${calendarAddUrl.toString()}
6564
6554
  circle.setAttribute("aria-expanded", siteIconMenuOpen ? "true" : "false");
6565
6555
  // 未設定は「+」が見えているので、説明は「変更」ではなく置ける話にしない——
6566
6556
  // 読み上げと tooltip は、いまの状態でできることをそのまま言う
6567
- var label = cur ? "案件アイコンを変更/外す" : "案件アイコンを設定";
6557
+ var label = cur ? "プロジェクトアイコンを変更/外す" : "プロジェクトアイコンを設定";
6568
6558
  circle.setAttribute("title", label);
6569
6559
  circle.setAttribute("aria-label", label);
6570
6560
  } else {
@@ -7133,10 +7123,10 @@ ${calendarAddUrl.toString()}
7133
7123
  function homeUnfilledCard() {
7134
7124
  var card = el("div", { class: "home-unfilled" }, [
7135
7125
  el("div", { class: "home-unfilled-body" }, [
7136
- el("div", { class: "home-unfilled-title", text: "この案件の概要とゴールが未記入です。" }),
7126
+ el("div", { class: "home-unfilled-title", text: "このプロジェクトの概要とゴールが未記入です。" }),
7137
7127
  el("div", {
7138
7128
  class: "home-unfilled-text",
7139
- text: "書かれていないと、毎晩のAI生成(決定事項・用語・ルール・名簿)がこの案件を誤解したまま抽出を続けます。",
7129
+ text: "書かれていないと、毎晩のAI生成(決定事項・用語・ルール・名簿)がこのプロジェクトを誤解したまま抽出を続けます。",
7140
7130
  }),
7141
7131
  ]),
7142
7132
  ]);
@@ -7160,7 +7150,7 @@ ${calendarAddUrl.toString()}
7160
7150
  "この仕組みについて": 1,
7161
7151
  "情報の見方": 1,
7162
7152
  "このサイトで見られるもの": 1,
7163
- "この案件について": 1,
7153
+ "このプロジェクトについて": 1,
7164
7154
  "ゴール": 1,
7165
7155
  "体制": 1,
7166
7156
  "このプロジェクトが目指すもの": 1,
@@ -7808,7 +7798,7 @@ ${calendarAddUrl.toString()}
7808
7798
  var wrap = el("div", { class: "sec-how" });
7809
7799
  wrap.appendChild(el("p", { text: "取り込まれる条件" }));
7810
7800
  var ul = el("ul", { class: "sec-how-list" });
7811
- ul.appendChild(el("li", { text: "予定がこの案件のカレンダーにある" }));
7801
+ ul.appendChild(el("li", { text: "予定がこのプロジェクトのカレンダーにある" }));
7812
7802
  ul.appendChild(el("li", { text: "Gemini のメモが ON" }));
7813
7803
  wrap.appendChild(ul);
7814
7804
  wrap.appendChild(el("p", { text: "この 2 つが揃った会議だけが取り込まれます。" }));
@@ -7826,7 +7816,7 @@ ${calendarAddUrl.toString()}
7826
7816
  */
7827
7817
  wrap.appendChild(el("p", {
7828
7818
  class: "mt-scope",
7829
- text: "案件カレンダーの予定に添付されたメモだけを開きます。それ以外は中身を開きません。",
7819
+ text: "プロジェクトカレンダーの予定に添付されたメモだけを開きます。それ以外は中身を開きません。",
7830
7820
  }));
7831
7821
  // ---- 2番目: 案件カレンダーの行(#428) ----
7832
7822
  //
@@ -7850,7 +7840,7 @@ ${calendarAddUrl.toString()}
7850
7840
  // **待ちの1行は続けない**(作る場所が分からない人に、作った後の話をしない)
7851
7841
  wrap.appendChild(el("p", {
7852
7842
  class: "mt-cal-off",
7853
- text: "この案件では、この画面から案件カレンダーを確かめられません。カレンダーの場所は cortex の担当者にご確認ください。",
7843
+ text: "この画面からはプロジェクトカレンダーを確かめられません。カレンダーの場所は cortex の担当者にご確認ください。",
7854
7844
  }));
7855
7845
  }
7856
7846
  return wrap;
@@ -7917,7 +7907,7 @@ ${calendarAddUrl.toString()}
7917
7907
  // まだ観測が届いていない。**帯もボタンも出さない**——ここで「まだありません」+「作る」を
7918
7908
  // 出すと、既にカレンダーがある案件で速い人が押して 2 本目を作る
7919
7909
  if (cal.phase === "unknown") {
7920
- box.appendChild(el("p", { class: "mt-cal-note", text: "案件カレンダーの状況を確認中です。" }));
7910
+ box.appendChild(el("p", { class: "mt-cal-note", text: "プロジェクトカレンダーの状況を確認中です。" }));
7921
7911
  return;
7922
7912
  }
7923
7913
 
@@ -7926,7 +7916,7 @@ ${calendarAddUrl.toString()}
7926
7916
  if (cal.phase === "unclear") {
7927
7917
  box.appendChild(el("p", {
7928
7918
  class: "mt-cal-note",
7929
- text: "案件カレンダーの状況を確認しています。しばらく待っても変わらなければ、cortex の担当者に連絡してください。",
7919
+ text: "プロジェクトカレンダーの状況を確認しています。しばらく待っても変わらなければ、cortex の担当者に連絡してください。",
7930
7920
  }));
7931
7921
  return;
7932
7922
  }
@@ -7934,7 +7924,7 @@ ${calendarAddUrl.toString()}
7934
7924
  if (cal.phase === "ready") {
7935
7925
  // 🔴 **説明の1行は、その操作の直前に置く(#452)。** 押す前に読むものなので、
7936
7926
  // 操作の後ろに置くと「押してから理由を知る」順になる
7937
- box.appendChild(el("p", { class: "mt-cal-note", text: "予定を作るときに、カレンダーの欄でこの案件を選びます" }));
7927
+ box.appendChild(el("p", { class: "mt-cal-note", text: "予定を作るときに、カレンダーの欄でこのプロジェクトを選びます" }));
7938
7928
  // 手順の画像。**上の1文だけで手順が完結する**(読み上げ・画像が出ない環境)ので、
7939
7929
  // alt にも同じ内容を1文で書く。寸法は属性で明示——書かないと、モーダルを開いた
7940
7930
  // 瞬間に画像の高さのぶん下の操作がずれる(Google Chat の手順と同じ理由)。
@@ -7942,13 +7932,13 @@ ${calendarAddUrl.toString()}
7942
7932
  // 表示幅の上限とクリックでの原寸戻しは guideShot / .mt-shot が持つ(#455)
7943
7933
  box.appendChild(guideShot({
7944
7934
  src: MEET_SHOT_CREATE_EVENT, width: "1360", height: "949",
7945
- alt: "予定の作成ダイアログ。「カレンダー」の欄で案件のカレンダーが選ばれ、Google Meet を追加するボタンが示され、左の一覧の「他のカレンダー」に「Google カレンダーに追加」した案件カレンダーが並んでいる。",
7935
+ alt: "予定の作成ダイアログ。「カレンダー」の欄でプロジェクトのカレンダーが選ばれ、Google Meet を追加するボタンが示され、左の一覧の「他のカレンダー」に「Google カレンダーに追加」したプロジェクトカレンダーが並んでいる。",
7946
7936
  }));
7947
7937
  // 🔴 **全員が必ず1回押すものなので主ボタンにする**(#452 のオーナー指摘)。
7948
7938
  // 見た目は「この案件のカレンダーを作る」= .ds-toggle-btn を**そのまま借りる**
7949
7939
  // ——色・枠・丸みを写すと値が2枚になり、片方だけ直る。.mt-cal-primary は
7950
7940
  // リンク固有の分(inline-block・下線を外す)だけを足す
7951
- box.appendChild(el("p", { class: "mt-cal-note", text: "最初に 1 回だけ。追加すると、上の画面でこの案件を選べるようになります" }));
7941
+ box.appendChild(el("p", { class: "mt-cal-note", text: "最初に 1 回だけ。追加すると、上の画面でこのプロジェクトを選べるようになります" }));
7952
7942
  box.appendChild(el("a", {
7953
7943
  class: "ds-toggle-btn mt-cal-primary", href: calendarAddUrl(cal.calendarId), target: "_blank", rel: "noopener",
7954
7944
  text: "Google カレンダーに追加 →",
@@ -7978,7 +7968,7 @@ ${calendarAddUrl.toString()}
7978
7968
  // たまにしかしないので、一番下に小さく薄い文字リンクで出す
7979
7969
  box.appendChild(el("a", {
7980
7970
  class: "mt-cal-sub", href: calendarTemplateUrl(cal.calendarId), target: "_blank", rel: "noopener",
7981
- text: "この案件のミーティングを作成 ↗",
7971
+ text: "このプロジェクトのミーティングを作成 ↗",
7982
7972
  }));
7983
7973
  return;
7984
7974
  }
@@ -8014,8 +8004,8 @@ ${calendarAddUrl.toString()}
8014
8004
  return;
8015
8005
  }
8016
8006
 
8017
- box.appendChild(el("div", { class: "mt-cal-banner", text: "案件カレンダーがまだありません" }));
8018
- box.appendChild(calendarRequestButton("この案件のカレンダーを作る", "create"));
8007
+ box.appendChild(el("div", { class: "mt-cal-banner", text: "プロジェクトカレンダーがまだありません" }));
8008
+ box.appendChild(calendarRequestButton("このプロジェクトのカレンダーを作る", "create"));
8019
8009
  }
8020
8010
 
8021
8011
  /**
@@ -8091,8 +8081,8 @@ ${calendarAddUrl.toString()}
8091
8081
  [
8092
8082
  // #622: 共有先はポータルで承認された案件のメンバー全員。**押す人に範囲を正しく伝える**
8093
8083
  //(前は「案件の社内メンバーに」と書いていたが、社外のメンバーにも閲覧で共有される)
8094
- "cortex-notetaker が「" + (SITE.title || "この案件") + "」のカレンダーを作り、"
8095
- + "案件の社内メンバーに予定作成の権限で、社外のメンバーに閲覧の権限で共有します。",
8084
+ "cortex-notetaker が「" + (SITE.title || "このプロジェクト") + "」のカレンダーを作り、"
8085
+ + "プロジェクトの社内メンバーに予定作成の権限で、社外のメンバーに閲覧の権限で共有します。",
8096
8086
  "できるまで数分〜十数分かかります。",
8097
8087
  ],
8098
8088
  { okLabel: "作る", okDanger: false, returnTo: btn },
@@ -8106,14 +8096,14 @@ ${calendarAddUrl.toString()}
8106
8096
 
8107
8097
  /** 断られた人に出す1行。**ボタンは出さない**(何度押しても同じ答えなので) */
8108
8098
  function calendarOwnerOnlyNote() {
8109
- return el("p", { class: "mt-cal-note", text: "案件のオーナーが作れます。" });
8099
+ return el("p", { class: "mt-cal-note", text: "プロジェクトのオーナーが作れます。" });
8110
8100
  }
8111
8101
 
8112
8102
  /** ポータル経由で開いていない人に出す1行。**直し方がオーナーに頼むのとは別** */
8113
8103
  function calendarPortalNote() {
8114
8104
  return el("p", {
8115
8105
  class: "mt-cal-note",
8116
- text: "案件カレンダーを作るには、ポータルからこの案件を開き直してください。",
8106
+ text: "プロジェクトカレンダーを作るには、ポータルから開き直してください。",
8117
8107
  });
8118
8108
  }
8119
8109
 
@@ -9726,7 +9716,7 @@ ${calendarAddUrl.toString()}
9726
9716
  // 変えるときは依頼キット(docs/google-chat-onboarding.md の B)とポリシー側も同時に
9727
9717
  var chatScope = adapter === "slack"
9728
9718
  ? ""
9729
- : " Cortex のアプリは、会話の読み取りと、通知先に設定したスペースへの確認・通知の投稿だけに使われます。読み取った会話は、本文そのものを保存するのではなく、決定事項・用語などの抽出結果として案件の記録に反映されます。";
9719
+ : " Cortex のアプリは、会話の読み取りと、通知先に設定したスペースへの確認・通知の投稿だけに使われます。読み取った会話は、本文そのものを保存するのではなく、決定事項・用語などの抽出結果としてプロジェクトの記録に反映されます。";
9730
9720
  m.modal.appendChild(el("p", { class: "modal-desc", text: "ここに並んでいる" + chatNoun + "は、例外なく全て毎晩の Gold 昇格が読み取り、Decision・用語集の材料になります。読み取りを止めるには「登録を解除」してください。" + chatScope }));
9731
9721
  } else if (cap === "開発") {
9732
9722
  m.modal.appendChild(el("p", { class: "modal-desc", text: "ここに並んでいるリポジトリの Issues を毎晩の Gold 昇格が読み取り、Decision・用語集の材料になります。読み取りをやめるには「登録から削除」してください。" }));
@@ -9990,7 +9980,7 @@ ${calendarAddUrl.toString()}
9990
9980
  var inactive = s.enabled === false && !capPending(s.kind);
9991
9981
  if (inactive) {
9992
9982
  // **灰色(.ds-inactive)だけにしない。** 注記が無いと、なぜ灰色なのかが読めない
9993
- col.appendChild(el("span", { class: "ds-inactive-note", text: "未使用(この案件では設定されていません)" }));
9983
+ col.appendChild(el("span", { class: "ds-inactive-note", text: "未使用(このプロジェクトでは設定されていません)" }));
9994
9984
  }
9995
9985
  // id は接続マップのノードclickの飛び先(アンカー)
9996
9986
  // **id は付けない。** #101 以前はこのカードが接続マップの飛び先だったが、
@@ -11607,7 +11597,7 @@ ${calendarAddUrl.toString()}
11607
11597
  if (route === null) return "設定を読み取れないため、いまは切り替えられません。";
11608
11598
  if (route !== "fixed-ip") {
11609
11599
  return count > 0
11610
- ? "Backlog の IP 制限で同期が失敗する案件は、これを入れてください。"
11600
+ ? "Backlog の IP 制限で同期が失敗する場合は、これを入れてください。"
11611
11601
  : "先に接続先を登録してください。";
11612
11602
  }
11613
11603
  var ipLabel = ip ? "固定の送信元 IP(" + ip + ")" : "固定の送信元 IP";
@@ -11808,9 +11798,9 @@ ${calendarAddUrl.toString()}
11808
11798
  * ----------------------------------------------------------------------- */
11809
11799
 
11810
11800
  /** リンクの title。案件リポジトリに入っていない人には開けないので、押す前に分かるようにする */
11811
- var RUN_LINK_TITLE = "GitHub Actions の実行ログを開きます(案件リポジトリへのアクセスが要ります)";
11801
+ var RUN_LINK_TITLE = "GitHub Actions の実行ログを開きます(プロジェクトリポジトリへのアクセスが要ります)";
11812
11802
  /** 一覧(開始直後・run の番号がまだ無い)の title。飛び先が違うので文言も分ける */
11813
- var RUN_LIST_TITLE = "GitHub Actions の実行の一覧を開きます(案件リポジトリへのアクセスが要ります)";
11803
+ var RUN_LIST_TITLE = "GitHub Actions の実行の一覧を開きます(プロジェクトリポジトリへのアクセスが要ります)";
11814
11804
  var RUN_LIST_TEXT = "実行の一覧 ↗";
11815
11805
 
11816
11806
  /** 「実行ログ ↗」(新しいタブ・title つき)。一覧のときは文言と title を一覧のものにする */
@@ -12660,7 +12650,7 @@ ${calendarAddUrl.toString()}
12660
12650
  // 手順一式を <details> に畳むので、**いちばん要る人に対して閉じている**
12661
12651
  hint: [
12662
12652
  "URL を貼ると同期先が増えます。ビューアからの起票先は変わりません(スペースごとに別のAPIキーが要ります)。",
12663
- "リアルタイム同期を使うなら、追加したプロジェクトにも案件専用URLの登録が要ります。",
12653
+ "リアルタイム同期を使うなら、追加した Backlog プロジェクトにも、このプロジェクト専用URLの登録が要ります(同じURLを使います)。",
12664
12654
  ],
12665
12655
  build: function (url) {
12666
12656
  return { op: "backlog-target-add", url: url, baseGeneration: targetsGenerationOf(targets) };
@@ -12734,7 +12724,7 @@ ${calendarAddUrl.toString()}
12734
12724
  // 読む人の操作対象ではない——画面から直せないものなので、次の一歩は「担当者へ連絡」。
12735
12725
  // 「手で直してください」も出さない(PM に設定ファイルを編集させる案内になっていた)。
12736
12726
  if (s.ingestState === "unset") {
12737
- box.appendChild(el("p", { class: "sec-how", text: "この案件では議事録の自動取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
12727
+ box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトでは議事録の自動取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
12738
12728
  used = true;
12739
12729
  } else if (s.ingestState === "broken") {
12740
12730
  box.appendChild(el("p", { class: "sec-how", text: "議事録の取り込み設定を読み取れないため、この画面からは変更できません。cortex の担当者にご連絡ください。" }));
@@ -12743,7 +12733,7 @@ ${calendarAddUrl.toString()}
12743
12733
  // 自動取り込みを止めている案件(例: Teams を使っていて手動で取り込む運用)。
12744
12734
  // ここでトグルを出すと「押せば始まる」と読めるが、実際は設定ファイルの意思表示なので
12745
12735
  // 画面から気軽に反転させるものではない。状態だけを伝える。
12746
- box.appendChild(el("p", { class: "sec-how", text: "この案件は議事録の自動取り込みを停止しています。" }));
12736
+ box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトは議事録の自動取り込みを停止しています。" }));
12747
12737
  used = true;
12748
12738
  }
12749
12739
  }
@@ -12806,7 +12796,7 @@ ${calendarAddUrl.toString()}
12806
12796
  // 状態の出どころは資料の取り込み設定(materials-config.json)だが、会議と同じく
12807
12797
  // 文面には出さない(2026-08-12 の文言原則)。画面から直せない状態の次の一歩は担当者への連絡。
12808
12798
  if (s.driveState === "unset") {
12809
- box.appendChild(el("p", { class: "sec-how", text: "この案件では共有資料の取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
12799
+ box.appendChild(el("p", { class: "sec-how", text: "このプロジェクトでは共有資料の取り込みがまだ用意されていません。cortex の担当者にご連絡ください。" }));
12810
12800
  used = true;
12811
12801
  } else if (s.driveState === "broken") {
12812
12802
  // 壊れていると書き込みも失敗する。フォームを出して押させない
@@ -13180,11 +13170,11 @@ ${calendarAddUrl.toString()}
13180
13170
  // **貼ったURLを本文に出す。** 「URLを確かめてください」と言うのに出ていなかった
13181
13171
  duplicateConfirmLines: function (value) {
13182
13172
  return [
13183
- "このチャンネルは、別の案件でも追加されています。",
13173
+ "このチャンネルは、別のプロジェクトでも追加されています。",
13184
13174
  "",
13185
- "このまま追加すると、同じ会話が両方の案件の Decision・用語集に出ます。",
13175
+ "このまま追加すると、同じ会話が両方のプロジェクトの Decision・用語集に出ます。",
13186
13176
  "",
13187
- "全体定例のように複数の案件に関係するチャンネルなら、これは正しい状態です。",
13177
+ "全体定例のように複数のプロジェクトに関係するチャンネルなら、これは正しい状態です。",
13188
13178
  "別のチャンネルと取り違えていないか、貼ったURLを確かめてください:",
13189
13179
  String(value || ""),
13190
13180
  "",
@@ -14669,7 +14659,7 @@ ${calendarAddUrl.toString()}
14669
14659
  var sec = el("section", { class: "about-cortex" });
14670
14660
  sec.appendChild(el("h2", { class: "section-title", text: "この仕組みについて" }));
14671
14661
  sec.appendChild(el("p", { class: "about-lead", text:
14672
- "議事録・課題・共有資料・デザイン・ソースコードといった案件の情報は、普段使っているツールに散らばっています。この仕組みはそれらを自動で集め、「あとで判断のよりどころになる確定した情報」だけを抽出した層を毎晩育てます。人もAIも、まずここを読めば案件を誤らずに把握できる、という状態を作るのが目的です。" }));
14662
+ "議事録・課題・共有資料・デザイン・ソースコードといったプロジェクトの情報は、普段使っているツールに散らばっています。この仕組みはそれらを自動で集め、「あとで判断のよりどころになる確定した情報」だけを抽出した層を毎晩育てます。人もAIも、まずここを読めばプロジェクトを誤らずに把握できる、という状態を作るのが目的です。" }));
14673
14663
 
14674
14664
  sec.appendChild(el("h3", { class: "about-sub", text: "情報の見方は2つあります" }));
14675
14665
  var ways = el("ul", { class: "about-list" });
@@ -14688,9 +14678,9 @@ ${calendarAddUrl.toString()}
14688
14678
  var what = el("ul", { class: "about-list" });
14689
14679
  [
14690
14680
  ["決定事項", "何が決まったか(1決定=1ページ)。議事録や課題から毎晩自動で追加されます"],
14691
- ["用語集", "この案件固有の言葉の意味。人とAIの語彙を揃えます"],
14681
+ ["用語集", "このプロジェクト固有の言葉の意味。人とAIの語彙を揃えます"],
14692
14682
  ["メンバー", "誰が関わっているか。人名の表記ゆれを解決する名簿でもあります"],
14693
- ["ルール", "この案件で継続的に守る約束事(例:「本番リリースは金曜禁止」)"],
14683
+ ["ルール", "このプロジェクトで継続的に守る約束事(例:「本番リリースは金曜禁止」)"],
14694
14684
  ].forEach(function (row) {
14695
14685
  what.appendChild(el("li", {}, [
14696
14686
  el("strong", { text: row[0] }),
@@ -14799,7 +14789,7 @@ ${calendarAddUrl.toString()}
14799
14789
  var steps = [
14800
14790
  el("ol", { class: "rt-steps" }, [
14801
14791
  el("li", { text: "Backlog のプロジェクト設定 → インテグレーション → Webhook を開く" }),
14802
- el("li", { text: "「WebHook URL」に下の案件専用URLを貼り付ける" }),
14792
+ el("li", { text: "「WebHook URL」に、下の(このプロジェクト専用の)URL を貼り付ける" }),
14803
14793
  // **チェック名は受信側が処理する10種を全部並べる。** 「等」で省くと、担当者は
14804
14794
  // 課題の3つだけにチェックして「設定した」と思い、Wikiとドキュメントの更新は
14805
14795
  // 夜間まで届かない(画面は稼働中と出るので、欠けていることに気づけない)。
@@ -14818,7 +14808,7 @@ ${calendarAddUrl.toString()}
14818
14808
  el("div", { class: "rt-url-row" }, [field, copyBtn]),
14819
14809
  msg,
14820
14810
  // **この画面は顧客も見る。** URLに秘密が入っていることと、その扱いを書いておく
14821
- el("p", { class: "sec-note", text: "このURLはこの案件専用です(他の案件には届きません)。秘密のトークンを含むので、貼り付け先は Backlog のこのプロジェクトの設定欄だけにしてください。" }),
14811
+ el("p", { class: "sec-note", text: "このURLはこのプロジェクト専用です(他のプロジェクトには届きません)。秘密のトークンを含むので、貼り付け先は、いま設定している Backlog プロジェクトの設定欄だけにしてください。" }),
14822
14812
  // 固定 IP 経由の案件は反映が「約1分」にならない(1分のまとめ+固定 IP の同期の起動で数分)。
14823
14813
  // **同じ行を差し替える**——2 行に分けると「約1分」と「数分」が並んで矛盾する
14824
14814
  el("p", { class: "sec-how", text: viaFixedIp
@@ -14830,7 +14820,7 @@ ${calendarAddUrl.toString()}
14830
14820
  // 稼働中。**先頭は状態、手順は畳む。**「畳んである中に何があるか」を summary に書く
14831
14821
  // ——ただの「詳細」だと、URLを張り替えたい人がここを開く手掛かりを持てない
14832
14822
  var det = el("details", { class: "rt-steps-fold" }, [
14833
- el("summary", { text: "設定手順と案件専用URLを表示(URLの再確認・張り替え用)" }),
14823
+ el("summary", { text: "設定手順とプロジェクト専用URLを表示(URLの再確認・張り替え用)" }),
14834
14824
  ]);
14835
14825
  for (var i = 0; i < steps.length; i++) det.appendChild(steps[i]);
14836
14826
  // 接続先ごとに1行。**1件のときはプロジェクトキーを出さない**——どれのことかは
@@ -14962,7 +14952,7 @@ ${calendarAddUrl.toString()}
14962
14952
  "backlog": {
14963
14953
  icon: "📋",
14964
14954
  title: "Backlog のAPIキー",
14965
- how: "Backlog → 個人設定 → API で発行(この案件のプロジェクトが見えるアカウントで)",
14955
+ how: "Backlog → 個人設定 → API で発行(同期先の Backlog プロジェクトが見えるアカウントで)",
14966
14956
  // ⚠ **desc は足さない。** 「毎晩同期するために使います」の 1 行は「カードが長すぎる」で
14967
14957
  // 外した経緯があり、secret-card-guidance.test.mjs が空の段落ごと見張っている。
14968
14958
  // 用途の説明を鍵カードに足さないのは #610 でも同じ判断(2026-09-15)
@@ -14974,7 +14964,7 @@ ${calendarAddUrl.toString()}
14974
14964
  // 次の人が入れ直せば済む**話で、誰か1人に依存し続けるより回復しやすい。
14975
14965
  selfServe: {
14976
14966
  text:
14977
- "この案件を担当しているあなたのアカウントで発行して、ここに貼ってください。" +
14967
+ "このプロジェクトを担当しているあなたのアカウントで発行して、ここに貼ってください。" +
14978
14968
  "管理者への依頼は要りません。",
14979
14969
  note:
14980
14970
  "担当が変わったら、新しい担当者が同じ手順で入れ直してください" +
@@ -15222,7 +15212,7 @@ ${calendarAddUrl.toString()}
15222
15212
  // #101 でカードだけがモーダルへ移り、説明だけが画面から消えた。
15223
15213
  // 顧客にトークンの貼り付けを求める画面で、貼った値がどう扱われるかの
15224
15214
  // 説明が落ちるのは、いちばん落としてはいけない種類の欠落
15225
- el("p", { class: "sec-note", text: "入れた値はここには表示されません(保存だけできます)。保存先は案件ごとに分かれているので、他の案件には影響しません。" }),
15215
+ el("p", { class: "sec-note", text: "入れた値はここには表示されません(保存だけできます)。保存先はプロジェクトごとに分かれているので、他のプロジェクトには影響しません。" }),
15226
15216
  ]);
15227
15217
  // **作った鍵カードは1枚残らずここに載せる。** 出し入れ(接続先が0件のときに畳む)は
15228
15218
  // DOM 検索ではなくこの控えで回す——カードは能力モーダルの中身で、タイルを押すまで
@@ -15955,14 +15945,9 @@ ${calendarAddUrl.toString()}
15955
15945
 
15956
15946
  // ---------- Decisions一覧(フィルタ付き) ----------
15957
15947
  function renderDecisionList() {
15958
- // 既存案件・移行案件は導入前/移行前の意思決定が揃わないため、その旨を最初に注記する
15959
- var ai = homeAdoption();
15960
- if (ai && ai.note) {
15961
- app.appendChild(el("div", { class: "adoption-note" }, [
15962
- el("span", { text: "ℹ️" }),
15963
- el("span", { text: ai.note }),
15964
- ]));
15965
- }
15948
+ // 導入経緯(existing/migration)の注記はここに出さない。「AIS導入前の意思決定は
15949
+ // 残っていない場合があります」の帯は、オーナー決定(#626)で撤去した——帯には
15950
+ // その区画が何かだけを書く
15966
15951
  var filters = el("div", { class: "filters" });
15967
15952
  var search = el("input", { type: "search", placeholder: "キーワード検索(タイトル・要約・本文)" });
15968
15953
  search.value = listState.q;
@@ -17763,7 +17748,7 @@ ${calendarAddUrl.toString()}
17763
17748
  var a = document.getElementById("home-link");
17764
17749
  if (!a || !/^\\/p\\/[^/]+\\//.test(location.pathname)) return;
17765
17750
  a.setAttribute("href", "/");
17766
- a.setAttribute("title", "案件一覧へ");
17751
+ a.setAttribute("title", "プロジェクト一覧へ");
17767
17752
  a.classList.add("site-title-portal");
17768
17753
  })();
17769
17754
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.65",
3
+ "version": "0.12.67",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,