`; document.body.appendChild(el); return el; } const bubble = ensureBubble(); const elH = bubble.querySelector("#tt-title"); const elB = bubble.querySelector("#tt-body"); const elClose = bubble.querySelector(".tt-close"); // ---------------- Parse [[term|heading|body]] anywhere ---------------- const TOKEN_RE = /\[\[([^|\]]+)\|([^|\]]+)\|([^\]]+)\]\]/g; const BLOCK_SKIP = new Set(["SCRIPT","STYLE","NOSCRIPT","TEXTAREA","INPUT","SELECT","CODE","PRE","TEMPLATE","IFRAME"]); function shouldSkipTextNode(n){ let el = n.parentElement; while (el){ if (BLOCK_SKIP.has(el.tagName) || el.isContentEditable) return true; el = el.parentElement; } return false; } const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT); const textNodes = []; while (walker.nextNode()){ const n = walker.currentNode; if (!n.nodeValue || shouldSkipTextNode(n)) continue; if (TOKEN_RE.test(n.nodeValue)) textNodes.push(n); TOKEN_RE.lastIndex = 0; } textNodes.forEach(node => { const frag = document.createDocumentFragment(); const insideLink = !!node.parentElement.closest("a"); let text = node.nodeValue, last = 0; TOKEN_RE.lastIndex = 0; let m; while ((m = TOKEN_RE.exec(text))){ if (m.index > last) frag.appendChild(document.createTextNode(text.slice(last, m.index))); const term=m[1].trim(), heading=m[2].trim(), body=m[3].trim(); const t = insideLink ? document.createElement("span") : document.createElement("button"); if (insideLink){ t.setAttribute("role","button"); t.setAttribute("tabindex","0"); } else { t.type="button"; } t.className="tt-trigger"; t.textContent=term; t.setAttribute("data-tt-h", heading); t.setAttribute("data-tt-b", body); t.setAttribute("aria-haspopup","dialog"); t.setAttribute("aria-expanded","false"); frag.appendChild(t); last = TOKEN_RE.lastIndex; } if (last = 2) return el; el = el.parentElement; } // Fallback: nearest non-inline container el = trigger.parentElement || document.body; while (el && el !== document.body){ const d = getComputedStyle(el).display; if (d !== "inline" && d !== "contents") return el; el = el.parentElement; } return document.body; } // Utility: child of `ancestor` that contains `target` (direct child) function directChildContaining(ancestor, target){ for (const ch of ancestor.children){ if (ch === target || ch.contains(target)) return ch; } return null; } function getElementTarget(e) { // If target is already an Element, use it if (e.target instanceof Element) return e.target; // Otherwise, walk the composed/path for the first Element const path = (typeof e.composedPath === 'function') ? e.composedPath() : []; for (const n of path) if (n instanceof Element) return n; return null; } // ---------------- Dim everything except the trigger branch (sibling branches only) ---------------- function dimAllOtherBranches(container, trigger){ undim(); // clear previous const dimEls = []; const wrappedTexts = []; const pathEls = []; // Build ELEMENT-only path [container -> ... -> trigger] const path = []; for (let el = trigger; el && el !== container; el = el.parentElement) path.push(el); path.push(container); path.reverse(); // At each ancestor level, find the *direct* child that leads to the trigger for (let i = 0; i { if (node.nodeType !== 3) return; // text only if (!node.nodeValue || !node.nodeValue.trim()) return; // If this text node sits inside branchChild, skip if (branchChild && branchChild.contains && branchChild.contains(node)) return; const span = document.createElement("span"); span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = String(DIM_OPACITY); span.textContent = node.nodeValue; node.parentNode.replaceChild(span, node); wrappedTexts.push(span); }); // Keep a reference to the path elements (so we can explicitly restore opacity if needed) if (anc && anc.nodeType === 1) pathEls.push(anc); } // Hard-guard: explicitly set opacity:1 on the entire path to neutralize any inherited fade pathEls.forEach(el => { el.style.opacity = "1"; }); dimCtx = { container, dimEls, wrappedTexts, pathEls }; } function undim(){ if (!dimCtx) return; const { dimEls, wrappedTexts, pathEls } = dimCtx; // Animate back dimEls.forEach(el => { el.style.transition = `opacity ${DIM_EASE_MS}ms ease`; el.style.opacity = "1"; // remove inline style after the animation so we don't override site CSS setTimeout(() => { if (el) el.style.opacity = ""; }, DIM_EASE_MS + 50); }); wrappedTexts.forEach(span => { span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = "1"; span.addEventListener("transitionend", () => { if (!span.parentNode) return; span.parentNode.replaceChild(document.createTextNode(span.textContent || ""), span); }, { once:true }); }); // Clear hard-guard on path pathEls.forEach(el => { if (el) el.style.opacity = ""; }); dimCtx = null; } // ---------------- Positioning (centered, edge-aware, flip) ---------------- function clamp(v,min,max){ return Math.max(min,Math.min(max,v)); } function measureBubbleForPlacement(){ const wasOpen = bubble.classList.contains("is-open"); if (!wasOpen){ bubble.style.visibility="hidden"; bubble.classList.add("is-open"); } const rect = bubble.getBoundingClientRect(); if (!wasOpen){ bubble.classList.remove("is-open"); bubble.style.visibility=""; } return { w: rect.width, h: rect.height }; } function placeAnchored(trigger){ const vw=innerWidth, vh=innerHeight; const r = trigger.getBoundingClientRect(); const { w, h } = measureBubbleForPlacement(); let left = r.left + (r.width/2) - (w/2); left = clamp(left, EDGE_PADDING, Math.max(EDGE_PADDING, vw - EDGE_PADDING - w)); const topBelow = r.bottom + OFFSET_Y; const spaceBelow = vh - topBelow - EDGE_PADDING; const placeBelow = spaceBelow >= h; let top = placeBelow ? topBelow : (r.top - h - OFFSET_Y); top = clamp(top, EDGE_PADDING, Math.max(EDGE_PADDING, vh - EDGE_PADDING - h)); bubble.style.left = left + "px"; bubble.style.top = top + "px"; const br = bubble.getBoundingClientRect(); if (br.bottom > vh - EDGE_PADDING){ bubble.style.maxHeight = (vh - 2*EDGE_PADDING) + "px"; bubble.style.overflowY = "auto"; } else { bubble.style.maxHeight = "none"; bubble.style.overflowY = "visible"; } } // ---------------- Open / Close (place → fade/scale) ---------------- function animateIn(){ bubble.style.transition = "none"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; void bubble.offsetWidth; bubble.style.transition = "opacity .18s ease, transform .18s ease"; bubble.style.opacity = "1"; bubble.style.transform = "scale(1)"; } function animateOut(done){ bubble.style.transition = "opacity .16s ease, transform .16s ease"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; const end = () => { bubble.removeEventListener("transitionend", end); done && done(); }; bubble.addEventListener("transitionend", end); setTimeout(end, 260); } function openFromTrigger(trigger){ if (current && current !== trigger) forceClose(); current = trigger; trigger.setAttribute("aria-expanded","true"); elH.textContent = trigger.getAttribute("data-tt-h") || ""; elB.textContent = trigger.getAttribute("data-tt-b") || ""; bubble.classList.add("is-open"); bubble.setAttribute("aria-hidden","false"); placeAnchored(trigger); animateIn(); const container = findTextContainer(trigger); dimAllOtherBranches(container, trigger); hoverCount = 0; cancelCloseTimer(); } function forceClose(){ if (!current) return; bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); current.setAttribute("aria-expanded","false"); current = null; undim(); hoverCount = 0; cancelCloseTimer(); } function closeWithAnim(){ if (!current) return; const t = current; animateOut(() => { bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); t.setAttribute("aria-expanded","false"); current = null; undim(); }); } function scheduleClose(){ cancelCloseTimer(); closeTimer = setTimeout(() => { if (hoverCount { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneEnter(); if (!current || current !== t) openFromTrigger(t); }; const handleLeave = (e) => { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneLeave(); }; document.addEventListener("pointerenter", handleEnter, true); document.addEventListener("mouseenter", handleEnter, true); document.addEventListener("pointerleave", handleLeave, true); document.addEventListener("mouseleave", handleLeave, true); // ---------------- Keyboard ---------------- document.addEventListener("focusin", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t) openFromTrigger(t); }); document.addEventListener("focusout", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t && current === t) closeWithAnim(); }); // ---------------- Mobile / coarse ---------------- document.addEventListener("pointerdown", (e) => { if (!isCoarse()) return; const t = e.target.closest(".tt-trigger"); if (!t) return; e.preventDefault(); e.stopPropagation(); if (current === t && bubble.classList.contains("is-open")) { closeWithAnim(); return; } openFromTrigger(t); }, true); document.addEventListener("click", (e) => { if (!isCoarse()) return; if (!bubble.classList.contains("is-open")) return; const inBubble = !!e.target.closest(".tt-bubble"); const onTrigger = !!e.target.closest(".tt-trigger"); if (!inBubble && !onTrigger) closeWithAnim(); }, true); // Close button + ESC elClose.addEventListener("click", closeWithAnim); document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeWithAnim(); }); // Reposition on resize/scroll while open const reposition = () => { if (!current) return; placeAnchored(current); }; addEventListener("resize", reposition, { passive: true }); addEventListener("scroll", reposition, { passive: true }); });

Claudeに自分の仕事のやり方を教える

自分の専門知識、手順、ベストプラクティスを再利用可能な機能に変え、Claudeが常にそれらを自動的に適用できるようにします。

スキルを使い始める
動画を再生

毎回、専門家レベルの出力

専門的な作業で一貫した結果を取得

スキルは、文書作成、データ分析、ワークフローの自動化をどのように行いたいかをClaudeに詳細に提供するため、常に一貫した結果が得られます。

組織が持つ知識を把握

社内の手順、ベストプラクティス、組織特有の知識をパッケージ化することで、チームは一貫して業務を進め、新規メンバーは初日から専門家レベルの成果を上げられるようになります。

一度構築すれば、どこでも利用可能

同じスキルをClaude.ai、Claude Code、API全体で実行でき、プラットフォームごとに変更する必要はありません。

スキルを組み合わせて複雑な作業に対応

多段階のワークフロー向けにスキルを組み合わせることができます。Claudeは、必要なときに必要なツールを使用します。手動で選択する必要はありません。

チームのスキル活用方法

Claudeには、一般的なワークフロー向けのスキルが標準で備わっています。組織の手順を追加することも、ゼロから独自の手順を構築することもできます。

組み込みワークフロー

Claudeは、すべてのチームが必要とする基本的な作業に対応できます。

  • 機能する数式付きのExcelシート、ブランドを反映したPowerPoint資料などの作成
  • 独自データの分析および可視化
  • 複数のフォーマット間でファイルの変換および加工

企業固有のスキル

組織の知識をパッケージ化することで、全員が一貫した結果を得ることができます。

  • ブランドガイドラインの適用もしくは、文書や会議メモなどにおいて推奨される書式を採用
  • DCFモデリングや比較分析など、金融サービス向けに事前構築されたスキルを使用
  • 医療文書化やコンプライアンス手順など、業界固有のワークフローを作成

個人のワークフロー

個人の作業方法に合わせたスキルを作成できます。

  • カスタマイズされたメモ取りシステムの構築
  • 独自の開発ワークフローを作成
  • Claudeが従うべき調査および分析手法を作成
実世界のエージェントにエージェントスキルを装備

ファイルやフォルダを使用して専門的なエージェントを構築する新たな方法、エージェントスキルの紹介です。

詳細を読む
スキルを通じたフロントエンドデザインの改善

Claude とスキルを活用して、より豊かでカスタマイズされたフロントエンドデザインを構築するためのベストプラクティス。

詳細を読む
前へ
Next

独自のスキルを作成する

「スキル作成」スキルを試してみる

何をしたいかを説明すれば、Claudeがフォルダ構造を生成し、SKILL.mdファイルをフォーマットし、リソースをまとめてパッケージ化します。

スキルを作成する

---
名前:internal-comms
説明:社内向け各種コミュニケーション文書の作成を支援するリソース集。社内での推奨形式に基づく。Claudeは、社内向けコミュニケーション文書(進捗報告、経営陣向け最新報告、3P最新報告、社内報、よくある質問、インシデント報告、プロジェクト進捗報告など)の作成を依頼された際には、常にこのスキルを活用。
ライセンス:ライセンス全条項はLICENSE.txtに記載
---

##このスキルを使用するタイミング
社内コミュニケーションを作成する際には、以下の用途にこのスキルを使用します。
- 3P報告(進捗状況、計画、問題点)
- 社内報
- よくある質問への回答
- 進捗報告
- 経営陣向け最新報告
- プロジェクト進捗報告
- インシデント報告

##このスキルの活用方法

社内コミュニケーションを作成する方法。

1. **リクエストからコミュニケーションタイプ**を特定します
2。**適切なガイドラインファイルを** `examples/` ディレクトリから読み込みます:
- `examples/3p-updates.md` - 進捗・計画・課題に関するチーム更新用
- `examples/company-newsletter.md` - 全社向けニュースレター用
- `examples/faq-answers.md` - よくある質問への回答用
- `examples/general-comms.md` - 上記3のいずれにも明示的に該当しないその他の内容用
3。そのファイルに記載されている**具体的な指示に従い**、書式設定、トーン、およびコンテンツの収集を実行します。

コミュニケーションタイプが既存のガイドラインのいずれにも該当しない場合は、希望する形式に関する明確な説明やコンテキストの詳細を依頼します。

## Keywords
3Pの最新情報、社内報、社内コミュニケーション、週次更新情報、よくある質問、最新情報、社内連絡

独自のSKILL.mdファイルを作成する

完全な制御を望む開発者にとって、スキルはMarkdownの指示が記載されたSKILL.mdファイルを含む単なるフォルダーにすぎません。参照ファイル、実行可能スクリプト、コードなど、Claudeが作業に必要なものは何でも追加できます。

開発者向けドキュメントを読む

「スキルは、ClaudeにBox上のコンテンツの扱い方を教えます。ユーザーは、保存されているファイルを、自社の標準に準拠したPowerPointプレゼンテーション、Excelスプレッドシート、Word文書へと変換でき、何時間分もの作業時間を節約できます。」

Yashodha Bhavnani(AI部門責任者)

「スキルを使えば、ClaudeはNotionとシームレスに連携し、ユーザーを“質問”から“実行”へとより迅速に導きます。複雑なタスクにおけるプロンプト調整の手間を減らし、より予測可能な結果を実現します。」

MJ Felix(プロダクトマネージャー)

Skills により、管理会計と財務のワークフローが効率化されます。Claude が複数のスプレッドシートを処理し、重大な異常を検出し、当社の業務プロセスに従ってレポートを生成します。以前は 1 日を要していた作業が、現在では 1 時間で完了します。

梶 佑輔氏、AI 担当ジェネラルマネージャー

「Canvaはスキルを活用してエージェントをカスタマイズし、できる範囲を拡大する予定です。これにより、Canvaをエージェントのワークフローに深く浸透させる新しい方法が開かれ、チームが独自のコンテキストを把握し、驚くほど高品質なデザインを簡単に作成できるようになります。」

Anwar Haneef(GM兼エコシステム責任者)
前へ
0/5
Next

その他のリソース