@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 +21 -5
- package/dist/render.js +66 -81
- package/package.json +1 -1
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
|
-
|
|
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
|
-
//
|
|
834
|
-
// **どちらの節も無ければ未記入。**
|
|
835
|
-
const checkHeadings = hasNew ?
|
|
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
|
|
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
|
|
3684
|
+
"Cortex のチュートリアルを完了したことを、このプロジェクトの Slack チャンネルに投稿してください。最後のステップです。",
|
|
3685
3685
|
"",
|
|
3686
3686
|
"1. チャット/channels.json を読んで投稿先のチャンネルを選ぶ(複数あれば description を見て判断し、迷ったらわたしに聞く)",
|
|
3687
3687
|
"2. 次の雛形で本文を作る({名前} は Cortex/Members/records/ にあるわたしのレコードの表記に合わせる)",
|
|
3688
3688
|
"",
|
|
3689
3689
|
"🎉 {名前} さんが Cortex のチュートリアルを完了しました",
|
|
3690
|
-
"できるようになったこと: Gold
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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: "
|
|
6204
|
+
text: "このプロジェクトで使う言葉の意味をそろえる辞書です。人によって呼び方が分かれる言葉や、このプロジェクトだけの用語を載せます。",
|
|
6210
6205
|
btnLabel: "実行履歴を確認 →",
|
|
6211
6206
|
btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
|
|
6212
6207
|
},
|
|
6213
6208
|
"dir:Members": {
|
|
6214
|
-
text: "
|
|
6209
|
+
text: "このプロジェクトに関わる人の名簿です。役割と所属を持ち、資料ごとに違う表記(漢字・ローマ字など)を同じ人として結び付けます。",
|
|
6215
6210
|
btnLabel: "実行履歴を確認 →",
|
|
6216
6211
|
btnUrl: base ? base + "/actions/workflows/update-gold.yml" : null,
|
|
6217
6212
|
},
|
|
6218
6213
|
"dir:Rules": {
|
|
6219
|
-
text: "
|
|
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)の表示情報。
|
|
6251
|
+
// 導入経緯(overview.adoption)の表示情報。Home見出し横のチップに出すラベルだけを返す。
|
|
6257
6252
|
function adoptionInfo(v) {
|
|
6258
|
-
//
|
|
6259
|
-
|
|
6260
|
-
if (v === "
|
|
6261
|
-
if (v === "
|
|
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
|
-
"
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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("
|
|
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
|
-
"
|
|
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: "
|
|
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: "
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
["用語集", "
|
|
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
|
|
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
|
|
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: "
|
|
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
|
-
|
|
15960
|
-
|
|
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