Skip to content

build: release 1.22.0 - #1054

Merged
lcottercertinia merged 27 commits into
certinia:mainfrom
lukecotter:feat-release-1.22.0
Sep 18, 2026
Merged

lcottercertinia merged 27 commits into
certinia:mainfrom
lukecotter:feat-release-1.22.0

Conversation

@lukecotter

Copy link
Copy Markdown
Collaborator

📝 PR Overview

Cuts the 1.22.0 release. Bumps the version, lands the changelog entry, deprecates
the legacy Timeline settings, refreshes every README and docs screenshot against
this branch's own build, and adds the scripts that capture and compress them.

The feature work itself is already on main — see the
1.22.0 changelog entry for what ships.

🛠️ Changes made

  • Release 1.22.0, and mark lana.timeline.legacy and lana.timeline.colors deprecated so VS Code strikes them through and files them under Deprecated.
  • Move the screenshots to lana/assets/1_22/, re-shoot them from this branch's build, and drop lana/assets/1_20/.
  • Add scripts/screenshots/capture.sh — builds the extension, opens sample-app in an Extension Development Host, and stops before each shot with its setup written out. Each shot records the width the docs render it at, and is re-prompted when a capture lands under 2x that.
  • Add scripts/screenshots/mov-to-gif.sh for the README hero. A screen recording reports a frame rate it does not deliver, so the real rate is derived from the frames and handed back on the input.
  • Add scripts/screenshots/compress.sh — runs the same optimizer commands as .github/workflows/imgcmp.yml, so a release ships images CI cannot shrink and no optimize PR comes back. Keeps only a smaller result, since gifsicle does not converge on preview.gif.
  • Capture the analysis lens as png. cwebp carries no quality flag, so a webp lost a little on every CI pass; png keeps the round trip lossless.
  • Compress the 1.22 screenshots: 8.21MB down to 7.15MB, every pixel unchanged.

🧩 Type of change (check all applicable)

  • 🐛 Bug fix - something not working as expected
  • ✨ New feature – adds new functionality
  • ♻️ Refactor - internal changes with no user impact
  • ⚡ Performance Improvement
  • 📝 Documentation - README or documentation site changes
  • 🔧 Chore - dev tooling, CI, config
  • 💥 Breaking change

🔗 Related Issues

Release PR — the issues fixed in 1.22.0 are linked from the changelog entry.

✅ Tests added?

  • 👍 yes
  • 🙅 no, not needed
  • 🙋 no, I need help

Docs, images and shell tooling only. pnpm lint passes.

📚 Docs updated?

  • 🔖 README.md
  • 🔖 CHANGELOG.md
  • 📖 help site
  • 🧪 Marked any pre-release-only features
  • 🙅 not needed

Anything else we need to know?

RELEASING.md step 1 still describes capturing screenshots by hand and does not
mention these scripts. Worth a follow-up.

lukecotter and others added 27 commits September 16, 2026 14:44
The find bar shot is the same in every grid, the install and legacy-color shots
document a listing and a deprecated setting, and the go-to-log flow is already a
table. One find shot covers the rest.

The 1_20 folder stays until 1.22.0 publishes: the README on the Marketplace
fetches its images from main at view time.
Four changes land together because they share the same files:

- point every image at lana/assets/1_22, and drop the five removed shots
- graduate the inspector out of pre-release, so the badges and their legend go
- reword the description, dropping the marketing adjective
- replace em and en dashes with a comma or a hyphen

The em dashes inside code spans stay: they are the literal cell a governor
column shows when the log reported no limit.
lana.timeline.legacy and lana.timeline.colors now carry a
markdownDeprecationMessage, so VS Code strikes them through and files them
under Deprecated rather than leaving the warning in the body text.
You drive VS Code; the script owns the window size, naming, scaling, colour
space and metadata, then checks that no EXIF or profile reached the repo.
A plain `tell application "Code" to activate` never returns: Electron does not
answer the AppleEvent, so the script hung for the 120s timeout. The window list
is also empty until the app is focused, which failed the sizing step with
"Invalid index" (-1719).

Both now go through System Events, and a missing window says so.
The script now builds the extension and opens sample-app in an Extension
Development Host against a throwaway user-data-dir, instead of capturing
whatever editor window happened to be frontmost.

That fixes two things. The images come from the branch being released, not from
another branch's window. And the chrome is identical every release - same
theme, same font size, no sidebar, status bar or personal state - so no recent
file, org name or account can reach a published image.

