Skip to content

Releases: fat-tails-io/ft-tracklink

v0.0.6 — Phase 6

05 Jun 12:52

Choose a tag to compare

v0.0.6 — Phase 6 Pre-release
Pre-release

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

  1. Admin — After deploy, add F1 Circuit, F1 Segment, and F1 Track links to your project issue screen (Context or Details).
  2. Open an issue → Track Linker → brush a segment → Link to ISSUE-KEY.
  3. Close the action → issue view shows circuit, segment metres, and link count (e.g. 3 segments when N > 1).
  4. Link a second segment → fields update to the newest link; reopen action → newest highlighted.
  5. 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 prompted

Follow-up (not in this tag)

v0.0.5 — Phase 5

04 Jun 18:30

Choose a tag to compare

v0.0.5 — Phase 5 Pre-release
Pre-release

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 startDistanceMendDistanceM
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

  1. Open an issue → Track Linker action.
  2. Brush a segment → Link to ISSUE-KEY → Activity shows comment + attachment; Linked segments: 1/10.
  3. Brush another area → second link appends; select a saved segment → map highlights it.
  4. Create subtask with segment → new subtask under parent with its own link/comment.
  5. 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 installed

Follow-up (not in this tag)

v0.0.4 — Phase 4

04 Jun 11:38

Choose a tag to compare

v0.0.4 — Phase 4 Pre-release
Pre-release

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

  1. Open global page or issue action — pick Silverstone or Yas Marina; map shows centerline and corner markers.
  2. Brush Select — drag along a straight; Along track shows non-zero metres (e.g. 1240.0 m – 1580.0 m).
  3. Create-issue Description includes track-relative line when selection exists.
  4. Scroll to Track data — collapsed summary; Show attribution details expands f1-circuits + FastF1/MultiViewer credits.
  5. 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 installed

Next

Phase 5 — link selection to the current issue (persist trackRelative, circuit id, thumbnail on the issue).

v0.0.3 — Phase 3

03 Jun 13:39

Choose a tag to compare

v0.0.3 — Phase 3 Pre-release
Pre-release

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 circuit
  • getCircuitGeoJson — geometry for one circuitId
  • seedCircuitLibrary — idempotent bundled seed (forceGeo optional)
  • setLastCircuit — persist picker choice
  • deleteCircuit — 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 to src/data/tracks/*.json (see resources/tracks/README.md).

Verify in Jira

  1. Open global page or issue action — Circuit dropdown lists at least Silverstone and Yas Marina.
  2. Switch circuit — map reloads; corner dots visible when zoomed.
  3. Brush-select on circuit A, then B — create-issue Summary matches the active circuit name.
  4. Reset view — clears brush and resets create-issue fields (project key preserved on issue action).
  5. Add custom circuit — upload appears in dropdown after save.

Deploy

npm run forge:deploy
npm run forge:install:upgrade   # if already installed

Next

Phase 4 — high-precision track sampling (startDistanceM, brush-to-segment on centerline).

v0.0.2 — Phase 2

03 Jun 12:33

Choose a tag to compare

v0.0.2 — Phase 2 Pre-release
Pre-release

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

  1. Global page and issue action — toggle Jira light/dark; panels, warnings, and modals should stay readable.
  2. Map toolbar — Pan/Zoom vs Brush Select only above the map (not inside the canvas).
  3. Upload modal — validation flags (error/success).
  4. Empty states — no track, no selection, create issue without selection.

Next

Phase 3 — multi-circuit catalog and picker.

v0.0.1 — Phase 1

03 Jun 11:36

Choose a tag to compare

v0.0.1 — Phase 1 Pre-release
Pre-release

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 loads GlobalTrackLinker.
  • Shared chromeTrackLinkerShell owns layout, Frame, and upload modal wiring once.
  • Viewer orchestrationuseTrackLinkerCore centralizes FRAME_READY, GEOJSON_LOAD, TRACK_SECTION_SELECTED, and track load.
  • Jira create pathuseCreateIssueFromSelection and CreateIssuePanel isolate 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 use Request<T> from @forge/resolver; the UI uses typed invoke for create-issue responses. Issue-action context is mapped via src/types/forge-context.ts to the documented jira:issueAction extension 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 enable bundler: typescript in manifest.yml (EAP, not for production); see docs/typescript-forge.md.

What did not change

  • Backend resolvers and single track-geojson storage 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)

  1. npm install and build resources/track-viewer (see SETUP.txt)
  2. Set REPLACE-WITH-APP-ID in manifest.yml to your Forge app id
  3. forge deploy and forge install