Skip to content

Releases: dchuk/jarkdown-rs

1.8.0 - 2026-06-01

Choose a tag to compare

@github-actions github-actions released this 01 Jun 22:53
2ce6746

Release Notes

Incremental-export ergonomics for flat bulk/query (#48).

Added

  • --manifest <PATH> now persists the manifest on its own, without requiring
    --incremental, so a plain bulk KEY --manifest m.json primes the cache for
    a later incremental pull. Plain exports with neither flag still write nothing.
  • --summary-json <PATH> writes a machine-readable run summary
    ({"reexported": [...], "skipped": [...], "failed": [...]}) for flat
    bulk/query, letting programmatic consumers re-pull only what changed.
  • Stderr warnings for flags that have no effect in the current invocation
    (--force without --incremental; --summary-json with --hierarchy),
    emitted by export, bulk, and query — no more silent no-ops.

Fixed

  • Unchanged issues whose only work was a changelog backfill are now reported as
    skipped rather than reexported in the run summary.
  • --summary-json creates missing parent directories before writing, matching
    the index and manifest writers.

Install jarkdown 1.8.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.8.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.8.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

1.7.2 - 2026-05-27

Choose a tag to compare

@github-actions github-actions released this 28 May 03:37
8b0bf0f

Release Notes

Cache-correctness patch release.

Added

  • Typed EvictionReason vocabulary
    (not_returned_by_validation_search, fetch_not_found_or_forbidden,
    child_fetch_or_export_failed, force_fetch_failed) with stable
    serialization and round-trip support for unknown legacy strings.
  • truncated_by_depth / truncated_by_issue_count cause flags on root
    snapshots, in addition to the existing compatibility truncated boolean.
  • New internal planner module with deterministic warm-hierarchy planning
    for corpus and nested layouts, covered by direct unit tests.
  • Validation pagination guard that errors after a bounded number of pages
    per chunk so a misbehaving Jira response cannot loop forever.

Changed

  • Requested Issue keys are canonicalized to uppercase before writing
    artifacts, so proj-1 and PROJ-1 both land in the same PROJ-1/
    directory and manifest entry.
  • Nested hierarchy root snapshots now write to {ROOT}.hierarchy.md (same
    as corpus), so multiple Requested Roots in one output directory do not
    collide on a shared index.md.
  • Hierarchy edge upserts replace duplicate legacy edges with a single
    active edge and only mark touched parents for merge-on-write.
  • --force --incremental failures on a previously evicted entry now
    preserve the eviction with a force_fetch_failed reason instead of
    reviving the entry.

Fixed

  • Manifest loads warn when they find legacy case-mismatched Issue
    directories (e.g. proj-1/ for canonical key PROJ-1) or legacy
    nested index.md snapshots, without renaming or deleting either.
  • Validation pagination correctly terminates on empty nextPageToken
    and when all requested keys in a chunk have already been seen.

Documentation

  • Refreshed docs/architecture.md and docs/manifest-v2.md for the
    new eviction vocabulary, truncation cause metadata, canonical Issue
    directories, planner extraction, and nested snapshot disambiguation.
  • README updates for canonical Issue directory normalization and the
    new nested {ROOT}.hierarchy.md snapshot path.

Install jarkdown 1.7.2

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.7.2/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.7.2

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

1.7.1 - 2026-05-27

Choose a tag to compare

@github-actions github-actions released this 27 May 21:24

Release Notes

Docs-only patch release.

  • Rewrote the architecture guide for the 1.7 child-aware incremental cache:
    validation-first planning, plan_metadata, corpus/nested hierarchy layouts,
    shared-child traversal, child-aware warm planning, and freshness rules.
  • Expanded the manifest v2 diagnostic reference with root snapshots, timestamp
    semantics, artifact path safety, atomic writes, and merge-on-write behavior.
  • Hardened README guidance around package vs binary names, crates.io dependency
    usage, conservative incremental validation, and hierarchy layout defaults.
  • Removed a real-looking Jira key from internal comments. No runtime behavior
    changes.

Install jarkdown 1.7.1

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.7.1/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.7.1

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

1.7.0 - 2026-05-27

Choose a tag to compare

@github-actions github-actions released this 27 May 20:03

Release Notes

Added

  • Manifest v2 incremental cache with graph-backed hierarchy state, v1
    migration, external --manifest <path> support, merge-on-write persistence,
    and unsupported future-version protection.
  • Child-aware incremental hierarchy export for corpus and nested layouts,
    including warm skips, bounded descendant refresh, multi-root validation
    planning, orphaned hierarchy members, evicted Issue tombstones, and snapshot
    metadata.
  • --hierarchy-layout corpus|nested; incremental hierarchy defaults to
    corpus, while non-incremental hierarchy keeps the legacy nested layout.
  • Content-visible option fingerprints covering JSON, changelog, field filters,
    --no-attachments, hierarchy depth, and hierarchy issue caps.

Changed

  • Incremental flat, bulk, query, and hierarchy exports validate cached Issues
    through Jira search metadata before deciding whether to skip, repair missing
    artifacts, backfill changelogs, evict inaccessible cache entries, or perform
    a full export.
  • Changelog-only incremental repairs now fetch and write only the changelog
    sidecars instead of rewriting the main Markdown when the Issue itself is
    unchanged.
  • Hierarchy traversal now records all parent edges and artifact paths for
    shared non-cyclic children while avoiding duplicate child fetches.
  • Jira updated freshness comparison now parses Jira/RFC3339 timestamps and
    uses conservative string fallback only when parsing fails.

Security

  • Manifest artifact paths are sanitized at load and write/join use sites,
    rejecting parent traversal, absolute paths, root/prefix components, and
    Windows-drive-style paths.
  • Manifest saves now use randomized create_new temp files beside the target,
    sync them, and rename atomically, avoiding deterministic temp-file symlink
    attacks.

Documentation

  • Added manifest v2 format documentation.
  • Updated README installation names for the generated Homebrew formula,
    installer, and release archive names.
  • Documented --manifest, --hierarchy-layout, corpus hierarchy output, and
    nested incremental shared-path behavior.

Install jarkdown 1.7.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.7.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.7.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

v1.6.1

Choose a tag to compare

@github-actions github-actions released this 26 May 22:24

Install jarkdown 1.6.1

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.6.1/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.6.1

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

v1.6.0 — Architecture refactor

Choose a tag to compare

@github-actions github-actions released this 22 May 23:16

jarkdown-rs v1.6.0 — Architecture refactor release

This release closes a seven-issue architecture refactor (#7, #9, #10, #11, #12, #8, #13) that reshapes the crate's internals — typed wire models at the HTTP seam, a pure rendering function, smaller single-purpose modules, and a testable seam in hierarchical export — without changing CLI behavior or on-disk output.

Compatibility for CLI users: every export against the live regression harness is byte-identical to 1.5.0 across full, hierarchical, bulk, and changelog scenarios, including --strict-md byte-equality on the rendered Markdown. Drop-in upgrade.

Compatibility for library consumers: the public MarkdownConverter struct is removed; switch to jarkdown::compose(&RenderContext). See Breaking changes below.


Highlights

  • Typed wire models at the Jira HTTP seam. fetch_issue returns Issue, search_jql returns Vec<IssueSearchResult>, fetch_changelog returns Vec<ChangelogEntry>. jira_client.rs is pure transport again. The full Issue surface is typed — spine fields, comments, the 19 display-only standard fields, worklog entries, components/versions/fixVersions, project, priority, resolution, votes, watches, environment, reporter, creator — backed by 10 small types and hand-rolled from_value parsers that mirror the pattern set by #7. Every typed model retains its raw serde_json::Value so --include-json output remains byte-identical (see ADR-0002).
  • Pure rendering. MarkdownConverter is gone. The render path is now the single function compose(&RenderContext) -> String with no &mut, no render-time mutation, and no hidden state. RenderContext<'a> is a plain pub-fields struct, literal-constructible, that borrows everything it needs.
  • src/markdown.rs split (1,447 lines → 5 focused modules). New module tree:
    • markdown/mod.rs — RenderContext, CustomFieldMetadata, compose()
    • markdown/adf.rs — ADF → Markdown
    • markdown/html.rs — HTML → Markdown
    • markdown/attachments.rs — AttachmentIndex + replace_attachment_links
    • markdown/sections.rs — per-section composer functions over &RenderContext
  • IssueExporter trait seam for hierarchical export. Hierarchical traversal no longer depends on the concrete ten-input export function — it depends on a one-method IssueExporter trait. Production uses WorkflowIssueExporter; tests use a recording fake. Three new unit tests cover cycle detection, max-depth cap, and max-issues cap — the first real test coverage of hierarchy.rs.
  • Single-owner Changelog artifact writes. changelog::write_artifacts is now the sole place .changelog.md and .changelog.json get written. Eliminates a class of silent-swallow drift between the per-issue export and bulk paths.
  • Freshness as its own module. The --incremental decision lives in src/freshness.rs (freshness::plan() -> ExportPlan). The CLI handler and the bulk loop both consult one implementation of ADR-0001 Decision 2.
  • Field cache pre-resolution. Custom-field name/schema resolution happens once in src/export.rs before RenderContext is built. The render path never mutates FieldMetadataCache.

Breaking changes

Removed Replacement
pub use markdown::MarkdownConverter; jarkdown::compose(&RenderContext)
MarkdownConverter::new(...) + compose_markdown(&mut self, ...) Literal-construct RenderContext and call compose(&ctx)
pub fn convert_html_to_markdown / pub fn replace_attachment_links / pub fn parse_adf_to_markdown from the crate root All three are now pub(crate) — internal only

CLI users are not affected — flags, output filenames, and byte-level output are unchanged.

Library consumers should construct a RenderContext directly. The new pattern (see src/export.rs for the production usage):

use jarkdown::{compose, AttachmentIndex, CustomFieldMetadata, RenderContext};
use jarkdown::config::FieldFilter;

let field_metadata = CustomFieldMetadata::empty();
let field_filter = FieldFilter::default();
let attachments = AttachmentIndex::build(&downloaded, skipped_slice);

let ctx = RenderContext {
    issue: &issue,
    downloaded: &downloaded,
    skipped_attachments: skipped_slice,
    attachments,
    field_metadata: &field_metadata,
    field_filter: &field_filter,
    child_issues: &[],
    changelog_summary: None,
    base_url: &api_client.base_url,
    domain: &api_client.domain,
};

let markdown = compose(&ctx);

New public API

  • jarkdown::compose(&RenderContext) -> String
  • jarkdown::RenderContext<'a> (plain pub-fields, literal-constructible)
  • jarkdown::AttachmentIndex<'a> with build() / empty()
  • jarkdown::CustomFieldMetadata with empty()
  • jarkdown::exporter::{IssueExporter, WorkflowIssueExporter}
  • jarkdown::{ChangelogEntry, ChangelogItem} (re-exported from issue)
  • 19 newly-typed fields on Issue and supporting nested types: Priority, Resolution, Project, NamedRef, TimeTracking, Progress, Votes, Watches, WorklogPage, WorklogEntry

Internals — what didn't change

  • All Jira HTTP calls and their semantics.
  • --include-json (typed models retain raw: Value; serialization byte-identical).
  • .changelog.md / .changelog.json artifact shape (ADR-0001).
  • Issue::field() and Issue.raw — still present, now reserved for customfield_* access only.
  • --incremental policy (just lives in its own module now).
  • Attachment lookup semantics (id-first, name lowercased+trimmed, dual-name for downloaded, single-name for skipped).

Testing & verification

  • cargo test 34 / 34 passing — up from ~20 at 1.5.0. New coverage:
    • 4 tests for typed Issue / IssueSearchResult / Comment parsing.
    • 2 tests for typed ChangelogEntry parsing (positive + malformed-payload rejection).
    • 2 tests for typed display-field parsing (positive + wrong-typed rejection).
    • 3 tests for hierarchical export traversal via a fake IssueExporter (cycle, max-depth, max-issues).
    • 2 new section unit tests built from a literal RenderContext (comments, frontmatter) — no json!() fixtures.
  • cargo clippy --all-targets -- -D warnings clean.
  • Live regression: every refactor commit was verified byte-identical against a frozen pre-refactor binary (.goal-baseline/jarkdown-main) across full (PSOP-style ticket), hierarchical (epic → children), and bulk scenarios, including the strict --strict-md Markdown byte-equality gate introduced by #8.

Architecture notes / ADRs

Closed issues

# Title Commit
#7 Introduce a typed Issue model at the Jira client seam 33dcfa8
#9 Consolidate Changelog artifact writes into one module 254864a
#10 Extract a freshness module that owns the incremental export decision 4dbd10f
#11 Give hierarchy.rs an IssueExporter seam instead of a direct call c25022a
#12 Type Changelog entries at the fetch_changelog seam 9e2825d
#8 Bundle markdown rendering inputs into a RenderContext and split the module 6acc368
#13 Type the ~19 display-only Issue fields 9dbc088

Install jarkdown 1.6.0

Shell script (macOS / Linux)

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.6.0/jarkdown-installer.sh | sh

Homebrew

brew install dchuk/tap/jarkdown
# or, if already installed:
brew upgrade jarkdown

Cargo

cargo install jarkdown

Download jarkdown 1.6.0

File Platform
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux (glibc)
jarkdown-x86_64-unknown-linux-gnu.tar.xz x86_64 Linux (glibc)
jarkdown-x86_64-pc-windows-msvc.zip x86_64 Windows

SHA-256 sums for each archive are published alongside the archives (*.sha256) plus the aggregate sha256.sum.

Full diff

v1.5.0...v1.6.0

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 20 May 14:15

Install jarkdown 1.5.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.5.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.5.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 20 May 01:03

Install jarkdown 1.4.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.4.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.4.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 07 Apr 21:00

Install jarkdown 1.3.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.3.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.3.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Apr 21:33

Install jarkdown 1.2.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dchuk/jarkdown-rs/releases/download/v1.2.0/jarkdown-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install dchuk/tap/jarkdown

Download jarkdown 1.2.0

File Platform Checksum
jarkdown-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
jarkdown-x86_64-apple-darwin.tar.xz Intel macOS checksum
jarkdown-x86_64-pc-windows-msvc.zip x64 Windows checksum
jarkdown-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
jarkdown-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum