@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.
Files changed (2) hide show
  1. package/dist/render.js +26 -21
  2. 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
- // チュートリアル(「はじめに」タブ)。ボタンURLは既存の codeUrl を流用し、案件データ由来の値だけビルド時に埋める
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: "このプロジェクトの主要なドメイン概念(用語集)と、それらの関係性を mermaid 図で可視化してください。",
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
- // 「はじめに」タブのチュートリアルデータ(ビルド時に埋め込み。ボタンURL・チャレンジ4の決定は解決済み)
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
- // タブ: はじめに → ホーム → Decisions → records/ を持つ各ディレクトリ(自動発見)
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
- // 既定の着地タブ: 「はじめに」はタブ列の先頭に置くが、初回着地は Home にする
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
- function renderTutorial() {
937
- countEl.textContent = "";
938
- var challenges = TUTORIAL.challenges || [];
939
- app.appendChild(el("p", { class: "tut-intro", text: "AIS Viewer と Claude Code を使ってこのプロジェクトを掴むための5ステップです。各ボタンを押すと、質問が入力済みの状態で Claude Code Web が開きます(このリポジトリへのアクセス権が必要です)。" }));
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
- var head = el("div", { class: "tut-head" }, [progText, bar, celebrate]);
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
- app.appendChild(list);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.4.28",
3
+ "version": "0.4.30",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,