Initial commit
This commit is contained in:
11
.claude-plugin/plugin.json
Normal file
11
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "session-reporter-plugin",
|
||||||
|
"description": "Generate HTML reports to visualize work sessions including conversation history, code changes, and execution results",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Stefan Cho"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# session-reporter-plugin
|
||||||
|
|
||||||
|
Generate HTML reports to visualize work sessions including conversation history, code changes, and execution results
|
||||||
53
plugin.lock.json
Normal file
53
plugin.lock.json
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:devstefancho/claude-plugins:session-reporter-plugin",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "0aea82b0b0cdccb511c9ef9b128aed07491944f6",
|
||||||
|
"treeHash": "dc7118120bc59bf4f369e4724379de52d4278f6b9384d4dddad6a0696d6c7c75",
|
||||||
|
"generatedAt": "2025-11-28T10:16:21.267388Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "session-reporter-plugin",
|
||||||
|
"description": "Generate HTML reports to visualize work sessions including conversation history, code changes, and execution results",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "acbfa73ebfebaf601d11fc2e0c5c7f62c346914a6b274cab8fccb342c0f83e90"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "3062dc64adfa898649bfb2ef732cddad349bf68ccfcb127e9fa8e5698680fbcc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/session-reporter/reference.md",
|
||||||
|
"sha256": "3e1df9ff1f8769186bbd4c58965ca2d080e6db841366f189a41655539dc2aabd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/session-reporter/SKILL.md",
|
||||||
|
"sha256": "a8fd2ab30add7855119ccf19567f050cab68b875a3df5ef494e2fc54107abd41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/session-reporter/templates/report.html",
|
||||||
|
"sha256": "2a0c5575822568a5f79b0e44325f25aadfbed6f6f6b384bb5bd4a7aa563aad77"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "dc7118120bc59bf4f369e4724379de52d4278f6b9384d4dddad6a0696d6c7c75"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
114
skills/session-reporter/SKILL.md
Normal file
114
skills/session-reporter/SKILL.md
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
---
|
||||||
|
name: session-reporter
|
||||||
|
description: Generate HTML file to view work session. Use when user asks to view content as HTML (e.g., 'HTML로 보여줘', 'HTML 파일로 만들어줘', 'view as HTML', 'export to HTML', 'HTML로 저장').
|
||||||
|
allowed-tools: Write, Bash, AskUserQuestion
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session Reporter
|
||||||
|
|
||||||
|
Generate an HTML file that visualizes your current work session, including conversation history, code changes, and execution results. The HTML file is automatically opened in your default browser.
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
Follow these steps to generate a session report:
|
||||||
|
|
||||||
|
### 1. Ask User for Report Scope
|
||||||
|
|
||||||
|
Use the AskUserQuestion tool to determine what content to include:
|
||||||
|
|
||||||
|
```
|
||||||
|
Question: "어떤 범위의 세션 내용을 HTML로 만들까요?"
|
||||||
|
Options:
|
||||||
|
- "마지막 작업만" (Last activity only - most recent task/conversation)
|
||||||
|
- "전체 세션" (Full session - entire conversation from start)
|
||||||
|
- "커스텀 선택" (Custom - ask user to specify what to include)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Collect Session Information
|
||||||
|
|
||||||
|
Based on the user's choice, gather the following information:
|
||||||
|
|
||||||
|
- **작업 요약 (Work Summary)**:
|
||||||
|
- Files modified
|
||||||
|
- Key decisions made
|
||||||
|
- Major changes implemented
|
||||||
|
|
||||||
|
- **대화 내용 (Conversation)**:
|
||||||
|
- User questions and requests
|
||||||
|
- Claude's responses
|
||||||
|
- Important clarifications
|
||||||
|
|
||||||
|
- **코드 변경사항 (Code Changes)**:
|
||||||
|
- Modified files with diffs or before/after comparisons
|
||||||
|
- New files created
|
||||||
|
- Files deleted
|
||||||
|
|
||||||
|
- **실행 결과 (Execution Results)**:
|
||||||
|
- Test results
|
||||||
|
- Build output
|
||||||
|
- Error messages
|
||||||
|
- Command outputs
|
||||||
|
|
||||||
|
### 3. Generate HTML File
|
||||||
|
|
||||||
|
Use the template at `templates/report.html` to create the HTML file:
|
||||||
|
|
||||||
|
1. Read the template file
|
||||||
|
2. Replace placeholders with actual session data:
|
||||||
|
- `{{TITLE}}` - Report title (e.g., "Session Report - 2025-11-15")
|
||||||
|
- `{{TIMESTAMP}}` - Generation timestamp
|
||||||
|
- `{{SUMMARY}}` - Work summary section
|
||||||
|
- `{{CONVERSATION}}` - Conversation content
|
||||||
|
- `{{CHANGES}}` - Code changes section
|
||||||
|
- `{{RESULTS}}` - Execution results section
|
||||||
|
3. Save to `/tmp/session-report-{timestamp}.html`
|
||||||
|
- Use format: `session-report-YYYYMMDD-HHMMSS.html`
|
||||||
|
- Example: `session-report-20251115-143022.html`
|
||||||
|
|
||||||
|
### 4. Open in Browser
|
||||||
|
|
||||||
|
After generating the HTML file:
|
||||||
|
|
||||||
|
1. Use Bash tool to open the file:
|
||||||
|
```bash
|
||||||
|
open /tmp/session-report-{timestamp}.html
|
||||||
|
```
|
||||||
|
2. Provide the file:// path to the user:
|
||||||
|
```
|
||||||
|
file:///tmp/session-report-{timestamp}.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Inform User
|
||||||
|
|
||||||
|
Tell the user:
|
||||||
|
- HTML 파일이 생성되었고 브라우저에서 열렸습니다
|
||||||
|
- The file path for future reference
|
||||||
|
- The file is temporary and will be cleaned up on system restart
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Example 1: Last Activity Only
|
||||||
|
|
||||||
|
```
|
||||||
|
User: HTML로 보여줘
|
||||||
|
Claude: [Uses AskUserQuestion to confirm scope]
|
||||||
|
User: 마지막 작업만
|
||||||
|
Claude: [Generates HTML with recent changes only, opens in browser]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 2: Full Session
|
||||||
|
|
||||||
|
```
|
||||||
|
User: 전체 세션 내용을 HTML 파일로 만들어줘
|
||||||
|
Claude: [Uses AskUserQuestion to confirm]
|
||||||
|
User: 전체 세션
|
||||||
|
Claude: [Generates comprehensive HTML with all conversation and changes]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Keep HTML styling simple and clean for easy reading
|
||||||
|
- Include proper syntax highlighting for code blocks using `<pre><code>` tags
|
||||||
|
- Add section navigation for longer reports
|
||||||
|
- Make the HTML print-friendly for documentation purposes
|
||||||
|
- Use semantic HTML elements for better accessibility
|
||||||
44
skills/session-reporter/reference.md
Normal file
44
skills/session-reporter/reference.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Session Reporter - Reference
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
HTML 파일로 작업 세션을 시각화하여 브라우저에서 볼 수 있습니다.
|
||||||
|
|
||||||
|
## Trigger Keywords
|
||||||
|
|
||||||
|
**Korean**: "HTML로 보여줘", "HTML 파일로 만들어줘", "HTML로 저장"
|
||||||
|
**English**: "view as HTML", "export to HTML", "show in HTML"
|
||||||
|
|
||||||
|
## Report Scope Options
|
||||||
|
|
||||||
|
1. **마지막 작업만** - 최근 작업 내용만
|
||||||
|
2. **전체 세션** - 처음부터 모든 대화/변경사항
|
||||||
|
3. **커스텀 선택** - 원하는 내용만 선택
|
||||||
|
|
||||||
|
## File Location
|
||||||
|
|
||||||
|
```
|
||||||
|
/tmp/session-report-YYYYMMDD-HHMMSS.html
|
||||||
|
```
|
||||||
|
|
||||||
|
⚠️ `/tmp` 파일은 시스템 재시작시 삭제됩니다.
|
||||||
|
|
||||||
|
## Template Customization
|
||||||
|
|
||||||
|
템플릿 위치: `.claude/skills/session-reporter/templates/report.html`
|
||||||
|
|
||||||
|
### Placeholders
|
||||||
|
|
||||||
|
- `{{TITLE}}` - 리포트 제목
|
||||||
|
- `{{TIMESTAMP}}` - 생성 시간
|
||||||
|
- `{{SUMMARY}}` - 작업 요약
|
||||||
|
- `{{CONVERSATION}}` - 대화 내용
|
||||||
|
- `{{CHANGES}}` - 코드 변경사항
|
||||||
|
- `{{RESULTS}}` - 실행 결과
|
||||||
|
- `{{FILE_PATH}}` - 파일 경로
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- **공유 전 확인**: 민감한 정보(API 키, 비밀번호) 제거
|
||||||
|
- **영구 저장**: 중요한 리포트는 다른 위치에 복사
|
||||||
|
- **PDF 변환**: 브라우저의 인쇄 기능(Cmd+P) 사용
|
||||||
307
skills/session-reporter/templates/report.html
Normal file
307
skills/session-reporter/templates/report.html
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ko">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{{TITLE}}</title>
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #333;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background-color: white;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 40px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
header .timestamp {
|
||||||
|
font-size: 0.9em;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-bottom: 1px solid #e0e0e0;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a {
|
||||||
|
color: #667eea;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-right: 20px;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a:hover {
|
||||||
|
color: #764ba2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
margin-bottom: 50px;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
border-bottom: 2px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
section:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #667eea;
|
||||||
|
font-size: 1.8em;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 3px solid #667eea;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
color: #555;
|
||||||
|
font-size: 1.3em;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-item {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 15px 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-left: 4px solid #667eea;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.conversation-block {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-message {
|
||||||
|
background-color: #e3f2fd;
|
||||||
|
padding: 15px 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-left: 4px solid #2196f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.assistant-message {
|
||||||
|
background-color: #f3e5f5;
|
||||||
|
padding: 15px 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-left: 4px solid #9c27b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-label {
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-message .message-label {
|
||||||
|
color: #1976d2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.assistant-message .message-label {
|
||||||
|
color: #7b1fa2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-change {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-path {
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #667eea;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
color: #f8f8f2;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 6px;
|
||||||
|
overflow-x: auto;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.execution-result {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
border-left: 4px solid #4caf50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-success {
|
||||||
|
border-left-color: #4caf50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-error {
|
||||||
|
border-left-color: #f44336;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-label {
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-success .result-label {
|
||||||
|
color: #2e7d32;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-error .result-label {
|
||||||
|
color: #c62828;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
margin-left: 25px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 20px 40px;
|
||||||
|
text-align: center;
|
||||||
|
color: #777;
|
||||||
|
font-size: 0.9em;
|
||||||
|
border-top: 1px solid #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
background-color: white;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
page-break-inside: avoid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
body {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
padding: 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a {
|
||||||
|
display: block;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<header>
|
||||||
|
<h1>{{TITLE}}</h1>
|
||||||
|
<p class="timestamp">생성 시간: {{TIMESTAMP}}</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<a href="#summary">작업 요약</a>
|
||||||
|
<a href="#conversation">대화 내용</a>
|
||||||
|
<a href="#changes">코드 변경사항</a>
|
||||||
|
<a href="#results">실행 결과</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<section id="summary">
|
||||||
|
<h2>📋 작업 요약</h2>
|
||||||
|
{{SUMMARY}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="conversation">
|
||||||
|
<h2>💬 대화 내용</h2>
|
||||||
|
{{CONVERSATION}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="changes">
|
||||||
|
<h2>📝 코드 변경사항</h2>
|
||||||
|
{{CHANGES}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="results">
|
||||||
|
<h2>✅ 실행 결과</h2>
|
||||||
|
{{RESULTS}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Generated by Claude Code Session Reporter</p>
|
||||||
|
<p>File: {{FILE_PATH}}</p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user