Repository navigation
Releases: dchuk/jarkdown-rs
Release list
1.8.0 - 2026-06-01
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 plainbulk KEY --manifest m.jsonprimes 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
(--forcewithout--incremental;--summary-jsonwith--hierarchy),
emitted byexport,bulk, andquery— no more silent no-ops.
Fixed
- Unchanged issues whose only work was a changelog backfill are now reported as
skippedrather thanreexportedin the run summary. --summary-jsoncreates 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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
Release Notes
Cache-correctness patch release.
Added
- Typed
EvictionReasonvocabulary
(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_countcause flags on root
snapshots, in addition to the existing compatibilitytruncatedboolean.- New internal
plannermodule 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, soproj-1andPROJ-1both land in the samePROJ-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 sharedindex.md. - Hierarchy edge upserts replace duplicate legacy edges with a single
active edge and only mark touched parents for merge-on-write. --force --incrementalfailures on a previously evicted entry now
preserve the eviction with aforce_fetch_failedreason instead of
reviving the entry.
Fixed
- Manifest loads warn when they find legacy case-mismatched Issue
directories (e.g.proj-1/for canonical keyPROJ-1) or legacy
nestedindex.mdsnapshots, 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.mdanddocs/manifest-v2.mdfor 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.mdsnapshot 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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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
updatedfreshness 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_newtemp 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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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_issuereturnsIssue,search_jqlreturnsVec<IssueSearchResult>,fetch_changelogreturnsVec<ChangelogEntry>.jira_client.rsis 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-rolledfrom_valueparsers that mirror the pattern set by #7. Every typed model retains its rawserde_json::Valueso--include-jsonoutput remains byte-identical (see ADR-0002). - Pure rendering.
MarkdownConverteris gone. The render path is now the single functioncompose(&RenderContext) -> Stringwith 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.rssplit (1,447 lines → 5 focused modules). New module tree:markdown/mod.rs—RenderContext,CustomFieldMetadata,compose()markdown/adf.rs— ADF → Markdownmarkdown/html.rs— HTML → Markdownmarkdown/attachments.rs—AttachmentIndex+replace_attachment_linksmarkdown/sections.rs— per-section composer functions over&RenderContext
IssueExportertrait seam for hierarchical export. Hierarchical traversal no longer depends on the concrete ten-input export function — it depends on a one-methodIssueExportertrait. Production usesWorkflowIssueExporter; tests use a recording fake. Three new unit tests cover cycle detection, max-depth cap, and max-issues cap — the first real test coverage ofhierarchy.rs.- Single-owner Changelog artifact writes.
changelog::write_artifactsis now the sole place.changelog.mdand.changelog.jsonget written. Eliminates a class of silent-swallow drift between the per-issue export and bulk paths. - Freshness as its own module. The
--incrementaldecision lives insrc/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.rsbeforeRenderContextis built. The render path never mutatesFieldMetadataCache.
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) -> Stringjarkdown::RenderContext<'a>(plain pub-fields, literal-constructible)jarkdown::AttachmentIndex<'a>withbuild()/empty()jarkdown::CustomFieldMetadatawithempty()jarkdown::exporter::{IssueExporter, WorkflowIssueExporter}jarkdown::{ChangelogEntry, ChangelogItem}(re-exported fromissue)- 19 newly-typed fields on
Issueand 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 retainraw: Value; serialization byte-identical)..changelog.md/.changelog.jsonartifact shape (ADR-0001).Issue::field()andIssue.raw— still present, now reserved forcustomfield_*access only.--incrementalpolicy (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 test34 / 34 passing — up from ~20 at 1.5.0. New coverage:- 4 tests for typed
Issue/IssueSearchResult/Commentparsing. - 2 tests for typed
ChangelogEntryparsing (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) — nojson!()fixtures.
- 4 tests for typed
cargo clippy --all-targets -- -D warningsclean.- 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-mdMarkdown byte-equality gate introduced by #8.
Architecture notes / ADRs
- docs/adr/0001-changelog-export.md —
.changelog.md/.changelog.jsonare sibling artifacts;--incrementalbackfills when missing. Untouched by this refactor. - docs/adr/0002-typed-issue-model-retains-raw-payload.md — every typed wire model retains its
raw: Value. Tracked in git as part of this release; was authored alongside #7 last cycle.
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 | shHomebrew
brew install dchuk/tap/jarkdown
# or, if already installed:
brew upgrade jarkdownCargo
cargo install jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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
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 | shInstall prebuilt binaries via Homebrew
brew install dchuk/tap/jarkdownDownload 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 |