╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │363 var to_master = try template_repo.switchDir(io, allocator, .{ .target = .{ .ref = .{ .kind = .head, .name = "master" } } }); │ │364 defer to_master.deinit(); │ │365 } │ │366 + } │ │367 + │ │368 + // seed issues so every repo's issue tracker has content │ │369 + const issue_data = [_]struct { │ │370 + title: []const u8, │ │371 + description: []const u8, │ │372 + tags: []const u8, │ │373 + }{ │ │374 + .{ │ │375 + .title = "Crash on startup when config file is missing", │ │376 + .description = "Running the program without a config file present dereferences a null pointer and segfaults. Fall back to the built-in defaults and log a warning instead.", │ │377 + .tags = "bug\x00priority-high\x00crash", │ │378 + }, │ │379 + .{ │ │380 + .title = "Support dark mode in the settings panel", │ │381 + .description = "The settings panel is always rendered with the light palette even when the rest of the app is in dark mode. Read the active theme and pick colors accordingly.", │ │382 + .tags = "enhancement\x00ui\x00theme", │ │383 + }, │ │384 + .{ │ │385 + .title = "Memory leak when reconnecting after network failure", │ │386 + .description = "Each reconnect allocates a new connection state without freeing the previous one. After a flaky network session, memory usage grows by several megabytes per hour.",│ │387 + .tags = "bug\x00memory\x00networking", │ │388 + }, │ │389 + .{ │ │390 + .title = "Document the plugin API", │ │391 + .description = "The plugin interface has no documentation beyond the header comments. Add a guide covering the lifecycle hooks, the event callbacks, and a minimal working plugin.",│ │392 + .tags = "documentation\x00plugins", │ │393 + }, │ │394 + .{ │ │395 + .title = "Slow file indexing on large directories", │ │396 + .description = "Indexing a directory with more than 100k files takes several minutes because every entry is stat'd twice. Cache the first stat result and batch the reads.", │ │397 + .tags = "performance\x00indexing", │ │398 + }, │ │399 + .{ │ │400 + .title = "Add keyboard shortcut for quick search", │ │401 + .description = "Opening the search box currently requires clicking the toolbar icon. Bind a shortcut and show it in the tooltip so keyboard users can search without the mouse.", │ │402 + .tags = "enhancement\x00ux\x00keyboard", │ │403 + }, │ │404 + .{ │ │405 + .title = "Unicode filenames are garbled in the export dialog", │ │406 + .description = "Filenames containing non-ASCII characters display as replacement characters in the export dialog. The dialog decodes the path as Latin-1 instead of UTF-8.", │ │407 + .tags = "bug\x00unicode\x00i18n", │ │408 + }, │ │409 + .{ │ │410 + .title = "Flaky test: integration suite times out on CI", │ │411 + .description = "The integration suite intermittently exceeds the CI time limit because the server fixture waits for a fixed 30 seconds. Poll for readiness instead of sleeping.", │ │412 + .tags = "bug\x00testing\x00ci", │ │413 + }, │ │414 + .{ │ │415 + .title = "Upgrade bundled zlib to the latest release", │ │416 + .description = "The vendored zlib is two major releases behind and misses several upstream fixes. Update the bundled copy and re-run the compression benchmarks.", │ │417 + .tags = "dependencies\x00maintenance", │ │418 + }, │ │419 + .{ │ │420 + .title = "Progress bar overshoots 100% during resumed downloads", │ │421 + .description = "Resuming a partial download counts the already-downloaded bytes twice, so the progress bar reads up to 150%. Subtract the resume offset from the total.", │ │422 + .tags = "bug\x00ui\x00downloads", │ │423 + }, │ │424 + .{ │ │425 + .title = "Config parser rejects trailing commas", │ │426 + .description = "A trailing comma after the last entry in a config block is reported as a syntax error. Most editors add one automatically, so accept it.", │ │427 + .tags = "bug\x00config\x00parser", │ │428 + }, │ │429 + .{ │ │430 + .title = "Add a --json flag to the status command", │ │431 + .description = "Scripts currently scrape the human-readable status output, which breaks whenever the format changes. Emit a stable machine-readable JSON form behind a flag.", │ │432 + .tags = "enhancement\x00cli", │ │433 + }, │ │434 + .{ │ │435 + .title = "Race condition between autosave and manual save", │ │436 + .description = "Saving manually while an autosave is in flight can interleave the two writes and corrupt the file. Serialize saves through a single queue.", │ │437 + .tags = "bug\x00priority-high\x00data-loss", │ │438 + }, │ │439 + .{ │ │440 + .title = "Reduce binary size of release builds", │ │441 + .description = "The release binary has grown past 40 MB, mostly from debug info and an unused bundled font. Strip symbols and drop the font from the default build.", │ │442 + .tags = "performance\x00build", │ │443 + }, │ │444 + .{ │ │445 + .title = "Tooltips flicker when the cursor moves between adjacent buttons", │ │446 + .description = "Moving the cursor across a toolbar hides and re-shows the tooltip for every button. Keep the tooltip open with a short grace period between neighbors.", │ │447 + .tags = "bug\x00ui\x00polish", │ │448 + }, │ │449 + .{ │ │450 + .title = "Support environment variable expansion in config paths", │ │451 + .description = "Paths in the config file are taken literally, so shared configs can't refer to the home directory portably. Expand environment variables when loading.", │ │452 + .tags = "enhancement\x00config", │ │453 + }, │ │454 + .{ │ │455 + .title = "Log rotation deletes the newest file instead of the oldest", │ │456 + .description = "When the log directory hits its size cap, the rotation logic sorts by name rather than mtime and removes the most recent log. Sort by modification time.", │ │457 + .tags = "bug\x00logging", │ │458 + }, │ │459 + .{ │ │460 + .title = "Add man pages for all subcommands", │ │461 + .description = "Only the top-level command has a man page. Generate one per subcommand from the existing help text as part of the release build.", │ │462 + .tags = "documentation\x00cli", │ │463 + }, │ │464 + .{ │ │465 + .title = "High CPU usage while idle in the background", │ │466 + .description = "The main loop polls for file changes every 10 ms even when no window is visible. Switch to native file watching and idle at zero CPU.", │ │467 + .tags = "performance\x00priority-high", │ │468 + }, │ │469 + .{ │ │470 + .title = "Paste from clipboard drops the final newline", │ │471 + .description = "Pasting text that ends with a newline silently trims it, which breaks pasted shell snippets. Preserve the clipboard content exactly.", │ │472 + .tags = "bug\x00editor\x00clipboard", │ │473 + }, │ │474 + .{ │ │475 + .title = "Improve error message for expired credentials", │ │476 + .description = "An expired token currently surfaces as a bare 401 with no guidance. Detect the expiry case and tell the user how to re-authenticate.", │ │477 + .tags = "enhancement\x00ux\x00auth", │ │478 + }, │ │479 + .{ │ │480 + .title = "Crash when window is resized during startup animation", │ │481 + .description = "Resizing the window while the splash animation is running dereferences a freed layout node. Cancel the animation before rebuilding the layout.", │ │482 + .tags = "bug\x00crash\x00ui", │ │483 + }, │ │484 + .{ │ │485 + .title = "Add integration tests for the sync engine", │ │486 + .description = "The sync engine only has unit tests with mocked transports. Add end-to-end tests that run two instances against a real local server.", │ │487 + .tags = "testing\x00sync", │ │488 + }, │ │489 + .{ │ │490 + .title = "Timestamps display in UTC instead of local time", │ │491 + .description = "All timestamps in the activity feed render in UTC regardless of the system timezone. Convert to local time and include the offset in tooltips.", │ │492 + .tags = "bug\x00i18n\x00time", │ │493 + }, │ │494 + .{ │ │495 + .title = "Deprecate the legacy plugin format", │ │496 + .description = "Both plugin formats are currently loaded, doubling the maintenance surface. Warn on legacy plugins this release and drop support in the next.", │ │497 + .tags = "maintenance\x00plugins", │ │498 + }, │ │499 + }; │ │500 + │ │501 + var issue_events: [issue_data.len]evt.EventWithId = undefined; │ │502 + for (issue_data, 0..) |issue, i| { │ │503 + issue_events[i] = .{ │ │504 + .id = std.fmt.bytesToHex(evt.EventWithId.randomId(prng.random()), .lower), │ │505 + // stepped timestamps so the issues list in a stable order │ │506 + .timestamp = @intCast(i + 1), │ │507 + .event = .{ │ │508 + .issue = .{ │ │509 + .title = issue.title, │ │510 + .description = issue.description, │ │511 + .tags = issue.tags, │ │512 + }, │ │513 + }, │ │514 + }; │ │515 } │ │516 + try evt.commitAndConsume(.{}, io, allocator, &template_repo, evt.events_ref, &issue_events); │ │517 } │ │518 │ │519 // copy the template to each repo's on-disk location, named by its │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