
Tangzhan Skill Opencodeinsights
- 395 installs
- 5 repo stars
- Updated June 11, 2026
- tangc/tangzhan-skills
tangzhan-skill-opencodeinsights is a Claude Code skill that turns recent OpenCode session transcripts into an HTML insights report surfacing work patterns, tool usage, wins, and friction for tuning agent-assisted develop
About
tangzhan-skill-opencodeinsights (OpenCode Insights Analyst) is a Claude Code productivity skill that audits your OpenCode agent session history. The skill calls session_list (default: last 20 sessions or 2 weeks) and session_read for full transcripts, then analyzes project focus, tool usage (Bash, Edit, Read), error friction, rejected operations, and moments requiring heavy hand-holding. Developers reach for tangzhan-skill-opencodeinsights after sustained agent coding to generate a visual HTML report with strategic recommendations for automation, skill adoption, and workflow fixes. Output is a self-contained insights dashboard, not code changes.
- Pulls recent sessions via session_list and full transcripts via session_read (default ~20 sessions or 2 weeks)
- Extracts stats: message counts, estimated line changes, files touched, active days, and hour-of-day JSON for charts
- Clusters work into 3–5 project areas and tags big wins vs friction (API errors, tool failures, vague restarts)
- Fills tangzhan-opencode-insights/template.html placeholders and writes a styled insight-report.html
- Horizon section recommends concrete follow-ups (new skills, TodoWrite workflows) from observed usage
Tangzhan Skill Opencodeinsights by the numbers
- 395 all-time installs (skills.sh)
- +1 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #2,004 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/tangc/tangzhan-skills --skill tangzhan-skill-opencodeinsightsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 395 |
|---|---|
| repo stars | ★ 5 |
| Security audit | 3 / 3 scanners passed |
| Last updated | June 11, 2026 |
| Repository | tangc/tangzhan-skills ↗ |
How do you analyze OpenCode session history for friction?
Turn recent OpenCode session transcripts into an HTML insights report that surfaces work patterns, tool usage, wins, and friction so you can tune how you ship with agents.
Who is it for?
Developers using OpenCode who want data-driven feedback on agent session patterns and productivity friction.
Skip if: Developers on Claude Code, Cursor, or Codex without OpenCode session_list and session_read APIs.
When should I use this skill?
A developer wants an OpenCode session history report covering work patterns, tool usage, and friction points.
What you get
OpenCode Insights HTML report with work patterns, tool usage stats, friction points, and workflow recommendations.
- OpenCode Insights HTML report
By the numbers
- Defaults to analyzing the last 20 OpenCode sessions
- Covers a default window of the past 2 weeks of sessions
Files
OpenCode Insights Analyst
Role
You are an elite Developer Productivity Analyst and Strategic Coach. Your goal is to analyze the user's OpenCode session history to generate a "OpenCode Insights" HTML report.
Capabilities
You verify and analyze: 1. Work Patterns: identifying what projects/modules the user worked on. 2. Tool Usage: analyzing which tools (Bash, Edit, Read, etc.) were used and how. 3. Friction Points: finding errors, interruptions, user rejections, and "babysitting" moments. 4. Strategic Horizons: suggesting workflows, automations, and skills based on actual usage.
Workflow
1. Data Gathering
- Use
session_listto retrieve recent sessions (default: last 20 sessions or last 2 weeks). - Use
session_readto fetch full transcripts for detailed analysis. - Optional: If the user provides a specific range or session ID, focus on that.
2. Analysis Phase
Analyze the raw logs to extract:
- Stats: Total messages, lines changed (estimate from Edit/Write), files touched, active days.
- Project Areas: Cluster sessions into 3-5 main topics (e.g., "Admin API", "Refactoring", "Documentation").
- Wins: Identify successful complex tasks (multi-file edits, long autonomous runs).
- Friction: Categorize failures (API errors, Tool failures, Ambiguous requests requiring restarts).
- Horizon: Propose specific "next steps" (e.g., "Create a skill for X", "Use TodoWrite for Y").
3. Report Generation
1. Read the template file at tangzhan-opencode-insights/template.html. 2. Generate the HTML content by replacing the template placeholders (e.g., {{STATS_ROW}}, {{PROJECT_AREAS}}, {{BIG_WINS}}) with your analyzed data.
- Important: Follow the exact HTML structure for each section as found in the reference or inferred from the template context.
- Ensure all CSS classes (like
chart-card,big-win,friction-category) are used correctly to maintain styling. - Inject the JSON data for
{{RAW_HOUR_COUNTS}}script variable.
3. Write the final report to insight-report.html.
Output
- A fully rendered HTML file named
insight-report.html. - A brief summary in the chat confirming the analysis covers N sessions and pointing the user to the generated file.
OpenCode 洞察分析师 (OpenCode Insights Analyst)
角色 (Role)
您是一位精英级的开发者生产力分析师和战略教练。您的目标是分析用户的 OpenCode 会话历史记录,生成一份 "OpenCode Insights" HTML 报告。
能力 (Capabilities)
您负责验证和分析: 1. 工作模式 (Work Patterns):识别用户在哪些项目/模块上工作。 2. 工具使用 (Tool Usage):分析使用了哪些工具(Bash, Edit, Read 等)以及如何使用。 3. 摩擦点 (Friction Points):发现错误、中断、用户拒绝操作以及需要“保姆式”照看的时刻。 4. 战略视野 (Strategic Horizons):根据实际使用情况建议工作流、自动化和技能。
工作流 (Workflow)
1. 数据收集 (Data Gathering)
- 使用
session_list获取最近的会话(默认:最近 20 个会话或最近 2 周)。 - 使用
session_read获取完整的转录内容以进行详细分析。 - 可选:如果用户提供了特定的范围或会话 ID,则专注于该范围。
2. 分析阶段 (Analysis Phase)
分析原始日志以提取:
- 统计数据 (Stats):总消息数、更改的行数(从 Edit/Write 估算)、触及的文件、活跃天数。
- 项目领域 (Project Areas):将会话聚类为 3-5 个主要主题(例如:“管理后台 API”、“重构”、“文档”)。
- 成功案例 (Wins):识别成功的复杂任务(多文件编辑、长时间的自主运行)。
- 摩擦点 (Friction):分类失败(API 错误、工具故障、需要重新开始的模糊请求)。
- 展望 (Horizon):提出具体的“后续步骤”(例如:“为 X 创建一个技能”,“为 Y 使用 TodoWrite”)。
3. 报告生成 (Report Generation)
1. 读取位于 tangzhan-opencode-insights/template.html 的模板文件。 2. 通过将模板占位符(例如 {{STATS_ROW}}, {{PROJECT_AREAS}}, {{BIG_WINS}})替换为您的分析数据来生成 HTML 内容。
- 重要:严格遵循参考中或从模板上下文中推断出的每个部分的 HTML 结构。
- 确保正确使用所有 CSS 类(如
chart-card,big-win,friction-category)以保持样式。 - 为
{{RAW_HOUR_COUNTS}}脚本变量注入 JSON 数据。
3. 将最终报告写入 insight-report.html。
输出 (Output)
- 一个名为
insight-report.html的完全渲染的 HTML 文件。 - 聊天中的简短摘要,确认分析涵盖了 N 个会话,并指引用户查看生成的文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>OpenCode Insights</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; background: #f8fafc; color: #334155; line-height: 1.65; padding: 48px 24px; }
.container { max-width: 800px; margin: 0 auto; }
h1 { font-size: 32px; font-weight: 700; color: #0f172a; margin-bottom: 8px; }
h2 { font-size: 20px; font-weight: 600; color: #0f172a; margin-top: 48px; margin-bottom: 16px; }
.subtitle { color: #64748b; font-size: 15px; margin-bottom: 32px; }
.nav-toc { display: flex; flex-wrap: wrap; gap: 8px; margin: 24px 0 32px 0; padding: 16px; background: white; border-radius: 8px; border: 1px solid #e2e8f0; }
.nav-toc a { font-size: 12px; color: #64748b; text-decoration: none; padding: 6px 12px; border-radius: 6px; background: #f1f5f9; transition: all 0.15s; }
.nav-toc a:hover { background: #e2e8f0; color: #334155; }
.stats-row { display: flex; gap: 24px; margin-bottom: 40px; padding: 20px 0; border-top: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; flex-wrap: wrap; }
.stat { text-align: center; }
.stat-value { font-size: 24px; font-weight: 700; color: #0f172a; }
.stat-label { font-size: 11px; color: #64748b; text-transform: uppercase; }
.at-a-glance { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border: 1px solid #f59e0b; border-radius: 12px; padding: 20px 24px; margin-bottom: 32px; }
.glance-title { font-size: 16px; font-weight: 700; color: #92400e; margin-bottom: 16px; }
.glance-sections { display: flex; flex-direction: column; gap: 12px; }
.glance-section { font-size: 14px; color: #78350f; line-height: 1.6; }
.glance-section strong { color: #92400e; }
.see-more { color: #b45309; text-decoration: none; font-size: 13px; white-space: nowrap; }
.see-more:hover { text-decoration: underline; }
.project-areas { display: flex; flex-direction: column; gap: 12px; margin-bottom: 32px; }
.project-area { background: white; border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; }
.area-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.area-name { font-weight: 600; font-size: 15px; color: #0f172a; }
.area-count { font-size: 12px; color: #64748b; background: #f1f5f9; padding: 2px 8px; border-radius: 4px; }
.area-desc { font-size: 14px; color: #475569; line-height: 1.5; }
.narrative { background: white; border: 1px solid #e2e8f0; border-radius: 8px; padding: 20px; margin-bottom: 24px; }
.narrative p { margin-bottom: 12px; font-size: 14px; color: #475569; line-height: 1.7; }
.key-insight { background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 8px; padding: 12px 16px; margin-top: 12px; font-size: 14px; color: #166534; }
.section-intro { font-size: 14px; color: #64748b; margin-bottom: 16px; }
.big-wins { display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px; }
.big-win { background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 8px; padding: 16px; }
.big-win-title { font-weight: 600; font-size: 15px; color: #166534; margin-bottom: 8px; }
.big-win-desc { font-size: 14px; color: #15803d; line-height: 1.5; }
.friction-categories { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.friction-category { background: #fef2f2; border: 1px solid #fca5a5; border-radius: 8px; padding: 16px; }
.friction-title { font-weight: 600; font-size: 15px; color: #991b1b; margin-bottom: 6px; }
.friction-desc { font-size: 13px; color: #7f1d1d; margin-bottom: 10px; }
.friction-examples { margin: 0 0 0 20px; font-size: 13px; color: #334155; }
.friction-examples li { margin-bottom: 4px; }
.claude-md-section { background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px; padding: 16px; margin-bottom: 20px; }
.claude-md-section h3 { font-size: 14px; font-weight: 600; color: #1e40af; margin: 0 0 12px 0; }
.claude-md-actions { margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid #dbeafe; }
.copy-all-btn { background: #2563eb; color: white; border: none; border-radius: 4px; padding: 6px 12px; font-size: 12px; cursor: pointer; font-weight: 500; transition: all 0.2s; }
.copy-all-btn:hover { background: #1d4ed8; }
.copy-all-btn.copied { background: #16a34a; }
.claude-md-item { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px; padding: 10px 0; border-bottom: 1px solid #dbeafe; }
.claude-md-item:last-child { border-bottom: none; }
.cmd-checkbox { margin-top: 2px; }
.cmd-code { background: white; padding: 8px 12px; border-radius: 4px; font-size: 12px; color: #1e40af; border: 1px solid #bfdbfe; font-family: monospace; display: block; white-space: pre-wrap; word-break: break-word; flex: 1; }
.cmd-why { font-size: 12px; color: #64748b; width: 100%; padding-left: 24px; margin-top: 4px; }
.features-section, .patterns-section { display: flex; flex-direction: column; gap: 12px; margin: 16px 0; }
.feature-card { background: #f0fdf4; border: 1px solid #86efac; border-radius: 8px; padding: 16px; }
.pattern-card { background: #f0f9ff; border: 1px solid #7dd3fc; border-radius: 8px; padding: 16px; }
.feature-title, .pattern-title { font-weight: 600; font-size: 15px; color: #0f172a; margin-bottom: 6px; }
.feature-oneliner { font-size: 14px; color: #475569; margin-bottom: 8px; }
.pattern-summary { font-size: 14px; color: #475569; margin-bottom: 8px; }
.feature-why, .pattern-detail { font-size: 13px; color: #334155; line-height: 1.5; }
.feature-examples { margin-top: 12px; }
.feature-example { padding: 8px 0; border-top: 1px solid #d1fae5; }
.feature-example:first-child { border-top: none; }
.example-desc { font-size: 13px; color: #334155; margin-bottom: 6px; }
.example-code-row { display: flex; align-items: flex-start; gap: 8px; }
.example-code { flex: 1; background: #f1f5f9; padding: 8px 12px; border-radius: 4px; font-family: monospace; font-size: 12px; color: #334155; overflow-x: auto; white-space: pre-wrap; }
.copyable-prompt-section { margin-top: 12px; padding-top: 12px; border-top: 1px solid #e2e8f0; }
.copyable-prompt-row { display: flex; align-items: flex-start; gap: 8px; }
.copyable-prompt { flex: 1; background: #f8fafc; padding: 10px 12px; border-radius: 4px; font-family: monospace; font-size: 12px; color: #334155; border: 1px solid #e2e8f0; white-space: pre-wrap; line-height: 1.5; }
.feature-code { background: #f8fafc; padding: 12px; border-radius: 6px; margin-top: 12px; border: 1px solid #e2e8f0; display: flex; align-items: flex-start; gap: 8px; }
.feature-code code { flex: 1; font-family: monospace; font-size: 12px; color: #334155; white-space: pre-wrap; }
.pattern-prompt { background: #f8fafc; padding: 12px; border-radius: 6px; margin-top: 12px; border: 1px solid #e2e8f0; }
.pattern-prompt code { font-family: monospace; font-size: 12px; color: #334155; display: block; white-space: pre-wrap; margin-bottom: 8px; }
.prompt-label { font-size: 11px; font-weight: 600; text-transform: uppercase; color: #64748b; margin-bottom: 6px; }
.copy-btn { background: #e2e8f0; border: none; border-radius: 4px; padding: 4px 8px; font-size: 11px; cursor: pointer; color: #475569; flex-shrink: 0; }
.copy-btn:hover { background: #cbd5e1; }
.charts-row { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin: 24px 0; }
.chart-card { background: white; border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; }
.chart-title { font-size: 12px; font-weight: 600; color: #64748b; text-transform: uppercase; margin-bottom: 12px; }
.bar-row { display: flex; align-items: center; margin-bottom: 6px; }
.bar-label { width: 100px; font-size: 11px; color: #475569; flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bar-track { flex: 1; height: 6px; background: #f1f5f9; border-radius: 3px; margin: 0 8px; }
.bar-fill { height: 100%; border-radius: 3px; }
.bar-value { width: 28px; font-size: 11px; font-weight: 500; color: #64748b; text-align: right; }
.empty { color: #94a3b8; font-size: 13px; }
.horizon-section { display: flex; flex-direction: column; gap: 16px; }
.horizon-card { background: linear-gradient(135deg, #faf5ff 0%, #f5f3ff 100%); border: 1px solid #c4b5fd; border-radius: 8px; padding: 16px; }
.horizon-title { font-weight: 600; font-size: 15px; color: #5b21b6; margin-bottom: 8px; }
.horizon-possible { font-size: 14px; color: #334155; margin-bottom: 10px; line-height: 1.5; }
.horizon-tip { font-size: 13px; color: #6b21a8; background: rgba(255,255,255,0.6); padding: 8px 12px; border-radius: 4px; }
.feedback-header { margin-top: 48px; color: #64748b; font-size: 16px; }
.feedback-intro { font-size: 13px; color: #94a3b8; margin-bottom: 16px; }
.feedback-section { margin-top: 16px; }
.feedback-section h3 { font-size: 14px; font-weight: 600; color: #475569; margin-bottom: 12px; }
.feedback-card { background: white; border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.feedback-card.team-card { background: #eff6ff; border-color: #bfdbfe; }
.feedback-card.model-card { background: #faf5ff; border-color: #e9d5ff; }
.feedback-title { font-weight: 600; font-size: 14px; color: #0f172a; margin-bottom: 6px; }
.feedback-detail { font-size: 13px; color: #475569; line-height: 1.5; }
.feedback-evidence { font-size: 12px; color: #64748b; margin-top: 8px; }
.fun-ending { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border: 1px solid #fbbf24; border-radius: 12px; padding: 24px; margin-top: 40px; text-align: center; }
.fun-headline { font-size: 18px; font-weight: 600; color: #78350f; margin-bottom: 8px; }
.fun-detail { font-size: 14px; color: #92400e; }
.collapsible-section { margin-top: 16px; }
.collapsible-header { display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 12px 0; border-bottom: 1px solid #e2e8f0; }
.collapsible-header h3 { margin: 0; font-size: 14px; font-weight: 600; color: #475569; }
.collapsible-arrow { font-size: 12px; color: #94a3b8; transition: transform 0.2s; }
.collapsible-content { display: none; padding-top: 16px; }
.collapsible-content.open { display: block; }
.collapsible-header.open .collapsible-arrow { transform: rotate(90deg); }
@media (max-width: 640px) { .charts-row { grid-template-columns: 1fr; } .stats-row { justify-content: center; } }
</style>
</head>
<body>
<div class="container">
<h1>OpenCode Insights</h1>
<p class="subtitle">{{MESSAGES_COUNT}} messages across {{SESSION_COUNT}} sessions | {{DATE_RANGE}}</p>
<div class="at-a-glance">
<div class="glance-title">At a Glance</div>
<div class="glance-sections">
{{GLANCE_SECTIONS}}
</div>
</div>
<nav class="nav-toc">
<a href="#section-work">What You Work On</a>
<a href="#section-usage">How You Use CC</a>
<a href="#section-wins">Impressive Things</a>
<a href="#section-friction">Where Things Go Wrong</a>
<a href="#section-features">Features to Try</a>
<a href="#section-patterns">New Usage Patterns</a>
<a href="#section-horizon">On the Horizon</a>
</nav>
<div class="stats-row">
{{STATS_ROW}}
</div>
<h2 id="section-work">What You Work On</h2>
<div class="project-areas">
{{PROJECT_AREAS}}
</div>
<div class="charts-row">
<div class="chart-card">
<div class="chart-title">What You Wanted</div>
{{CHART_WANTED}}
</div>
<div class="chart-card">
<div class="chart-title">Top Tools Used</div>
{{CHART_TOOLS}}
</div>
</div>
<div class="charts-row">
<div class="chart-card">
<div class="chart-title">Languages</div>
{{CHART_LANGUAGES}}
</div>
<div class="chart-card">
<div class="chart-title">Session Types</div>
{{CHART_SESSION_TYPES}}
</div>
</div>
<h2 id="section-usage">How You Use OpenCode</h2>
<div class="narrative">
{{NARRATIVE}}
</div>
<div class="chart-card" style="margin: 24px 0;">
<div class="chart-title">User Response Time Distribution</div>
{{CHART_RESPONSE_TIME}}
</div>
<div class="charts-row">
<div class="chart-card">
<div class="chart-title" style="display: flex; align-items: center; gap: 12px;">
User Messages by Time of Day
<select id="timezone-select" style="font-size: 12px; padding: 4px 8px; border-radius: 4px; border: 1px solid #e2e8f0;">
<option value="0">PT (UTC-8)</option>
<option value="3">ET (UTC-5)</option>
<option value="8">London (UTC)</option>
<option value="9">CET (UTC+1)</option>
<option value="17">Tokyo (UTC+9)</option>
<option value="custom">Custom offset...</option>
</select>
<input type="number" id="custom-offset" placeholder="UTC offset" style="display: none; width: 80px; font-size: 12px; padding: 4px; border-radius: 4px; border: 1px solid #e2e8f0;">
</div>
<div id="hour-histogram">
{{CHART_TIME_OF_DAY}}
</div>
</div>
<div class="chart-card">
<div class="chart-title">Tool Errors Encountered</div>
{{CHART_ERRORS}}
</div>
</div>
<h2 id="section-wins">Impressive Things You Did</h2>
<p class="section-intro">Overview of your most successful sessions and workflows.</p>
<div class="big-wins">
{{BIG_WINS}}
</div>
<div class="charts-row">
<div class="chart-card">
<div class="chart-title">What Helped Most (OpenCode's Capabilities)</div>
{{CHART_CAPABILITIES}}
</div>
<div class="chart-card">
<div class="chart-title">Outcomes</div>
{{CHART_OUTCOMES}}
</div>
</div>
<h2 id="section-friction">Where Things Go Wrong</h2>
<p class="section-intro">Analysis of interrupted workflows and friction points.</p>
<div class="friction-categories">
{{FRICTION_CATEGORIES}}
</div>
<div class="charts-row">
<div class="chart-card">
<div class="chart-title">Primary Friction Types</div>
{{CHART_FRICTION_TYPES}}
</div>
<div class="chart-card">
<div class="chart-title">Inferred Satisfaction (model-estimated)</div>
{{CHART_SATISFACTION}}
</div>
</div>
<h2 id="section-features">Existing CC Features to Try</h2>
<div class="claude-md-section">
<h3>Suggested CLAUDE.md Additions</h3>
<p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into OpenCode to add it to your CLAUDE.md.</p>
<div class="claude-md-actions">
<button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
</div>
{{CLAUDE_MD_ITEMS}}
</div>
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into OpenCode and it'll set it up for you.</p>
<div class="features-section">
{{FEATURES_SECTION}}
</div>
<h2 id="section-patterns">New Ways to Use OpenCode</h2>
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into OpenCode and it'll walk you through it.</p>
<div class="patterns-section">
{{PATTERNS_SECTION}}
</div>
<h2 id="section-horizon">On the Horizon</h2>
<p class="section-intro">Strategic recommendations for maturing your AI-assisted development.</p>
<div class="horizon-section">
{{HORIZON_SECTION}}
</div>
<div class="fun-ending">
{{FUN_ENDING}}
</div>
</div>
<script>
function toggleCollapsible(header) {
header.classList.toggle('open');
const content = header.nextElementSibling;
content.classList.toggle('open');
}
function copyText(btn) {
const code = btn.previousElementSibling;
navigator.clipboard.writeText(code.textContent).then(() => {
btn.textContent = 'Copied!';
setTimeout(() => { btn.textContent = 'Copy'; }, 2000);
});
}
function copyCmdItem(idx) {
const checkbox = document.getElementById('cmd-' + idx);
if (checkbox) {
const text = checkbox.dataset.text;
navigator.clipboard.writeText(text).then(() => {
const btn = checkbox.nextElementSibling.querySelector('.copy-btn');
if (btn) { btn.textContent = 'Copied!'; setTimeout(() => { btn.textContent = 'Copy'; }, 2000); }
});
}
}
function copyAllCheckedClaudeMd() {
const checkboxes = document.querySelectorAll('.cmd-checkbox:checked');
const texts = [];
checkboxes.forEach(cb => {
if (cb.dataset.text) { texts.push(cb.dataset.text); }
});
const combined = texts.join('\n');
const btn = document.querySelector('.copy-all-btn');
if (btn) {
navigator.clipboard.writeText(combined).then(() => {
btn.textContent = 'Copied ' + texts.length + ' items!';
btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy All Checked'; btn.classList.remove('copied'); }, 2000);
});
}
}
// Timezone selector logic (simplified for template)
const rawHourCounts = {{RAW_HOUR_COUNTS}}; // Injected by analysis
function updateHourHistogram(offsetFromPT) {
// ... logic similar to original ...
}
// ... event listeners ...
</script>
</body>
</html>
Related skills
FAQ
How many OpenCode sessions does tangzhan-skill-opencodeinsights analyze?
tangzhan-skill-opencodeinsights defaults to the last 20 OpenCode sessions or the past 2 weeks, whichever scope session_list returns. Developers can narrow to specific session IDs for focused analysis.
What does the OpenCode Insights report include?
tangzhan-skill-opencodeinsights outputs an HTML report covering work patterns, tool usage (Bash, Edit, Read), friction points, wins, and strategic recommendations for automation and skill adoption.
Is Tangzhan Skill Opencodeinsights safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.