@takagaki/cortex-decisions-viewer 0.4.9 → 0.4.11
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/render.js +64 -2
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -4,11 +4,29 @@ exports.renderSite = renderSite;
|
|
|
4
4
|
/** SiteDataを単一の自己完結HTML(埋め込みデータ+CSS+JS)にレンダリングする */
|
|
5
5
|
function renderSite(site) {
|
|
6
6
|
// </script> によるブレイクアウトを防ぐため < をエスケープして埋め込む
|
|
7
|
+
// Claude Code Web ディープリンク(この案件リポ+狙ったプロンプトで開く)。repoBaseUrl から slug を導出(追加入力なし)。
|
|
8
|
+
const repoSlug = site.repoBaseUrl
|
|
9
|
+
? site.repoBaseUrl
|
|
10
|
+
.replace(/^https?:\/\/github\.com\//, "")
|
|
11
|
+
.replace(/\.git$/, "")
|
|
12
|
+
: "";
|
|
13
|
+
const codeUrl = (prompt) => repoSlug
|
|
14
|
+
? `https://claude.ai/code?repo=${repoSlug}&prompt=${encodeURIComponent(prompt)}`
|
|
15
|
+
: "https://claude.ai/code/";
|
|
16
|
+
const askUrl = codeUrl("このプロジェクトの概要について教えてください。");
|
|
17
|
+
// 「操作」タブの取り込みアクション。repo が解決できた案件だけ出す(リポ書き込み権を持つ人=CM社員や招待済み顧客が使える)。
|
|
18
|
+
if (repoSlug) {
|
|
19
|
+
site.intake = {
|
|
20
|
+
transcript: codeUrl("会議の文字起こしを取り込みます。まず 会議/README.md(無ければ MTG/README.md 等の会議ディレクトリのREADME)と 会議/templates/minute-template.md を読んでください。次のメッセージで、ダウンロードした文字起こしファイル(.txt / .docx 等)を添付するので、その内容を読み、テンプレートの様式に従って議事録を生成し、文字起こし原本と議事録を会議ディレクトリの規約どおりの場所にコミットしてください。/post-meeting や /create-minute スラッシュコマンドが使えるならそれを使ってよいですが、使えなくても手動で作成して構いません。議事録に frontmatter は付けないでください。"),
|
|
21
|
+
material: codeUrl("共有資料を取り込みます。まず 共有資料/README.md を読んでください。次のメッセージで資料(テキストまたはファイル)を渡すので、それを Markdown 化して 共有資料/{資料名}/{資料名}.md に配置し、元ファイルも同じディレクトリに残してコミットしてください(PDF・PPT は中身を読み、図表も文章で説明して Markdown 化する)。/sync-materials スラッシュコマンドが使えるならそれを使ってよいですが、使えなくても手動で構いません。frontmatter は付けないでください。"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
7
24
|
const dataJson = JSON.stringify(site).replace(/</g, "\\u003c");
|
|
8
25
|
const safeTitle = escapeHtml(site.title);
|
|
9
26
|
const githubBtn = site.repoBaseUrl
|
|
10
27
|
? `<a class="gh-btn" href="${escapeHtml(site.repoBaseUrl)}" target="_blank" rel="noopener" title="コンテキストリポジトリをGitHubで開く">${GITHUB_ICON}</a>`
|
|
11
28
|
: "";
|
|
29
|
+
const askBtn = `<a class="ask-ai-btn" href="${escapeHtml(askUrl)}" target="_blank" rel="noopener" title="Claude Code Web でこの案件のリポジトリを開き、プロジェクトについて質問・調査できます">💬 プロジェクトについてAIに聞く</a>`;
|
|
12
30
|
return `<!DOCTYPE html>
|
|
13
31
|
<html lang="ja">
|
|
14
32
|
<head>
|
|
@@ -25,8 +43,7 @@ function renderSite(site) {
|
|
|
25
43
|
<header class="site-header">
|
|
26
44
|
<div class="header-inner">
|
|
27
45
|
<a class="site-title" href="?" id="home-link">${safeTitle}</a>
|
|
28
|
-
|
|
29
|
-
title="Claude Codeでこのプロジェクトのリポジトリを選択すると、全コンテキストに対してAIに質問・調査ができます">💬 プロジェクトについてAIに聞く</a>
|
|
46
|
+
${askBtn}
|
|
30
47
|
${githubBtn}
|
|
31
48
|
</div>
|
|
32
49
|
</header>
|
|
@@ -313,6 +330,23 @@ a:hover { text-decoration: underline; }
|
|
|
313
330
|
}
|
|
314
331
|
.edit-btn:hover { border-color: var(--accent); color: var(--accent); text-decoration: none; }
|
|
315
332
|
.section-label { font-size: 12px; font-weight: 700; color: var(--muted); letter-spacing: .04em; text-transform: uppercase; margin: 24px 0 8px; }
|
|
333
|
+
/* ---- 操作タブ ---- */
|
|
334
|
+
.ops-intro { color: var(--muted); font-size: 14px; line-height: 1.8; margin: 4px 0 8px; }
|
|
335
|
+
.ops-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 14px; }
|
|
336
|
+
.ops-card {
|
|
337
|
+
background: var(--surface); border: 1px solid var(--border); border-radius: 12px;
|
|
338
|
+
padding: 18px; box-shadow: var(--shadow); display: flex; flex-direction: column; gap: 10px;
|
|
339
|
+
}
|
|
340
|
+
.ops-card-head { display: flex; align-items: center; gap: 10px; }
|
|
341
|
+
.ops-card-icon { font-size: 22px; line-height: 1; }
|
|
342
|
+
.ops-card-title { font-size: 15px; font-weight: 700; color: var(--text); margin: 0; }
|
|
343
|
+
.ops-card-desc { color: var(--muted); font-size: 13px; line-height: 1.7; margin: 0; flex: 1 1 auto; }
|
|
344
|
+
.ops-card-btn {
|
|
345
|
+
align-self: flex-start; display: inline-flex; align-items: center; gap: 4px;
|
|
346
|
+
padding: 8px 16px; border-radius: 999px; border: 1px solid var(--accent);
|
|
347
|
+
background: var(--accent); color: #fff; font-size: 13px; font-weight: 600;
|
|
348
|
+
}
|
|
349
|
+
.ops-card-btn:hover { background: #1d4ed8; text-decoration: none; }
|
|
316
350
|
.summary-box { background: var(--accent-weak); border: 1px solid #dce6fb; border-radius: var(--radius); padding: 12px 16px; color: #1e3a8a; }
|
|
317
351
|
.deciders { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
318
352
|
.refs { margin: 0; padding-left: 18px; }
|
|
@@ -380,6 +414,10 @@ const CLIENT_JS = `
|
|
|
380
414
|
if (SITE.graph && SITE.graph.nodes.length > 0) {
|
|
381
415
|
TABS.push({ key: "graph", label: "ナレッジグラフ" });
|
|
382
416
|
}
|
|
417
|
+
// Cortex自体を操作するアクションの受け皿(取り込み等)。今後この種の機能が増えたらここに集約する。
|
|
418
|
+
if (SITE.intake) {
|
|
419
|
+
TABS.push({ key: "ops", label: "操作" });
|
|
420
|
+
}
|
|
383
421
|
|
|
384
422
|
var app = document.getElementById("app");
|
|
385
423
|
// ウィキリンク(本文中の [[用語]])クリックでSPA内遷移する
|
|
@@ -526,6 +564,7 @@ const CLIENT_JS = `
|
|
|
526
564
|
if (listState.tab === "home") { renderHome(); return; }
|
|
527
565
|
if (listState.tab === "decisions") { renderDecisionList(); return; }
|
|
528
566
|
if (listState.tab === "graph") { renderKnowledge(); return; }
|
|
567
|
+
if (listState.tab === "ops") { renderOps(); return; }
|
|
529
568
|
renderGenericList();
|
|
530
569
|
}
|
|
531
570
|
|
|
@@ -561,6 +600,29 @@ const CLIENT_JS = `
|
|
|
561
600
|
loadBody(h, homeBody);
|
|
562
601
|
}
|
|
563
602
|
|
|
603
|
+
// ---------- 操作タブ(Cortex自体への操作。まずは取り込み。今後この受け皿に機能を足す) ----------
|
|
604
|
+
function renderOps() {
|
|
605
|
+
var intake = SITE.intake;
|
|
606
|
+
app.appendChild(el("p", { class: "ops-intro", text: "Cortex にコンテキストを取り込む操作です。ボタンを押すと Claude Code Web がこの案件のリポジトリで開くので、内容を貼る/渡すと議事録化・Markdown化してコミットまで行います。" }));
|
|
607
|
+
app.appendChild(el("div", { class: "section-label", text: "取り込み" }));
|
|
608
|
+
var grid = el("div", { class: "ops-grid" });
|
|
609
|
+
if (intake) {
|
|
610
|
+
grid.appendChild(opsCard("🗒️", "会議の文字起こしを追加", "顧客主催の会議など、自動取り込みできない会議の文字起こしファイル(.txt / .docx 等)を添付して議事録を生成します。", intake.transcript, "文字起こしを追加"));
|
|
611
|
+
grid.appendChild(opsCard("📎", "共有資料を追加", "提案書・仕様書・議事メモなどの資料を渡して Markdown 化し、共有資料に取り込みます。", intake.material, "資料を追加"));
|
|
612
|
+
}
|
|
613
|
+
app.appendChild(grid);
|
|
614
|
+
}
|
|
615
|
+
function opsCard(icon, title, desc, url, btnLabel) {
|
|
616
|
+
return el("div", { class: "ops-card" }, [
|
|
617
|
+
el("div", { class: "ops-card-head" }, [
|
|
618
|
+
el("span", { class: "ops-card-icon", text: icon }),
|
|
619
|
+
el("h3", { class: "ops-card-title", text: title }),
|
|
620
|
+
]),
|
|
621
|
+
el("p", { class: "ops-card-desc", text: desc }),
|
|
622
|
+
el("a", { class: "ops-card-btn", href: url, target: "_blank", rel: "noopener", text: "+ " + btnLabel }),
|
|
623
|
+
]);
|
|
624
|
+
}
|
|
625
|
+
|
|
564
626
|
// ---------- Decisions一覧(フィルタ付き) ----------
|
|
565
627
|
function renderDecisionList() {
|
|
566
628
|
// 既存案件・移行案件は導入前/移行前の意思決定が揃わないため、その旨を最初に注記する
|