summaryrefslogtreecommitdiff
path: root/internal/showcase
AgeCommit message (Collapse)Author
11 daysshowcase: align inactivity condition and wording between SVG and gemtextPaul Buetow
Both the rank-history SVG and the gemtext showcase now use the same rule: inactive = AvgCommitAge (last 42 commits on HEAD) > 730 days (~2 years) Changes: - SVG subtitle: 'no meaningful commits in 1+ years' → 'avg commit age > 2 years' - SVG struct comment: updated to describe the 730-day/42-commit rule accurately - gemtext: dropped the secondary 'lastCommit > 365 days' guard (it allowed projects like muttdelay to escape despite a single stray recent commit) - gemtext notice text: 'Last meaningful activity was over 2 years ago' → 'The average age of its last 42 commits exceeds 2 years' Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: simplify inactivity to AvgCommitAge>730 only — drop ↵Paul Buetow
last-activity guard The previous condition (AvgCommitAge>730 AND lastActivityDate>365d) allowed projects like muttdelay to slip through: a single 'add deprecation notice' commit in March 2026 made LastActivityDate recent while AvgCommitAge remained 4228 days (~11.6 years). New rule: AvgCommitAge>730 alone. AvgCommitAge is the mean age of the last 42 commits, so a genuinely revived project needs ~42 recent commits before the average drops below the threshold — one stray commit cannot mask decay. LastActivityDate (all-branches) is kept in the struct for potential future use. Also removes the now-unused 'time' import from rank_history_svg.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: show project score in rank-history SVG tooltipPaul Buetow
Add Score float64 to svgProjectData (serialised as JSON) so the JS tooltip can display it. A 'score: X.X' line is inserted into the tooltip body just below the project name title and above the weekly snapshot rows, rendered in a dimmer grey (#888) to visually separate it from the rank-history data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: activity check uses all-branch last-commit date to avoid false ↵Paul Buetow
inactivity Problem: projects with active development on a non-default branch (e.g. all recent work on 'master' while the workdir HEAD is on 'screenshots') were being greyed out in the rank-history SVG despite recent commits. Fix: - Add LastActivityDate string to RepoMetadata, computed with 'git log --all -1 --pretty=format:%ai' (all local branches, no fetch). Code stats (AvgCommitAge, CommitCount, LOC, score) remain HEAD-only per the configured-branch rules. - SVG inactivity check uses LastActivityDate (falling back to LastCommitDate if the field is absent in older cache entries). - getLastActivityDate() added to metadata.go alongside getLastCommitDate(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: add subtitle note explaining grey lines are inactive projectsPaul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: grey out inactive projects in rank history SVGPaul Buetow
Inactive projects (avgCommitAge > 730 days AND last commit > 365 days ago, matching the gemtext inactivity notice) are now visually distinguished: Default state - Plot line: rendered as #555 grey at 0.3 opacity so it is visible but does not compete with active coloured lines. - Legend entry: dimmed to 0.35 opacity. On legend-entry hover - The line snaps to its project colour and is bolded (stroke-width 3) at full opacity — identical behaviour to active projects. - Other inactive lines remain at their grey resting state (not dimmed to 0.08 alongside active ones) so they stay readable. On leave - Both stroke colour and opacity are restored per-project: grey+0.3 for inactive, colour+0.55 for active. The inactivity flag is stored in the PROJECTS JSON (inactive:true/false) so all JS state transitions can consult it without touching the DOM attributes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: extend rank history to 32 weeks, trim leading empty columnsPaul Buetow
Previously the graph was fixed at 5 weekly data points. Now: - rankHistoryPoints raised from 5 → 32 so the store accumulates up to 32 weekly snapshots and each project carries 32 history entries. - GenerateRankHistorySVG trims all leading all-zero columns before layout, so the graph only spans from the oldest week that any project actually has data — no empty space on the left when history is short. - displayPoints (trimmed width) drives all layout math: xPos(), xLabels, and the X-axis loop; numPoints is only used for the reversal placement. - xLabelStep() thins X-axis text labels when many columns are visible (step 1 for ≤6, 2 for ≤12, 4 for ≤24, 8 for >24 columns) while still drawing a grid line at every column and always labelling 'now'. - Test: give alpha a Spot at '4w' so trimming keeps that column and the time-axis label test still finds '4w ago' in the output. - New TestXLabelStep_ReturnsSensibleSteps covers the new helper. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: stretch SVG to fill browser window in both axes (non-uniform scale)Paul Buetow
Replace the uniform min(W/CHART_W, H/CHART_H) scale — which left blank bars along the shorter axis — with independent x/y scales: sx = W / CHART_W sy = H / CHART_H This maps the fixed CHART_W × CHART_H design coordinate space exactly onto the current window dimensions, filling every pixel with no letterboxing. The centering translate is no longer needed and is removed. chartEl.getScreenCTM().inverse() handles the two-component transform correctly, so tooltip hit-testing remains accurate at any window shape. Tooltip boundary clamping still uses CHART_W / CHART_H (chart coordinates). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: thinner default line width (1→1px), hovered line stays bold at 3pxPaul Buetow
Unselected lines are now visually lighter so the graph is less cluttered. The hovered/active line keeps its 3px bold stroke (set by JS) which makes the selection immediately obvious against the thinner background lines. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: rename SVG to showcase-rank-history.svg, link at top of gemtextPaul Buetow
- Rename output file from rank-history.svg to showcase-rank-history.svg so it sits alongside the showcase.gmi.tpl with a consistent name prefix. - Move the rank-history link from below the intro paragraph to immediately after the date line, making it the first thing a reader sees. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: fix SVG viewport fill — use position:fixed and explicit px ↵Paul Buetow
dimensions width/height="100%" on a standalone SVG file resolves relative to the browser's default body element, which has 8px margins on all sides, so the SVG never actually reached the edges of the window. Fix: - Add style="position:fixed;top:0;left:0;display:block" to the <svg> root so it is taken out of normal flow and positioned flush against the viewport. - Have rescale() set explicit pixel width/height attributes (via window.innerWidth / window.innerHeight) instead of relying on percentage inheritance that was broken by the body margin. - Also remove a bare % sign from an inline JS comment to prevent fmt.Fprintf from misinterpreting it as a format verb. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysshowcase: dynamic SVG scaling fills browser window without letterboxingPaul Buetow
Replace the fixed viewBox+preserveAspectRatio approach with JS-driven rescale(). The SVG root now has no viewBox; instead rescale() runs on load and on every resize event: - Sets the SVG viewBox to the actual window dimensions. - Computes a uniform scale s = min(W/CHART_W, H/CHART_H) and a centering translate so the chart group fills the window edge-to-edge along the limiting axis with no empty bars. - All chart elements are wrapped in <g id="chart"> so a single transform attribute repositions everything together. The tooltip coordinate conversion switches from svgEl.getScreenCTM() to chartEl.getScreenCTM() so cursor positions are expressed in chart- local coordinates (CHART_W × CHART_H space) after the rescale transform. Similarly, tooltip boundary clamping uses the CHART_W/CHART_H constants instead of the now-dynamic svgEl.viewBox.baseVal. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysfeat(showcase/svg): add legend panel, fix tooltip overlap, fill browser windowPaul Buetow
- 3-column legend panel to the right of the plot; each colored square is labelled with the project name (truncated at 12 chars); hovering a legend entry highlights the corresponding line and opens the same tooltip as hovering the line directly - Fix tooltip title/body overlap: body rows now start at y=32 (below the title baseline at y=18) so project name and rank rows never collide - Tooltip width adapts to the project name length (160–300 px) - SVG uses width/height='100%' + preserveAspectRatio='xMidYMid meet' so Firefox fills the browser window while keeping the aspect ratio - Add truncateName and xmlEscape helpers for safe legend text rendering - allLG (legend groups) dimmed/restored in onEnter/onLeave alongside allPG Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 daysfeat(showcase): add interactive SVG rank history graphPaul Buetow
Generate rank-history.svg alongside showcase.gmi.tpl on every showcase run (full or single-repo update). The graph shows a Google-Trends-style polyline per project from oldest to newest; hovering highlights the selected project and shows a tooltip with rank and snapshot date for each recorded week. Key implementation details: - new file internal/showcase/rank_history_svg.go with GenerateRankHistorySVG - golden-ratio HSL colour spacing for visually distinct project lines - M/L SVG path commands with gaps for weeks with no snapshot data - PROJECTS JSON array embedded in CDATA script for JS tooltip rendering - rank-history.svg linked from the gemtext showcase header Changes to showcase.go: - updateShowcaseFile returns ([]ProjectSummary, error) so the caller can pass the full merged+sorted list to writeRankHistorySVGFile - extract showcaseOutputDir() helper to deduplicate the hardcoded ~/git/foo.zone-content/gemtext/about path used in four places - log a warning (instead of silently continuing) when getRepositories fails inside updateShowcaseFile so data loss is visible to the operator Bug fixes found during review: - off-by-bounds panic: reversal loop used revIdx=numPoints-1-j as source index but numPoints is a constant (5) not len(s.RankHistory); replaced with j as source and numPoints-1-j as destination so partial slices never panic - redundant getElementById in JS onEnter replaced with allPG[idx] which is already the correct element Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21feat(ai): update AI tool order and switch to glm-5.1:cloud via ollama launchv0.17.1Paul Buetow
- Default AI tool fallback order: opencode -> hexai -> claude -> amp - Switch opencode invocation to: ollama launch opencode --model glm-5.1:cloud -y -- run - Update helptext and comments across all commands
2026-03-28feat(sync): auto-sync full backups and showcase cgit linksv0.17.0Paul Buetow
2026-03-28feat(showcase): support per-repo stats branchesv0.16.0Paul Buetow
2026-03-19chore(release): bump version to 0.15.8v0.15.8Paul Buetow
Remove aichat support from release notes and showcase AI tool chains. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18feat(ai): add opencode as default AI tool for releases and showcasesv0.15.6Paul Buetow
Replace amp with opencode (local Ollama gpt-oss:120b) as the default AI tool. Opencode is tried first in both release notes generation and showcase summaries, with amp as the first fallback in the chain: opencode → amp → hexai → claude → aichat. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-03-11fix(showcase): penalize unreleased repositoriesv0.15.4Paul Buetow
2026-03-11fix(showcase): rebalance scoring and compact historyv0.15.3Paul Buetow
2026-03-11fix(showcase): compact rank history displayv0.15.2Paul Buetow
2026-03-11fix(showcase): sanitize malformed showcase summariesv0.15.1Paul Buetow
2026-03-11refactor(internal): extract sync and summary helpersPaul Buetow
2026-03-11fix(sync): stop relying on process cwdPaul Buetow
2026-02-22feat(showcase): add weekly rank history and header movementPaul Buetow
2026-02-22fix(showcase): exclude backup-suffixed repositoriesPaul Buetow
2025-12-31feat: implement logarithmic scoring system for showcase rankingv0.11.0Paul Buetow
- Remove vibe-coded and AI-assisted detection from showcase - Add project rank numbers to showcase headers - Implement logarithmic score: log10(LOC) * 1000 / (avgCommitAge + 1) - Replace 'Recent Activity' display with 'Score' - Update sorting to use score (highest first) - Score balances project size and recent activity - Bump version to 0.11.0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-10-31feat: improve vibe-coded detection to include 'vibe-coded' variant, bump ↵v0.10.1Paul Buetow
version to 0.10.1 Amp-Thread-ID: https://ampcode.com/threads/T-efdb3f47-3436-4ab4-9f00-6ad3d8b16af2 Co-authored-by: Amp <amp@ampcode.com>
2025-10-31feat: implement amp AI tool support and replace Taskfile with Magev0.10.0Paul Buetow
- Add amp as default AI tool for release notes and showcase generation - Fallback chain: amp → hexai → claude → aichat - Replace Taskfile.yaml with magefile.go for build automation - Update all documentation (README.md, AGENTS.md, doc/development.md) - Update version to 0.10.0 Amp-Thread-ID: https://ampcode.com/threads/T-735ba1e2-0255-4b43-8ed1-6c0d2f78301b Co-authored-by: Amp <amp@ampcode.com>
2025-08-31refactor(showcase): remove Codex LLM supportPaul Buetow
docs: update showcase help text and AI tool fallback to exclude Codex.
2025-08-31chore(repo): snapshotPaul Buetow
2025-08-31some fixesPaul Buetow
2025-07-20feat(showcase): detect AGENT.md for AI Assist in showcase generationPaul Buetow
Also updates function comment to reflect new detection logic. Now detects CLAUDE.md, GEMINI.md, AGENTS.md, and AGENT.md as AI Assist indicators. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
2025-07-20feat: add AGENTS.md detection for AI-assisted projects in showcasev0.8.4Paul Buetow
- Added AGENTS.md to the list of AI-related files checked by detectAIUsage() - Projects with AGENTS.md will now be marked as AI-assisted in the showcase - Bumped version to 0.8.4 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-20feat: remove code snippets from showcase outputPaul Buetow
Removed code snippet generation from the showcase.gmi.tpl template to simplify the output and focus on project descriptions. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-19feat: add aichat support for showcase project descriptionsv0.8.1Paul Buetow
- Add --ai-tool flag to showcase command (default: claude) - Support aichat as alternative to claude for generating project summaries - When using aichat, read README.md and pipe it as input - Update documentation and examples - Bump version to 0.8.1 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12feat: add vibe-coded project detection to showcasev0.6.0Paul Buetow
- Add detection for "vibe code" mentions in README files - Display vibe-coded indicator in project summaries - Include vibe-coded count in overall statistics - Clarify that AI-assisted count includes vibe-coded projects - Bump version to 0.6.0 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09feat: improve code snippet line length handling in showcasePaul Buetow
- Prefer code snippets with lines <= 80 characters - Try multiple files to find snippets with good line lengths - Intelligently break long lines at appropriate points (commas, operators, etc.) - Maintain proper indentation for continuation lines This prevents long code lines from breaking the showcase layout. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09fix: change 'open source projects' to 'side projects' in showcase introPaul Buetow
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09feat: add latest release version and date to project summariesPaul Buetow
- Display latest release tag and date for each project - Filter tags to only show version-like tags (e.g., v1.0, 2.3, 1.0.0) - Projects with releases show "🏷️ Latest Release: v1.0.0 (2024-01-15)" - Projects without releases show "🧪 Status: Experimental (no releases yet)" - Added LatestTagDate field to metadata structure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09feat: add AUTO label to code blocks in showcasePaul Buetow
- Code blocks now use ```AUTO instead of plain ``` - Enables automatic syntax highlighting detection 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09feat: add release status statistics to overall project summaryPaul Buetow
- Count projects with version tags vs experimental projects - Display release statistics in overall stats section - Shows percentage breakdown of released vs experimental projects 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09feat: add SVG image support and experimental project detectionPaul Buetow
- Fix image extraction regex to handle unquoted HTML img src attributes - Add detection of version tags and experimental status for projects - Display "Experimental (no releases yet)" for projects without tags - Successfully extracts SVG images from projects like ior 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08feat: remove unnecessary indentation from code snippetsPaul Buetow
- Add removeCommonIndentation function to strip common leading whitespace - Code snippets now start at column 0 when possible - Preserves relative indentation within the code - Works with both spaces and tabs 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08feat: improve language detection with shebang parsingPaul Buetow
- Always check shebang lines for executable files without extensions - Detect AWK scripts with .cgi extension (like awksite) - Support detecting Python, Ruby, Perl, Raku, JavaScript, PHP, Lua via shebang - Add comprehensive shebang parsing for awk/gawk/mawk variants - awksite now correctly shows as 72.1% AWK 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08fix: remove syntax highlighting labels from code blocksPaul Buetow
- Remove language identifiers from code blocks (e.g., ```go becomes ```) - Remove extractLanguageForHighlighting function as it's no longer needed - Keep the language info in the description line above the code block 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08feat: add Raku language support and move generation date to topPaul Buetow
- Add Raku (Perl 6) language detection for .raku, .rakumod, .p6, .pm6 files - Add Raku to code extractor and syntax highlighting (uses perl highlighting) - Move 'Generated on' date to the top of the page below main header - guprecords now correctly shows as 100% Raku - ior now shows Raku at 5.4% of the codebase 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08docs: add explanation of project ordering in showcase introductionPaul Buetow
- Update introduction paragraph to explain project ordering - Clarify that projects are sorted by recent activity - Most actively maintained projects appear first 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08feat: add AWK language support for syntax highlightingPaul Buetow
- Add AWK to language detection (.awk files) - Add AWK to code extractor language extensions - Add AWK to syntax highlighting mapping - Note: cpuinfo project is detected as Make-only because the main script has no file extension (it's a shell script with embedded AWK) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>