| Age | Commit message (Collapse) | Author |
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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>
|
|
Increase full sync recent-days window from 7 to 17 days.
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>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduce an opt-in throttle that skips inactive repos based on local
activity and per-repo cooldowns, and bump the version to 0.12.0.
Co-authored-by: Cursor <cursoragent@cursor.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>
|
|
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-2116c664-03a6-4a6c-ad47-26f43a91567f
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>
|
|
|
|
|