diff --git a/.github/ISSUE_TEMPLATE/report-issue.yml b/.github/ISSUE_TEMPLATE/report-issue.yml new file mode 100644 index 0000000000..a862b5ae83 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/report-issue.yml @@ -0,0 +1,85 @@ +name: Report Issue +description: Report an issue with an existing plot spec or implementation +title: "Report: " +labels: ["report-pending"] +body: + - type: markdown + attributes: + value: | + ## Report an Issue + + Found a problem with an existing plot? Let us know! + + Our AI will validate and structure your report, then queue it for maintainer review. + + - type: input + id: spec_id + attributes: + label: Specification ID + description: "The spec ID of the affected plot" + placeholder: "e.g., scatter-basic, qrcode-basic, heatmap-correlation" + validations: + required: true + + - type: dropdown + id: target + attributes: + label: What has the issue? + description: "Is this an issue with the specification itself or a specific library implementation?" + options: + - Specification (affects all libraries) + - Implementation (specific library) + validations: + required: true + + - type: dropdown + id: library + attributes: + label: Library (only for implementation issues) + description: "Which library implementation has the issue? Select N/A for spec issues." + options: + - N/A (spec issue) + - matplotlib + - seaborn + - plotly + - bokeh + - altair + - plotnine + - pygal + - highcharts + - letsplot + validations: + required: false + + - type: dropdown + id: category + attributes: + label: Issue Category + description: "What type of issue is this?" + options: + - Visual (ugly, unclear, hard to read) + - Data (unrealistic values, inappropriate context) + - Functional (doesn't work as expected, e.g., QR code not scannable) + - Other + validations: + required: true + + - type: textarea + id: description + attributes: + label: Issue Description + description: "Describe the issue. What's wrong? What should it look like instead?" + placeholder: | + Example: The QR code generated looks like a QR code but cannot be scanned by any QR reader app. + + Expected: The QR code should be a valid, scannable code that links to the specified URL. + validations: + required: true + + - type: textarea + id: additional + attributes: + label: Additional Context (optional) + description: "Screenshots, comparison images, or other helpful information" + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/plot-request.yml b/.github/ISSUE_TEMPLATE/spec-request.yml similarity index 98% rename from .github/ISSUE_TEMPLATE/plot-request.yml rename to .github/ISSUE_TEMPLATE/spec-request.yml index 6df991d71d..b738bfd497 100644 --- a/.github/ISSUE_TEMPLATE/plot-request.yml +++ b/.github/ISSUE_TEMPLATE/spec-request.yml @@ -1,6 +1,6 @@ name: Plot Request description: Propose a new plot type for pyplots -labels: ["plot-request"] +labels: ["spec-request"] body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/plot-update.yml b/.github/ISSUE_TEMPLATE/spec-update.yml similarity index 98% rename from .github/ISSUE_TEMPLATE/plot-update.yml rename to .github/ISSUE_TEMPLATE/spec-update.yml index e04524702b..74f30d2ff8 100644 --- a/.github/ISSUE_TEMPLATE/plot-update.yml +++ b/.github/ISSUE_TEMPLATE/spec-update.yml @@ -1,7 +1,7 @@ name: Plot Update description: Request updates or regeneration of an existing plot title: "[SPEC-ID] [update] " -labels: ["plot-request", "update"] +labels: ["spec-update"] body: - type: markdown attributes: diff --git a/.github/workflows/report-validate.yml b/.github/workflows/report-validate.yml new file mode 100644 index 0000000000..fa34f405fd --- /dev/null +++ b/.github/workflows/report-validate.yml @@ -0,0 +1,164 @@ +name: "Report: Validate" +run-name: "Validate Report: ${{ github.event.issue.title }}" + +# Validates and structures user-submitted issue reports +# Flow: +# 1. User submits report → report-pending label auto-added +# 2. AI validates spec/impl exists, analyzes issue, posts structured comment +# 3. Labels updated: report-validated + category + report:spec/impl + +on: + issues: + types: [labeled] + +concurrency: + group: report-validate-${{ github.event.issue.number }} + cancel-in-progress: false + +jobs: + validate: + if: github.event.label.name == 'report-pending' + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + + steps: + - name: Check if already validated + id: check + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Check if already has report-validated label + LABELS=$(gh issue view ${{ github.event.issue.number }} --json labels -q '.labels[].name' | tr '\n' ' ') + if echo "$LABELS" | grep -q "report-validated"; then + echo "::notice::Skipping: Issue already validated" + echo "should_run=false" >> $GITHUB_OUTPUT + exit 0 + fi + echo "should_run=true" >> $GITHUB_OUTPUT + + - name: Checkout repository + if: steps.check.outputs.should_run == 'true' + uses: actions/checkout@v6 + + - name: React with eyes emoji + if: steps.check.outputs.should_run == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/reactions \ + -f content=eyes + + - name: Validate with Claude + if: steps.check.outputs.should_run == 'true' + id: validate + continue-on-error: true + timeout-minutes: 10 + uses: anthropics/claude-code-action@v1 + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + claude_args: "--model sonnet" + prompt: | + ## Task: Validate Issue Report + + You are validating a user-submitted issue report for pyplots. + + ### Issue Details + - **Title:** ${{ github.event.issue.title }} + - **Number:** #${{ github.event.issue.number }} + - **Author:** ${{ github.event.issue.user.login }} + - **Body:** + ``` + ${{ github.event.issue.body }} + ``` + + --- + + ## Instructions + + 1. **Read the prompt:** `prompts/workflow-prompts/report-analysis.md` + + 2. **Parse the issue body** to extract: + - spec_id (from "Specification ID" field) + - target (Specification or Implementation) + - library (if implementation) + - category (Visual/Data/Functional/Other) + - description + + 3. **Validate the spec exists:** + ```bash + ls plots/{spec_id}/ + ``` + If NOT found: + - Post comment: "Spec `{spec_id}` not found. Please check the ID." + - Remove `report-pending` label + - Close issue + - STOP + + 4. **If implementation issue, validate the library exists:** + ```bash + ls plots/{spec_id}/implementations/{library}.py + ``` + If NOT found: + - Post comment: "Implementation `{library}` not found for `{spec_id}`." + - Remove `report-pending` label + - Close issue + - STOP + + 5. **Read relevant files:** + - `plots/{spec_id}/specification.md` + - `plots/{spec_id}/metadata/{library}.yaml` (if impl issue) + + 6. **Post structured analysis comment** following the format in the prompt file. + + 7. **Update issue title:** + ```bash + gh issue edit ${{ github.event.issue.number }} --title "[{spec_id}] {brief description}" + ``` + + 8. **Update labels:** + ```bash + # Remove pending, add validated + gh issue edit ${{ github.event.issue.number }} --remove-label "report-pending" --add-label "report-validated" + + # Add target label + gh issue edit ${{ github.event.issue.number }} --add-label "report:spec" + # OR for impl: + gh issue edit ${{ github.event.issue.number }} --add-label "report:impl" --add-label "report:impl:{library}" + + # Add category label (map from dropdown value) + # Visual → category:visual + # Data → category:data + # Functional → category:functional + # Other → category:other + gh issue edit ${{ github.event.issue.number }} --add-label "category:{category}" + ``` + + ### Important + - Do NOT add the `approved` label + - Do NOT trigger any fixes + - Keep the analysis comment concise but informative + + - name: Add reaction on success + if: steps.check.outputs.should_run == 'true' && steps.validate.outcome == 'success' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/reactions \ + -f content=rocket + + - name: Handle failure + if: steps.check.outputs.should_run == 'true' && steps.validate.outcome == 'failure' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh issue comment ${{ github.event.issue.number }} --body "## :x: Validation Failed + + The AI validation workflow encountered an error. A maintainer will review this manually. + + --- + :robot: *[report-validate](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})*" + + gh api repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/reactions \ + -f content=confused diff --git a/CLAUDE.md b/CLAUDE.md index 62f9151916..0422d373e6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -618,6 +618,12 @@ Located in `.github/workflows/`: | **impl-merge.yml** | `ai-approved` label OR workflow_dispatch | Merges approved PR, creates metadata/{library}.yaml | | **bulk-generate.yml** | workflow_dispatch only | Dispatches multiple implementations (max 3 parallel) | +### Report Workflows (`report-*.yml`) + +| Workflow | Trigger | Purpose | +|----------|---------|---------| +| **report-validate.yml** | `report-pending` label | Validates and structures user-submitted issue reports | + ### Workflow Data Flow **Flow A: New Specification (with approval gate)** @@ -674,6 +680,29 @@ impl-review.yml └── Re-triggers impl-review.yml ``` +**Flow C: Report Issue** + +``` +User submits report issue (from pyplots.ai or GitHub) + │ + ▼ (report-pending label auto-added) + │ +report-validate.yml + ├── Validates spec/impl exists + ├── Reads specification and metadata + ├── AI analyzes the issue + ├── Posts structured analysis comment + ├── Updates title: [{spec-id}] {brief description} + └── Updates labels: report-validated + category:* + report:spec/impl + │ + ▼ +Issue ready for maintainer review + │ + ▼ (maintainer adds `approved` label) + │ +(Fix workflow - future implementation) +``` + ### Supporting Workflows | Workflow | Purpose | @@ -757,6 +786,20 @@ These are set automatically by `impl-review.yml` after AI evaluation and used by - **`documentation`** - Documentation improvements - **`enhancement`** - New feature or improvement +### Report Labels + +| Label | Purpose | +|-------|---------| +| `report:spec` | Issue with the specification (affects all libraries) | +| `report:impl` | Issue with a specific implementation | +| `report:impl:{library}` | Specific library affected (e.g., `report:impl:matplotlib`) | +| `category:visual` | Design/visual issues | +| `category:data` | Data quality issues | +| `category:functional` | Non-functional elements | +| `category:other` | Other issues | +| `report-pending` | Report submitted, awaiting AI validation | +| `report-validated` | AI validated, ready for maintainer review | + ### New Specification Workflow 1. User creates issue with descriptive title (e.g., "3D scatter plot with rotation animation") diff --git a/README.md b/README.md index 80515b6617..8ff49727b5 100644 --- a/README.md +++ b/README.md @@ -118,24 +118,23 @@ pyplots/ We welcome contributions! **All code is AI-generated** - you propose ideas, AI implements them. -**How to contribute**: +**Three ways to contribute** (from [pyplots.ai](https://pyplots.ai) or GitHub): -1. **Propose plot ideas** - Create GitHub Issue with plot description (what you want to visualize) -2. **Improve specs** - Suggest better descriptions for existing plots -3. **Report issues** - Found bugs or quality problems? Open an Issue -4. **Improve docs** - Help others understand the project +| Action | When to Use | From pyplots.ai | +|--------|-------------|-----------------| +| **Suggest Spec** | Propose a new plot type | "suggest spec" link in catalog | +| **Report Spec Issue** | Problem with a specification | "report issue" link on spec page | +| **Report Impl Issue** | Problem with a library implementation | "report issue" link on impl page | -**The workflow**: +**How it works**: -1. You create Issue with plot idea + add `spec-request` label -2. AI generates spec, creates feature branch -3. Maintainer reviews and adds `approved` label -4. 9 library implementations generate in parallel (tracked via live status table) -5. AI quality review per library (≥ 90 instant, < 90 repair loop, ≥ 50 final threshold) -6. Auto-merge to feature branch, then to main +1. You create Issue (or click link on pyplots.ai) +2. AI validates and processes your input +3. Maintainer reviews and approves +4. AI generates/fixes the code +5. Automated quality review ensures excellence -**Important**: Don't submit code directly! If a plot has quality issues, it means the spec needs improvement, not the -code. +**Important**: Don't submit code directly! If a plot has quality issues, it means the spec needs improvement, not the code. See [contributing.md](docs/contributing.md) for details. @@ -167,6 +166,6 @@ MIT License - see [LICENSE](LICENSE) file for details. **Built by [Markus Neusinger](https://linkedin.com/in/markus-neusinger/)** -[⭐ Star us on GitHub](https://github.com/MarkusNeusinger/pyplots) • [🐛 Report Bug](https://github.com/MarkusNeusinger/pyplots/issues) • [💡 Request Feature](https://github.com/MarkusNeusinger/pyplots/issues) +[⭐ Star us on GitHub](https://github.com/MarkusNeusinger/pyplots) • [💡 Suggest Spec](https://github.com/MarkusNeusinger/pyplots/issues/new?template=spec-request.yml) • [🐛 Report Issue](https://github.com/MarkusNeusinger/pyplots/issues/new?template=report-issue.yml) diff --git a/app/src/pages/CatalogPage.tsx b/app/src/pages/CatalogPage.tsx index 1724369fac..e81c36c3f5 100644 --- a/app/src/pages/CatalogPage.tsx +++ b/app/src/pages/CatalogPage.tsx @@ -7,7 +7,7 @@ import Skeleton from '@mui/material/Skeleton'; import Fab from '@mui/material/Fab'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import { API_URL } from '../constants'; +import { API_URL, GITHUB_URL } from '../constants'; import { useAnalytics } from '../hooks'; import { useAppData, useHomeState } from '../components/Layout'; import { Footer } from '../components'; @@ -156,6 +156,7 @@ export function CatalogPage() { + {/* Breadcrumb links */} + + + pyplots.ai + + + + catalog + + + + {/* Suggest spec link */} - pyplots.ai - - - - catalog + suggest spec diff --git a/app/src/pages/SpecPage.tsx b/app/src/pages/SpecPage.tsx index 03997abc98..f68d269ee0 100644 --- a/app/src/pages/SpecPage.tsx +++ b/app/src/pages/SpecPage.tsx @@ -8,6 +8,7 @@ import IconButton from '@mui/material/IconButton'; import Tooltip from '@mui/material/Tooltip'; import Skeleton from '@mui/material/Skeleton'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import BugReportIcon from '@mui/icons-material/BugReport'; import DownloadIcon from '@mui/icons-material/Download'; import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import ContentCopyIcon from '@mui/icons-material/ContentCopy'; @@ -16,7 +17,7 @@ import CheckIcon from '@mui/icons-material/Check'; import MuiLink from '@mui/material/Link'; import ClickAwayListener from '@mui/material/ClickAwayListener'; -import { API_URL } from '../constants'; +import { API_URL, GITHUB_URL } from '../constants'; import { useAnalytics } from '../hooks'; import { useAppData } from '../components/Layout'; import { LibraryPills } from '../components/LibraryPills'; @@ -179,6 +180,23 @@ export function SpecPage() { [specId, trackEvent, isOverviewMode] ); + // Build report issue URL + const buildReportUrl = useCallback(() => { + const params = new URLSearchParams({ + template: 'report-issue.yml', + spec_id: specId || '', + }); + + if (selectedLibrary) { + params.set('target', 'Implementation (specific library)'); + params.set('library', selectedLibrary); + } else { + params.set('target', 'Specification (affects all libraries)'); + } + + return `${GITHUB_URL}/issues/new?${params.toString()}`; + }, [specId, selectedLibrary]); + // Track page view useEffect(() => { if (specData) { @@ -235,6 +253,7 @@ export function SpecPage() { - - pyplots.ai - - - - catalog - - - {isOverviewMode ? ( - - {specId} + {/* Breadcrumb links */} + + + pyplots.ai - ) : ( - <> + + + catalog + + + {isOverviewMode ? ( + + {specId} + + ) : ( + <> + + {specId} + + + + {selectedLibrary} + + + )} + + + {/* Report issue link - responsive */} + + + {/* Icon for mobile (xs, sm) */} + + {/* Text for desktop (md+) */} - {specId} - - - - {selectedLibrary} + report issue - - )} + + {/* Title */} diff --git a/app/src/types/index.ts b/app/src/types/index.ts index 2ea68db8b7..d1956dab1f 100644 --- a/app/src/types/index.ts +++ b/app/src/types/index.ts @@ -29,7 +29,7 @@ export type FilterCategory = export const FILTER_LABELS: Record = { // Spec-level lib: 'library', - spec: 'example', + spec: 'spec', plot: 'type', data: 'data', dom: 'field', @@ -46,7 +46,7 @@ export const FILTER_LABELS: Record = { export const FILTER_TOOLTIPS: Record = { // Spec-level: WHAT is visualized lib: 'python plotting library', - spec: 'specific plot example by identifier', + spec: 'plot specification by identifier', plot: 'type of visualization or chart', data: 'structure of the input data', dom: 'application domain or field', diff --git a/docs/contributing.md b/docs/contributing.md index 7531fcb781..054702a397 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -6,7 +6,19 @@ pyplots is a specification-driven platform where **AI generates all plot impleme --- -## How to Propose a New Plot Type +## Three Ways to Contribute + +| Action | When to Use | From pyplots.ai | +|--------|-------------|-----------------| +| **[Suggest Spec](#suggest-a-new-plot-type)** | Propose a new plot type | Click "suggest spec" in catalog | +| **[Report Spec Issue](#report-a-spec-issue)** | Problem with a specification | Click "report issue" on spec page | +| **[Report Impl Issue](#report-an-impl-issue)** | Problem with a library implementation | Click "report issue" on impl page | + +All contributions go through GitHub Issues with AI-powered validation and processing. + +--- + +## Suggest a New Plot Type 1. **Create a GitHub Issue** with a descriptive title (e.g., "Radar Chart with Multiple Series") - Do NOT include spec-id in the title @@ -21,7 +33,36 @@ pyplots is a specification-driven platform where **AI generates all plot impleme --- -## How to Improve an Existing Spec +## Report a Spec Issue + +Found a problem with a specification (affects all libraries)? + +1. **From pyplots.ai**: Navigate to the spec page (e.g., `/scatter-basic`) and click "report issue" +2. **From GitHub**: Create issue using the [Report Issue](https://github.com/MarkusNeusinger/pyplots/issues/new?template=report-issue.yml) template +3. **Select "Specification"** as the target +4. **Choose a category**: Visual, Data, Functional, or Other +5. **Describe the issue** + +AI validates your report and adds structured analysis. Maintainers review and approve fixes. + +--- + +## Report an Impl Issue + +Found a problem with a specific library implementation? + +1. **From pyplots.ai**: Navigate to the impl page (e.g., `/scatter-basic/matplotlib`) and click "report issue" +2. **From GitHub**: Create issue using the [Report Issue](https://github.com/MarkusNeusinger/pyplots/issues/new?template=report-issue.yml) template +3. **Select "Implementation"** as the target +4. **Select the library** (matplotlib, seaborn, etc.) +5. **Choose a category**: Visual, Data, Functional, or Other +6. **Describe the issue** + +AI validates your report and adds structured analysis. Maintainers review and approve fixes. + +--- + +## Update an Existing Spec 1. **Create a GitHub Issue** referencing the spec to update 2. **Add the `spec-update` label** @@ -30,7 +71,7 @@ pyplots is a specification-driven platform where **AI generates all plot impleme --- -## How to Trigger Implementation Generation +## Trigger Implementation Generation After a spec has the `spec-ready` label: diff --git a/docs/plot-types-catalog.md b/docs/plot-types-catalog.md index f001561b3d..8f48efbc26 100644 --- a/docs/plot-types-catalog.md +++ b/docs/plot-types-catalog.md @@ -72,7 +72,7 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### line-annotated-events ✅ **Description:** A line plot with annotations marking significant events or milestones along the time series. -### line-interactive 📋 +### line-interactive ✅ **Description:** Line plot with hover tooltips and zoom capability. ### line-loss-training ✅ @@ -81,6 +81,9 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### line-timeseries-rolling ✅ **Description:** Time series plot with rolling average overlay for trend smoothing. +### line-animated-progressive ✅ +**Description:** Animated line plot that progressively draws over time. + --- ## 3. Bar Charts @@ -115,7 +118,7 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### lollipop-basic ✅ **Description:** A lollipop chart displays categorical data with thin lines (stems) extending from a baseline to circular markers (dots) at each data point. -### bar-interactive 📋 +### bar-interactive ✅ **Description:** Bar chart with hover details and click interactions. ### bar-feature-importance ✅ @@ -128,9 +131,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### histogram-basic ✅ **Description:** A histogram displays the distribution of a single continuous variable by dividing the data range into bins and showing the frequency of observations in each bin. -### histogram-normalized ✅ -**Description:** Histogram normalized to show density instead of count. - ### histogram-overlapping ✅ **Description:** Multiple overlapping histograms for comparison. @@ -293,9 +293,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### regression-linear 📋 **Description:** Scatter with linear regression fit and confidence band. -### regression-polynomial ✅ -**Description:** Non-linear regression curve fit. - ### regression-lowess 📋 **Description:** Locally weighted regression smoothing. @@ -305,18 +302,12 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### qq-basic ✅ **Description:** A Q-Q (Quantile-Quantile) plot compares the distribution of a dataset against a theoretical distribution. Points along a diagonal reference line indicate perfect distribution match. -### bland-altman ✅ -**Description:** Agreement plot between two measurements with limits of agreement. - ### bland-altman-basic ✅ **Description:** Bland-Altman agreement plot comparing two measurement methods with mean difference and limits of agreement. ### errorbar-basic ✅ **Description:** An error bar plot displays data points with associated uncertainty or variability represented by bars extending above and below each point. -### error-asymmetric ✅ -**Description:** Error bars with different upper/lower bounds. - ### errorbar-asymmetric ✅ **Description:** Asymmetric error bars plot with different upper and lower error values for each data point. @@ -368,17 +359,14 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### timeseries-decomposition ✅ **Description:** A time series decomposition plot showing the original series broken down into trend, seasonal, and residual components. -### timeseries-rolling ✅ -**Description:** Time series with rolling average overlay. - ### candlestick-basic ✅ **Description:** A candlestick chart displays open, high, low, and close (OHLC) price data for financial instruments over time. ### timeseries-ohlc 📋 **Description:** Open-high-low-close bar chart. -### timeseries-forecast 📋 -**Description:** Historical data with forecast and uncertainty. +### timeseries-forecast-uncertainty ✅ +**Description:** Time series plot with forecast line and uncertainty/confidence band. ### sparkline-basic ✅ **Description:** A sparkline is a small, condensed line chart designed to be embedded inline with text or in dashboard cells. Pure data visualization in minimal space. @@ -415,14 +403,14 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### wireframe-3d-basic ✅ **Description:** A 3D wireframe plot displays a mathematical surface as a mesh of lines connecting grid points, creating a see-through visualization. -### contour-3d 📋 +### contour-3d ✅ **Description:** 3D contour plot. ### bar-3d ✅ **Description:** 3D bar chart. -### line-3d 📋 -**Description:** 3D line plot or trajectory. +### line-3d-trajectory ✅ +**Description:** 3D line plot or trajectory visualization in three-dimensional space. --- @@ -447,7 +435,7 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### network-basic ✅ **Description:** A network graph (node-link diagram) visualizes relationships between entities as nodes connected by edges. -### network-directed 📋 +### network-directed ✅ **Description:** Directed graph with arrows. ### network-weighted 📋 @@ -487,9 +475,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### icicle-basic ✅ **Description:** Rectangular hierarchy visualization with stacked rectangles. -### circle-packing ✅ -**Description:** Nested circles showing hierarchy. - ### circlepacking-basic ✅ **Description:** Circle packing chart displaying hierarchical data as nested circles. @@ -516,9 +501,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ## 20. Animation & Interactive -### animation-line 📋 -**Description:** Animated line plot building over time. - ### scatter-animated-controls ✅ **Description:** An animated scatter plot with play/pause controls, showing data evolution over time with smooth transitions. @@ -575,9 +557,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### wordcloud-basic ✅ **Description:** A word cloud displays text data where word size represents frequency or importance. -### annotated-scatter ✅ -**Description:** Scatter plot with text labels on points. - ### annotated-line 📋 **Description:** Line plot with annotations at key points. @@ -588,9 +567,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### parallel-basic ✅ **Description:** A parallel coordinates plot visualizes multivariate data by representing each variable as a vertical axis and each observation as a line connecting values across all axes. -### parallel-categories ✅ -**Description:** Parallel coordinates for categorical data. - ### parallel-categories-basic ✅ **Description:** Basic parallel categories plot for visualizing flows between categorical variables. @@ -619,13 +595,13 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### stock-volume 📋 **Description:** Stock price with volume bars in synchronized panes. -### indicator-macd 📋 +### indicator-macd ✅ **Description:** MACD technical indicator chart. -### indicator-rsi 📋 +### indicator-rsi ✅ **Description:** Relative Strength Index indicator. -### indicator-bollinger 📋 +### indicator-bollinger ✅ **Description:** Bollinger Bands overlay on price chart. ### indicator-sma 📋 @@ -749,15 +725,9 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### precision-recall ✅ **Description:** Precision-Recall curve for evaluating classification models, especially useful for imbalanced datasets. -### learning-curve ✅ -**Description:** Learning curve showing model performance (training and validation scores) vs training set size for bias-variance diagnosis. - ### learning-curve-basic ✅ **Description:** Model learning curve showing training and validation performance across different training set sizes. -### feature-importance ✅ -**Description:** Horizontal bar chart showing feature importances from machine learning models, sorted by importance value. - ### calibration-curve ✅ **Description:** Calibration curve (reliability diagram) visualizing how well predicted probabilities match actual outcomes for probability calibration. @@ -767,12 +737,9 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### gain-curve ✅ **Description:** Cumulative gains chart for evaluating classification model effectiveness. -### shap-summary 📋 +### shap-summary ✅ **Description:** SHAP (SHapley Additive exPlanations) summary plot showing feature impact on model predictions. -### partial-dependence ✅ -**Description:** Partial dependence plot showing marginal effect of features on predicted outcome. - ### pdp-basic ✅ **Description:** Partial dependence plot showing the marginal effect of a feature on model predictions. @@ -788,9 +755,6 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### residual-plot ✅ **Description:** Residual plot displaying difference between observed and predicted values for regression model diagnostics. -### decision-boundary ✅ -**Description:** Decision boundary visualization showing classifier regions in 2D feature space. - ### contour-decision-boundary ✅ **Description:** Decision boundary classifier visualization using contour plot to show classification regions. @@ -801,15 +765,9 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ## 29. Scientific & Domain-Specific -### spectrum-plot ✅ -**Description:** Frequency spectrum visualization. - ### spectrum-basic ✅ **Description:** Frequency spectrum plot showing signal power or amplitude across frequencies. -### spectrogram ✅ -**Description:** Time-frequency heatmap for audio/signals. - ### spectrogram-basic ✅ **Description:** Spectrogram time-frequency heatmap showing signal intensity over time and frequency. @@ -819,7 +777,7 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### quiver-basic ✅ **Description:** A quiver plot displays vector fields using arrows positioned at grid points. Each arrow represents a vector at that location, with direction indicating the vector's angle and length proportional to its magnitude. -### streamline-basic 📋 +### streamline-basic ✅ **Description:** Streamlines of a vector field as smooth curves. ### stem-basic ✅ @@ -834,24 +792,15 @@ A comprehensive catalog of plot types for the pyplots platform. Each plot is imp ### skewt-basic 📋 **Description:** A Skew-T Log-P diagram displays atmospheric thermodynamic profiles with logarithmic pressure axis and 45-degree skewed temperature isotherms. -### survival-curve ✅ -**Description:** Kaplan-Meier survival analysis plot. - ### survival-kaplan-meier ✅ **Description:** Kaplan-Meier survival plot showing probability of survival over time with censored data. ### forest-basic ✅ **Description:** Meta-analysis effect sizes with confidence intervals. -### volcano-plot ✅ -**Description:** Statistical significance vs fold change. - ### volcano-basic ✅ **Description:** Volcano plot for statistical significance showing -log10(p-value) vs fold change. -### manhattan-plot ✅ -**Description:** Genome-wide association study visualization. - ### manhattan-gwas ✅ **Description:** Manhattan plot for genome-wide association studies showing chromosomal positions vs -log10(p-values). @@ -881,8 +830,8 @@ Printable templates and playful visualizations. ### sudoku-filled 📋 **Description:** Sudoku-Rätsel mit vorgegebenen Zahlen und eindeutiger Lösung. Vorgegebene Zahlen optisch hervorgehoben. -### maze-basic 📋 -**Description:** Rechteckiges Labyrinth mit Start und Ziel. Algorithmisch generiert mit genau einem Lösungsweg. Schwarz-weiß zum Ausdrucken. +### maze-printable ✅ +**Description:** Rectangular maze puzzle with start and goal, algorithmically generated with exactly one solution path. ### maze-circular 📋 **Description:** Rundes Labyrinth aus konzentrischen Ringen. Eingang außen, Ziel im Zentrum. @@ -895,8 +844,8 @@ Printable templates and playful visualizations. ### Codes & Identification -### qr-code 📋 -**Description:** QR-Code generiert aus Text oder URL. Quadratisches Muster mit Positionsmarkierungen, scanbar mit Smartphone. +### qrcode-basic ✅ +**Description:** QR code generated from text or URL, scannable with smartphone. ### barcode-ean 📋 **Description:** EAN-13 Barcode (europäischer Produktcode). Vertikale Striche mit 13 Ziffern darunter, scanbar im Einzelhandel. @@ -911,9 +860,9 @@ Printable templates and playful visualizations. ## Statistics -- **Total Plot Types:** 245+ -- **Implemented:** 191 ✅ -- **Planned:** 54+ 📋 +- **Total Plot Types:** 242 +- **Implemented:** 181 ✅ +- **Planned:** 61 📋 - **Categories:** 30 --- diff --git a/docs/workflows/overview.md b/docs/workflows/overview.md index 517c78b9ed..0fa6e86bd1 100644 --- a/docs/workflows/overview.md +++ b/docs/workflows/overview.md @@ -28,7 +28,26 @@ spec-create.yml (merge job) |-- Triggers sync-postgres.yml ``` -### 2. Implementation Pipeline +### 2. Report Pipeline + +See [Report Issues](report-issue.md) for details. + +``` +User reports issue (from pyplots.ai or GitHub) + | + v (report-pending label auto-added) + | +report-validate.yml + |-- Validates spec/impl exists + |-- AI analyzes the issue + |-- Posts structured analysis comment + |-- Updates labels: report-validated + category:* + | + v +Ready for maintainer review +``` + +### 3. Implementation Pipeline ``` Issue + [generate:{library}] label OR workflow_dispatch @@ -98,6 +117,20 @@ impl-review.yml | `approved` | Human approved specification | Maintainer | | `rejected` | Human rejected | Maintainer | +### Report Labels (on Issues) + +| Label | Meaning | Set By | +|-------|---------|--------| +| `report-pending` | Report submitted, awaiting validation | Auto (template) | +| `report-validated` | AI validated, ready for review | Workflow | +| `report:spec` | Issue with specification | Workflow | +| `report:impl` | Issue with implementation | Workflow | +| `report:impl:{library}` | Specific library affected | Workflow | +| `category:visual` | Design/visual issues | Workflow | +| `category:data` | Data quality issues | Workflow | +| `category:functional` | Non-functional elements | Workflow | +| `category:other` | Other issues | Workflow | + --- ## Quality Workflow @@ -134,6 +167,7 @@ Located in `.github/workflows/`: | `impl-merge.yml` | Merges approved PRs | | `bulk-generate.yml` | Batch implementation generation | | `sync-postgres.yml` | Syncs plots/ to database | +| `report-validate.yml` | Validates user-submitted issue reports | --- diff --git a/docs/workflows/report-issue.md b/docs/workflows/report-issue.md new file mode 100644 index 0000000000..6df4fe62a2 --- /dev/null +++ b/docs/workflows/report-issue.md @@ -0,0 +1,118 @@ +# Report Issues + +Report issues with existing plot specifications or implementations. + +## Overview + +Found a problem with an existing plot? The report system helps you: +1. Submit structured issue reports +2. Get AI-powered analysis and validation +3. Queue issues for maintainer review and fix + +Reports are validated by AI and structured for efficient review. + +--- + +## How to Report + +### From pyplots.ai (Recommended) + +1. Navigate to the plot page (e.g., `pyplots.ai/scatter-basic`) +2. Click **"report issue"** in the breadcrumb bar (top right) +3. Complete the form on GitHub +4. Wait for AI validation + +**Spec issues:** Report from the overview page (e.g., `/scatter-basic`) +**Impl issues:** Report from the detail page (e.g., `/scatter-basic/matplotlib`) + +The form will be pre-filled with the spec ID and library based on your current page. + +### From GitHub + +1. Go to [New Issue](https://github.com/MarkusNeusinger/pyplots/issues/new/choose) +2. Select **"Report Issue"** template +3. Fill in the spec ID, target, library, category, and description +4. Submit + +--- + +## Issue Categories + +| Category | Description | Examples | +|----------|-------------|----------| +| **Visual** | Design/display issues | Overlapping labels, ugly colors, hard to read | +| **Data** | Data quality issues | Unrealistic values, inappropriate context | +| **Functional** | Doesn't work as expected | QR code not scannable, broken interactivity | +| **Other** | Other issues | Unclear spec, missing features | + +--- + +## Labels + +### Report Type + +| Label | Purpose | +|-------|---------| +| `report:spec` | Issue with the specification (affects all libraries) | +| `report:impl` | Issue with a specific implementation | +| `report:impl:{library}` | Specific library affected (e.g., `report:impl:matplotlib`) | + +### Categories + +| Label | Purpose | +|-------|---------| +| `category:visual` | Design/visual issues | +| `category:data` | Data quality issues | +| `category:functional` | Non-functional elements | +| `category:other` | Other issues | + +### Status + +| Label | Purpose | +|-------|---------| +| `report-pending` | Report submitted, awaiting AI validation | +| `report-validated` | AI validated, ready for maintainer review | +| `approved` | Maintainer approved, ready for fix (future) | + +--- + +## Workflow + +``` +User submits report + │ + ▼ (report-pending label auto-added) + │ +report-validate.yml runs: + ├── Validates spec/impl exists + ├── Reads specification and metadata + ├── AI analyzes the issue + ├── Posts structured analysis comment + └── Updates labels (report-validated + category + target) + │ + ▼ +Issue ready for maintainer review + │ + ▼ +Maintainer adds "approved" label + │ + ▼ +(Fix workflow - future implementation) +``` + +--- + +## Tips for Good Reports + +1. **Be specific:** Describe exactly what's wrong +2. **Include context:** What did you expect vs. what happened? +3. **Use screenshots:** Especially for visual issues +4. **Check the spec:** Make sure the spec ID is correct +5. **One issue per report:** Don't combine multiple issues + +--- + +## Related + +- [Workflow Overview](overview.md) +- [Contributing](../contributing.md) diff --git a/prompts/workflow-prompts/report-analysis.md b/prompts/workflow-prompts/report-analysis.md new file mode 100644 index 0000000000..b2b768ea42 --- /dev/null +++ b/prompts/workflow-prompts/report-analysis.md @@ -0,0 +1,107 @@ +# Report Analysis Prompt + +Analyzes user-submitted issue reports and provides structured feedback. + +## Task + +Validate and structure a user-submitted issue report for an existing plot specification or implementation. + +## Input + +From the issue body, extract: +- **spec_id**: The specification ID (e.g., `scatter-basic`, `qrcode-basic`) +- **target**: "Specification" or "Implementation" +- **library**: The library name (if implementation issue) +- **category**: Visual, Data, Functional, or Other +- **description**: User's description of the issue + +## Input Validation (Security) + +**CRITICAL:** Before using any user-supplied values in commands, validate them: + +1. **spec_id** must match pattern `^[a-z0-9-]+$` (lowercase letters, numbers, hyphens only) +2. **library** must be one of: `matplotlib`, `seaborn`, `plotly`, `bokeh`, `altair`, `plotnine`, `pygal`, `highcharts`, `letsplot` + +If validation fails → post comment explaining invalid input, close issue, STOP. + +## Validation Steps + +1. **Validate spec_id format:** + - Must match `^[a-z0-9-]+$` + - If invalid → post comment, close issue, STOP + +2. **Verify spec exists:** + - Check if directory `plots/{spec_id}/` exists + - If not found → post comment, close issue, STOP + +3. **If implementation issue, verify library exists:** + - Check if file `plots/{spec_id}/implementations/{library}.py` exists + - If not found → post comment, close issue, STOP + +4. **Read relevant files:** + - `plots/{spec_id}/specification.md` + - `plots/{spec_id}/metadata/{library}.yaml` (if impl) + +5. **Analyze the issue:** + - Is this a legitimate issue or misunderstanding? + - Does the described problem match what's in the spec/metadata? + - What might be the root cause? + +## Output Format + +Post a comment with this structure: + +```markdown +## Report Analysis + +**Specification:** `{spec_id}` +**Target:** {Specification / Implementation ({library})} +**Category:** {Visual / Data / Functional / Other} + +### Problem Summary +{AI-structured version of the user's description - clear, concise, 2-3 sentences} + +### Analysis +{Assessment of the issue: +- Is this a valid issue? +- What might be causing it? +- Brief technical insight if applicable} + +### Recommended Action +- **Spec update needed:** {Yes/No} - {brief reason} +- **Regeneration needed:** {Yes/No} - {which libraries if yes} + +--- +**Next:** Add `approved` label when ready to fix. +``` + +## Label Updates + +After posting the comment, update labels: + +1. **Remove:** `report-pending` +2. **Add:** `report-validated` +3. **Add target label:** + - For spec issues: `report:spec` + - For impl issues: `report:impl` AND `report:impl:{library}` +4. **Add category label:** + - Visual → `category:visual` + - Data → `category:data` + - Functional → `category:functional` + - Other → `category:other` + +## Title Update + +Update the issue title to format: `[{spec_id}] {brief description}` + +Example: `[qrcode-basic] QR code not scannable` + +Keep the description under 60 characters. Only use the validated spec_id. + +## Important Notes + +- Do NOT add the `approved` label +- Do NOT trigger any fix workflows +- Keep analysis concise but informative +- Be objective - some reports may be user misunderstandings +- If the issue is unclear, ask for clarification instead of closing