Releases: fat-tails-io/ft-tracklink
v0.0.6 — Phase 6
v0.0.6 — Phase 6 Jira custom fields
Circuit, segment, and link count are now visible on the Jira issue screen without opening Track Linker. The issue action also defaults to the newest saved segment and labels it clearly in the picker.
What's new
| Area | Behaviour |
|---|---|
| Custom fields | Three app-owned fields: F1 Circuit, F1 Segment, F1 Track links |
| Write policy | Updated from the latest KVS link after each successful link (create subtask included) |
| Field API | Resolves Forge module keys → Jira customfield_* ids; bulk update via app field value API |
| Multi-link UX | Saved segments newest-first; Latest label; post-link jumps to new segment |
| Resilience | Link succeeds even if field write fails; UI shows a warning flag |
Verify in Jira
- Admin — After deploy, add F1 Circuit, F1 Segment, and F1 Track links to your project issue screen (Context or Details).
- Open an issue → Track Linker → brush a segment → Link to ISSUE-KEY.
- Close the action → issue view shows circuit, segment metres, and link count (e.g.
3 segmentswhen N > 1). - Link a second segment → fields update to the newest link; reopen action → newest highlighted.
- Pick an older saved segment → map highlights it; issue fields stay on latest (by design).
Deploy
npm run ci
npm run forge:deploy
npm run forge:install:upgrade # re-consent for write:app-data:jira if promptedFollow-up (not in this tag)
- Issue action mop-up — performance + layout (
.cursor/plans/phase-5-issue-action-mopup.plan.md) - Post-v1 UI consolidation — fewer workflow steps (
.cursor/plans/post-v1-ui-consolidation.plan.md) - Field backfill for issues linked before v0.0.6
- Same-circuit multi-segment overlay on one map
- Phase 7 — Rovo Chat entry point
v0.0.5 — Phase 5
v0.0.5 — Phase 5 Issue-centric workflow
Issue action is now the primary path: brush a segment on the map and link it to the open Jira issue (ADF comment + thumbnail + stored metadata). You can add up to 10 segments per issue, highlight saved segments on the map, or create a subtask that carries the same segment data.
What's new
| Area | Behaviour |
|---|---|
| Link to issue | linkSelectionToIssue — append link in Forge storage + Jira comment (not description edit) |
| Multi-segment | links[] per issue, max 10; list in UI with “Show on map” |
| Restore | HIGHLIGHT_SEGMENT — blue overlay for saved startDistanceM–endDistanceM |
| Subtask | createLinkedTrackIssue — child Subtask under current issue (same project) |
| Bootstrap | Opens on most recent valid linked circuit; picker choice sticks |
| Context | getIssueTrackContext — summary + existing links |
Verify in Jira
- Open an issue → Track Linker action.
- Brush a segment → Link to ISSUE-KEY → Activity shows comment + attachment; Linked segments: 1/10.
- Brush another area → second link appends; select a saved segment → map highlights it.
- Create subtask with segment → new subtask under parent with its own link/comment.
- Issue with no links → default/last circuit loads; pick a circuit manually — map stays loaded.
Deploy
npm run build
npm run forge:deploy
npm run forge:install:upgrade # if already installedFollow-up (not in this tag)
- Issue action mop-up — performance + layout (
.cursor/plans/phase-5-issue-action-mopup.plan.md) - Phase 6 — Jira custom fields on the issue screen
v0.0.4 — Phase 4
v0.0.4 — Phase 4 High-precision track sampling
This release delivers track-relative brush selection: drag on the circuit centerline and get startDistanceM / endDistanceM in metres, high-precision WGS84 endpoints, and optional sampled points for Jira descriptions. Bundled Silverstone and Yas Marina include FastF1/MultiViewer-derived corner and marshal detail (offline ETL, transposed onto f1-circuits centerlines). The map Frame fills its shell correctly, and Track data attribution is shown in the UI (collapsed by default).
What's new
| Area | Behaviour |
|---|---|
| Geometry | track-geometry.js — densify, arc-length index, lenient brush hit-testing, geoLengthM() |
| Selection payload | trackRelative, segment geo, sampledPoints on TRACK_SECTION_SELECTED |
| Bundled data | Enriched gb-1948, ae-2009 with layer2Source: fastf1-multiviewer |
| ETL (dev only) | tools/transpose-circuit-detail.py, npm run enrich:tracks |
| Licensing | LICENSE/fastf1-multiviewer.md, README + in-app collapsible attribution |
| Layout | TrackViewerFrame 600px height; viewer layout sync |
Verify in Jira
- Open global page or issue action — pick Silverstone or Yas Marina; map shows centerline and corner markers.
- Brush Select — drag along a straight; Along track shows non-zero metres (e.g.
1240.0 m – 1580.0 m). - Create-issue Description includes track-relative line when selection exists.
- Scroll to Track data — collapsed summary; Show attribution details expands f1-circuits + FastF1/MultiViewer credits.
- Switch circuit — map reloads; brush still works on the new track.
Deploy
npm run build
npm run forge:deploy
npm run forge:install:upgrade # if already installedNext
Phase 5 — link selection to the current issue (persist trackRelative, circuit id, thumbnail on the issue).
v0.0.3 — Phase 3
v0.0.3 — Phase 3 Multi-circuit library
This release adds a first-class circuit catalog: pick Silverstone or Yas Marina from a dropdown, seed bundled tracks on first load, and upload custom circuits into the same index. Brush-select and create-issue behaviour from v0.0.2 is unchanged; arc-length sampling and link-to-current issue remain Phase 4–5.
What’s new
| Area | Behaviour |
|---|---|
| Catalog | KVS keys circuit-catalog + track-geojson-{circuitId}; legacy track-geojson migrated on seed/read |
| Bundled tracks | gb-1948 (Silverstone), ae-2009 (Yas Marina) — centerline + seeded corner points for map/Rovo prep |
| UI | Circuit Select at top of shell; Add custom circuit writes catalog + geometry |
| Viewer | Red corner markers for role: corner features |
| Deploy | Bundled assets ship as .json under src/data/tracks/ (Forge webpack cannot import .geojson) |
Resolvers
listCircuits— catalog metadata + last-used circuitgetCircuitGeoJson— geometry for onecircuitIdseedCircuitLibrary— idempotent bundled seed (forceGeooptional)setLastCircuit— persist picker choicedeleteCircuit— admin removal
UX refinements (same tag)
- Create Jira issue form — summary/description reset on each new brush, circuit change, Reset view, and Clear selection (avoids stale Silverstone text when switching to Yas Marina).
- Sync tracks for deploy — after editing
resources/tracks/*.geojson, copy tosrc/data/tracks/*.json(seeresources/tracks/README.md).
Verify in Jira
- Open global page or issue action — Circuit dropdown lists at least Silverstone and Yas Marina.
- Switch circuit — map reloads; corner dots visible when zoomed.
- Brush-select on circuit A, then B — create-issue Summary matches the active circuit name.
- Reset view — clears brush and resets create-issue fields (project key preserved on issue action).
- Add custom circuit — upload appears in dropdown after save.
Deploy
npm run forge:deploy
npm run forge:install:upgrade # if already installedNext
Phase 4 — high-precision track sampling (startDistanceM, brush-to-segment on centerline).
v0.0.2 — Phase 2
v0.0.2 — Phase 2 ADS UI Kit shell
This release polishes everything outside the track map Frame so the app matches Jira in light and dark theme. Core behaviour is unchanged from v0.0.1: upload GeoJSON, brush-select, create a Jira issue with thumbnail.
What moved out of the Frame
| Before (Phase 0–1) | After (Phase 2) |
|---|---|
| Pan / Brush buttons inside D3 viewer | UI Kit ButtonGroup above <Frame> |
| Status text in Frame footer | UI Kit status line (color.text.subtle) |
| Plain boxes and warning background | ADS tokens, SectionMessage, Label |
Frame ↔ UI Kit events:
VIEWER_SET_MODE— UI Kit → Frame (pan|brush)VIEWER_STATUS— Frame → UI Kit (load, brush, reset messages)
Verify in Jira
- Global page and issue action — toggle Jira light/dark; panels, warnings, and modals should stay readable.
- Map toolbar — Pan/Zoom vs Brush Select only above the map (not inside the canvas).
- Upload modal — validation flags (error/success).
- Empty states — no track, no selection, create issue without selection.
Next
Phase 3 — multi-circuit catalog and picker.
v0.0.1 — Phase 1
v0.0.1 — Phase 1 foundation refactor
This release is a structural refactor, not a new product capability. If you used v0.0.0, you get the same demo after install: global page and issue action, D3 track viewer, GeoJSON upload, brush selection, create Jira issue with thumbnail.
Why Phase 1 was necessary
Phase 0 shipped a working prototype in one file (~420 lines in index.tsx). Both Forge modules (jira:globalPage and jira:issueAction) rendered the same UI, with no distinction for issue context and no clear place to add roadmap features without editing that monolith again.
Later phases need separate extension points:
| Phase | Needs from frontend structure |
|---|---|
| 2 — ADS | One shell to tokenize; move map controls out of Frame |
| 3 — Catalog | Circuit picker in shared chrome |
| 4 — Sampling | Richer selection payload + tested geometry helpers |
| 5 — Issue-centric | Issue action hero path: link to current issue, restore segment |
| 6–7 — Fields / Rovo | Same domain layer as UI |
Phase 1 establishes those boundaries before those features land.
What changed structurally
Phase 0: index.tsx (everything)
Phase 1: index.tsx (router)
├── GlobalTrackLinker
├── IssueTrackLinker (+ useProductContext)
└── TrackLinkerShell (Frame + upload)
hooks: useTrackLinkerCore, useCreateIssueFromSelection
panels: SelectionSummaryPanel, CreateIssuePanel
- Entry routing — Issue action loads
IssueTrackLinker(issue key, project pre-fill when Forge provides context). Global page loadsGlobalTrackLinker. - Shared chrome —
TrackLinkerShellowns layout, Frame, and upload modal wiring once. - Viewer orchestration —
useTrackLinkerCorecentralizesFRAME_READY,GEOJSON_LOAD,TRACK_SECTION_SELECTED, and track load. - Jira create path —
useCreateIssueFromSelectionandCreateIssuePanelisolate create-issue behavior (Phase 5 will add link/create variants beside this). - Hygiene — Removed unused modals and debug noise; added Jest tests for storage and selection formatting.
- TypeScript and Forge typings — CI now runs
type-check, ESLint, and Jest together. Resolver handlers useRequest<T>from@forge/resolver; the UI uses typedinvokefor create-issue responses. Issue-action context is mapped viasrc/types/forge-context.tsto the documentedjira:issueActionextension shape (issue.key,project.key, etc.). This follows the same principle as Atlassian’s CHANGE-2652 (TypeScript bundler EAP): your TypeScript version and config drive compile-time checks in development. This release does not enablebundler: typescriptinmanifest.yml(EAP, not for production); see docs/typescript-forge.md.
What did not change
- Backend resolvers and single
track-geojsonstorage model - Frame viewer (
resources/track-viewer) behavior - Primary action is still create a new issue from a brush selection (not link-to-current — Phase 5)
Install (same as v0.0.0)
npm installand buildresources/track-viewer(see SETUP.txt)- Set
REPLACE-WITH-APP-IDinmanifest.ymlto your Forge app id forge deployandforge install