| Age | Commit message (Collapse) | Author |
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
- 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
|
|
|
|
|
|
Remove aichat support from release notes and showcase AI tool chains.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 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>
|
|
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>
|
|
- 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>
|
|
docs: update showcase help text and AI tool fallback to exclude Codex.
|
|
|
|
|
|
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>
|
|
- 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>
|
|
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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|
|
- 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>
|