Capture is the editor area rather than the whole window, matching how the
existing screenshots are framed.
Raising the application brings forward whichever window it last had, which is
one of your other editor windows - and if that one sits on another Space, macOS
drags you to that Space mid-capture.

AXRaise on the window whose title names sample-app picks out the host instead.
The wait loop no longer focuses at all, since the window does not exist yet and
a focus there raises the wrong one.
Two fixes.

The host now opens on the lana-dev profile from AGENTS.md instead of a seeded
throwaway one, so the shots carry the layout you actually work in.

Finding the window failed because the accessibility window list reads as empty
until the app is focused, and the previous change had removed focusing from the
wait loop to stop it raising the wrong window. The loop focuses the app again,
which is safe while the host is starting, and the per-shot raise still targets
the host by name. When nothing matches, every open title is listed.
Each shot now names the tab, the view, what is selected, how far the tree is
expanded and where the pointer must not be. The old one-liners left the answer
in the previous image, which is the one thing a re-capture cannot read.
Written as workspace settings on sample-app, not into the lana-dev profile,
which other windows share. sample-app/.vscode is gitignored, so the file never
reaches the repo.

The side bar has no setting - it is UI state - so the script says to press
CMD+B once. VS Code remembers that per workspace afterwards.
Writing workspace settings would have stuck: sample-app keeps them, so every
later dev-host session on that folder loses its activity and status bars.
The panel answers differently per tab - self time by namespace on the Timeline,
findings on Analysis, query plan and SOQL issues on Database - so four shots
with it docked are four different pictures, not one repeated.

inspector.png takes the state none of them can hold: nothing selected, the
whole-log overview. The three stitched call tree views and the Memory view keep
it closed, since those need the width for their columns.
Two detail, two summary, so each panel shows what no other shot can: the
namespace split on the Timeline, the hot path and hot spots on the Call Tree,
findings and the self time spread on Analysis, and the query plan and SOQL
issues on Database.

Analysis carries a note to drag the Findings divider up, since that section
soaks up the free space until its fit is fixed.
…election

The whole-log view is what a log opens in, and each tab answers it differently -
time by category and the namespace split, the hot path and hot spots, findings
and the self time spread, namespace and database duration. Four tabs, four
answers.

The detail panels were the weaker set: three of the four were Details, Call
stack and Call tree over different data. inspector.png now carries the only
selection, on a SOQL statement, where the panel shows a query plan and SOQL
issues that no whole-log view holds.
sample-log.log is logged at APEX_PROFILING FINE and holds no HEAP_ALLOCATE, so
net, gross and peak have nothing to show. The entry stays in the file as a
comment, with the LOG= line that captures it from a log that does.
Capture the shots from the branch's own build, so the images match the
version being released. Each shot carries its setup, the width its page
renders it at, and is re-prompted when a capture lands under 2x that.

Add mov-to-gif.sh for the README hero. A screen recording reports a frame
rate it does not deliver, so the real rate is worked out from the frames
and handed back on the input; left alone it stretches the clip into slow
motion.
Recapture every shot at twice the width its page renders it at. Size each
one to what it holds, instead of a single 400px cap that squeezed a
window-wide strip down to unreadable.

Replace the minimap and governor strip gifs with stills, and give the
inspector its own shot in the README and on its docs page.
The code lens and the custom themes settings were still the 1.20 files,
and both pages render them wider than they were, so both were scaled up.
imgcmp opens a pull request for any image it can still shrink, so a release
ships bytes it has already been asked to fix. Run its own commands at capture
time instead, from capture.sh and from mov-to-gif.sh, which writes the gif
long after a capture run has ended.

Keep only a result that is smaller. gifsicle does not converge on preview.gif,
so without that every capture leaves a multi-megabyte binary dirty for a few
dozen bytes.

Capture the analysis lens as png, so the shot and its compression stay lossless
from here on. cwebp carries no quality flag, so a webp lost a little each pass.
8.21MB down to 7.15MB, every pixel unchanged.
The screenshot step still described shooting every view by hand, and predates
capture.sh, mov-to-gif.sh and compress.sh.

Add the two scripts that hold the asset folder as their default output to the
find/replace list, and widen the verify grep to reach them. Neither fails when
that folder name is stale.
@lcottercertinia
lcottercertinia merged commit dd4d1f2 into certinia:main Sep 18, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants