@takagaki/cortex-decisions-viewer 0.4.28 → 0.4.30
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 +26 -21
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -19,7 +19,7 @@ function renderSite(site) {
|
|
|
19
19
|
const safeTitle = escapeHtml(site.title);
|
|
20
20
|
// 接続マップ(操作タブ最上部のSVG図)。ビルド時に生成し<template>で埋め込む。fleet情報が無ければ出さない
|
|
21
21
|
const connMap = renderConnectionMap(site);
|
|
22
|
-
//
|
|
22
|
+
// チュートリアル(Homeタブ下部の「はじめに」セクション)。ボタンURLは既存の codeUrl を流用し、案件データ由来の値だけビルド時に埋める
|
|
23
23
|
const tutorialJson = JSON.stringify(buildTutorialData(site, codeUrl, repoSlug)).replace(/</g, "\\u003c");
|
|
24
24
|
const githubBtn = site.repoBaseUrl
|
|
25
25
|
? `<a class="gh-btn" href="${escapeHtml(site.repoBaseUrl)}" target="_blank" rel="noopener" title="コンテキストリポジトリをGitHubで開く">${GITHUB_ICON}</a>`
|
|
@@ -164,7 +164,7 @@ function renderConnectionMap(site) {
|
|
|
164
164
|
`</svg>`);
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
167
|
-
*
|
|
167
|
+
* 「はじめに」セクション(Homeタブ下部)のチュートリアルデータをビルド時に生成する。
|
|
168
168
|
* 各チャレンジのプロンプトは固定文(ビューアコードに実案件名は残さない)。
|
|
169
169
|
* チャレンジ4だけは site.decisions から根拠付きの最新決定を選び、そのtitle/idを埋め込む。
|
|
170
170
|
*/
|
|
@@ -184,7 +184,7 @@ function buildTutorialData(site, codeUrl, repoSlug) {
|
|
|
184
184
|
{
|
|
185
185
|
title: "ドメインを可視化する",
|
|
186
186
|
desc: "案件の概念と関係を図にする",
|
|
187
|
-
prompt: "
|
|
187
|
+
prompt: "このプロジェクトの主要なドメイン概念(用語集)と、それらの関係性を、ノードと矢印で表した図として可視化してください。mermaid のコードではなく、ブラウザでそのまま絵として見られる単一の HTML ファイル(インライン SVG と CSS)で出力し、パスを教えてください。",
|
|
188
188
|
},
|
|
189
189
|
{
|
|
190
190
|
title: "決定の経緯を辿る",
|
|
@@ -492,7 +492,9 @@ a:hover { text-decoration: underline; }
|
|
|
492
492
|
}
|
|
493
493
|
.edit-btn:hover { border-color: var(--accent); color: var(--accent); text-decoration: none; }
|
|
494
494
|
.section-label { font-size: 12px; font-weight: 700; color: var(--muted); letter-spacing: .04em; text-transform: uppercase; margin: 24px 0 8px; }
|
|
495
|
-
/* ----
|
|
495
|
+
/* ---- はじめに(チュートリアル・Homeタブ下部) ---- */
|
|
496
|
+
.tut-section { margin-top: 34px; padding-top: 22px; border-top: 1px solid var(--border); }
|
|
497
|
+
.tut-section-head { font-size: 18px; font-weight: 700; color: var(--text); margin: 0 0 4px; }
|
|
496
498
|
.tut-intro { color: var(--muted); font-size: 14px; line-height: 1.8; margin: 2px 0 6px; }
|
|
497
499
|
.tut-head { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 14px; margin: 8px 0 16px; }
|
|
498
500
|
.tut-progress { font-size: 13px; font-weight: 700; color: var(--text); }
|
|
@@ -705,7 +707,7 @@ button.ops-card-btn:disabled { opacity: .6; cursor: default; }
|
|
|
705
707
|
const CLIENT_JS = `
|
|
706
708
|
(function () {
|
|
707
709
|
var SITE = JSON.parse(document.getElementById("site-data").textContent);
|
|
708
|
-
//
|
|
710
|
+
// 「はじめに」セクションのチュートリアルデータ(ビルド時に埋め込み。ボタンURL・チャレンジ4の決定は解決済み)
|
|
709
711
|
var TUTORIAL = (function () {
|
|
710
712
|
var elx = document.getElementById("tutorial-data");
|
|
711
713
|
try { return elx ? JSON.parse(elx.textContent) : null; } catch (e) { return null; }
|
|
@@ -735,10 +737,9 @@ const CLIENT_JS = `
|
|
|
735
737
|
// 本文は bodies/<i>.html に外出しされ詳細表示時に fetch されるため、linkify は loadBody 側で適用する
|
|
736
738
|
// (ここで inline bodyHtml に適用すると検索テキストにHTMLが混ざるため適用しない)。
|
|
737
739
|
|
|
738
|
-
// タブ:
|
|
740
|
+
// タブ: ホーム → Decisions → records/ を持つ各ディレクトリ(自動発見)
|
|
741
|
+
// オンボーディングのチュートリアル(5チャレンジ)は独立タブを廃止し、Homeタブ下部に統合した
|
|
739
742
|
var TABS = [];
|
|
740
|
-
// 新メンバー向けオンボーディング。最初に目に入るようタブ列の先頭に置く
|
|
741
|
-
if (TUTORIAL && TUTORIAL.challenges && TUTORIAL.challenges.length) TABS.push({ key: "tutorial", label: "はじめに" });
|
|
742
743
|
if (SITE.home) TABS.push({ key: "home", label: "Home" });
|
|
743
744
|
TABS.push({ key: "decisions", label: "Decisions", items: SITE.decisions });
|
|
744
745
|
(SITE.sections || []).forEach(function (sec) {
|
|
@@ -755,8 +756,7 @@ const CLIENT_JS = `
|
|
|
755
756
|
TABS.push({ key: "ops", label: "操作" });
|
|
756
757
|
}
|
|
757
758
|
|
|
758
|
-
// 既定の着地タブ:
|
|
759
|
-
// (毎回開く顧客・リピーターに自然。新規は先頭タブで気づける)。home が無い案件は先頭タブに着地。
|
|
759
|
+
// 既定の着地タブ: home がある案件は Home、無ければ先頭タブ。
|
|
760
760
|
// URLに ?tab= があれば route() がそれを優先するので直リンクは不変。
|
|
761
761
|
var DEFAULT_TAB = SITE.home ? "home" : TABS[0].key;
|
|
762
762
|
|
|
@@ -902,7 +902,6 @@ const CLIENT_JS = `
|
|
|
902
902
|
renderTabs();
|
|
903
903
|
renderInfoBar();
|
|
904
904
|
|
|
905
|
-
if (listState.tab === "tutorial") { renderTutorial(); return; }
|
|
906
905
|
if (listState.tab === "home") { renderHome(); return; }
|
|
907
906
|
if (listState.tab === "decisions") { renderDecisionList(); return; }
|
|
908
907
|
if (listState.tab === "graph") { renderKnowledge(); return; }
|
|
@@ -924,19 +923,23 @@ const CLIENT_JS = `
|
|
|
924
923
|
return SITE.home && SITE.home.fm ? adoptionInfo(SITE.home.fm.adoption) : null;
|
|
925
924
|
}
|
|
926
925
|
|
|
927
|
-
// ----------
|
|
926
|
+
// ---------- はじめに(チュートリアル・Homeタブ下部に統合) ----------
|
|
928
927
|
// localStorageキーは案件別(repoSlug)。同一ブラウザで複数案件のビューアを見ても混ざらない
|
|
929
|
-
function tutStoreKey(n) { return "cortex-tutorial-done:" + (TUTORIAL.slug || "") + ":" + n; }
|
|
928
|
+
function tutStoreKey(n) { return "cortex-tutorial-done:" + ((TUTORIAL && TUTORIAL.slug) || "") + ":" + n; }
|
|
930
929
|
function tutIsDone(n) {
|
|
931
930
|
try { return localStorage.getItem(tutStoreKey(n)) === "1"; } catch (e) { return false; }
|
|
932
931
|
}
|
|
933
932
|
function tutSetDone(n, done) {
|
|
934
933
|
try { if (done) localStorage.setItem(tutStoreKey(n), "1"); else localStorage.removeItem(tutStoreKey(n)); } catch (e) {}
|
|
935
934
|
}
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
var challenges = TUTORIAL.challenges || [];
|
|
939
|
-
|
|
935
|
+
// Homeの本文の下に差し込むチュートリアルセクション(見出し+進捗+5チャレンジカード)
|
|
936
|
+
function renderTutorialSection() {
|
|
937
|
+
var challenges = (TUTORIAL && TUTORIAL.challenges) || [];
|
|
938
|
+
if (!challenges.length) return; // 最小データ(チュートリアル無し)では出さない
|
|
939
|
+
|
|
940
|
+
var sec = el("section", { class: "tut-section" });
|
|
941
|
+
sec.appendChild(el("h2", { class: "tut-section-head", text: "はじめに — このプロジェクトを掴む5ステップ" }));
|
|
942
|
+
sec.appendChild(el("p", { class: "tut-intro", text: "AIS Viewer と Claude Code を使ってこのプロジェクトを掴むための5ステップです。各ボタンを押すと、質問が入力済みの状態で Claude Code Web が開きます(このリポジトリへのアクセス権が必要です)。" }));
|
|
940
943
|
|
|
941
944
|
// 進捗ヘッダ({完了数}/5・バー・全完了で祝福)
|
|
942
945
|
var doneCount = challenges.filter(function (c) { return tutIsDone(c.n); }).length;
|
|
@@ -946,8 +949,7 @@ const CLIENT_JS = `
|
|
|
946
949
|
var bar = el("div", { class: "tut-progress-bar" }, [fill]);
|
|
947
950
|
var celebrate = el("span", { class: "tut-celebrate" });
|
|
948
951
|
if (doneCount === challenges.length && challenges.length) celebrate.textContent = "🎉 全ステップ達成!オンボーディング完了です。";
|
|
949
|
-
|
|
950
|
-
app.appendChild(head);
|
|
952
|
+
sec.appendChild(el("div", { class: "tut-head" }, [progText, bar, celebrate]));
|
|
951
953
|
|
|
952
954
|
var list = el("div", { class: "tut-list" });
|
|
953
955
|
challenges.forEach(function (c) {
|
|
@@ -959,7 +961,7 @@ const CLIENT_JS = `
|
|
|
959
961
|
var check = el("label", { class: "tut-check" }, [cb, el("span", { text: "完了" })]);
|
|
960
962
|
cb.addEventListener("change", function () {
|
|
961
963
|
tutSetDone(c.n, cb.checked);
|
|
962
|
-
//
|
|
964
|
+
// 進捗・祝福・カードの見た目を即時更新(Homeを再描画して反映)
|
|
963
965
|
renderList();
|
|
964
966
|
});
|
|
965
967
|
card.appendChild(el("div", { class: "tut-num", text: String(c.n) }));
|
|
@@ -970,7 +972,8 @@ const CLIENT_JS = `
|
|
|
970
972
|
]));
|
|
971
973
|
list.appendChild(card);
|
|
972
974
|
});
|
|
973
|
-
|
|
975
|
+
sec.appendChild(list);
|
|
976
|
+
app.appendChild(sec);
|
|
974
977
|
}
|
|
975
978
|
|
|
976
979
|
// ---------- ホーム(着地画面: Markdownをそのまま表示) ----------
|
|
@@ -989,6 +992,8 @@ const CLIENT_JS = `
|
|
|
989
992
|
var homeBody = el("div", { class: "body" });
|
|
990
993
|
app.appendChild(homeBody);
|
|
991
994
|
loadBody(h, homeBody);
|
|
995
|
+
// Markdown本文の下にオンボーディングのチュートリアルを差し込む
|
|
996
|
+
renderTutorialSection();
|
|
992
997
|
}
|
|
993
998
|
|
|
994
999
|
// ---------- データソースと自動化(fleet-status.json 由来。無ければ非表示) ----------
|
package/package.json
CHANGED