Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
c080a96
test: implement comprehensive test suite for jira-download
chrisbyboston Aug 15, 2025
033a27d
feat: prepare project for open source release
chrisbyboston Aug 15, 2025
190cf6f
chore: update placeholder URLs to use chrisbyboston GitHub account
chrisbyboston Aug 15, 2025
9d30373
refactor: replace LFG-1234 with generic PROJ-123 in documentation and…
chrisbyboston Aug 15, 2025
57c42f7
chore: update year from 2024 to 2025 in LICENSE and test data
chrisbyboston Aug 15, 2025
69fe7da
fix: update ruff linter command in CI workflow
chrisbyboston Aug 15, 2025
ebb23ac
fix: update CodeQL action to v3 and make security scan non-blocking
chrisbyboston Aug 15, 2025
58c74bf
docs: remove code of conduct references from documentation
chrisbyboston Aug 15, 2025
76d7379
docs: reorganize documentation structure for ReadTheDocs integration
chrisbyboston Aug 15, 2025
7ac3953
refactor: modularize codebase into separate components
chrisbyboston Aug 15, 2025
d5b19aa
fix: include all Python modules in package setup
chrisbyboston Aug 15, 2025
e9059d4
docs: move GEMINI.md to project root
chrisbyboston Aug 15, 2025
0449c83
docs: add technical design v2 for refactored architecture
chrisbyboston Aug 15, 2025
4744dc9
chore: remove unused ReadTheDocs configuration
chrisbyboston Aug 15, 2025
1ba61bb
docs: reorganize design documentation with timestamped files
chrisbyboston Aug 15, 2025
f20bad7
fix: resolve all failing tests and improve error handling
chrisbyboston Aug 15, 2025
3b4e01e
feat: complete implementation of Jira issue to markdown exporter
chrisbyboston Aug 15, 2025
a5b420b
refactor: restructure codebase into proper Python package
chrisbyboston Aug 15, 2025
50711b0
Revert "refactor: restructure codebase into proper Python package"
chrisbyboston Aug 16, 2025
6781d2c
feat: add comment export functionality to jira-download
chrisbyboston Aug 16, 2025
ff450a8
refactor: restructure codebase into proper Python package
chrisbyboston Aug 16, 2025
262bf41
feat: implement comment export with improved formatting
chrisbyboston Aug 16, 2025
250dafa
chore: update .gitignore
chrisbyboston Aug 16, 2025
3ca227f
docs(design): add detailed analysis and planning documents
chrisbyboston Aug 16, 2025
406fdc7
fix: update CI workflow to use pyproject.toml instead of requirements…
chrisbyboston Aug 16, 2025
a1a096e
docs: implement comprehensive Sphinx documentation with Read the Docs…
chrisbyboston Aug 16, 2025
27bea10
fix: resolve documentation build issues in CI
chrisbyboston Aug 16, 2025
96836f3
feat: implement pre-commit hooks for automated quality checks
chrisbyboston Aug 16, 2025
5671333
docs: add code review assessment with improvement recommendations
chrisbyboston Aug 16, 2025
2d1c398
refactor: implement code review recommendations for improved project …
chrisbyboston Aug 16, 2025
ec65967
refactor: rename project from jira-download to jarkdown
chrisbyboston Aug 16, 2025
60b1106
fix: complete remaining jira-download to jarkdown renaming
chrisbyboston Aug 16, 2025
7456ca8
fix: update remaining jira_download references in test commands
chrisbyboston Aug 16, 2025
1c1bc98
docs: add ReadTheDocs integration and update documentation references
chrisbyboston Aug 16, 2025
759cb5c
feat: improve accessibility for non-technical users
chrisbyboston Aug 16, 2025
26f6aab
build: prepare package for PyPI publishing
chrisbyboston Aug 16, 2025
8bfc626
fix(packaging): align pyproject.toml with technical design
chrisbyboston Aug 16, 2025
196e772
feat: add GitHub Actions workflow for PyPI publishing
chrisbyboston Aug 16, 2025
67d86fa
docs: add technical design documents
chrisbyboston Aug 16, 2025
ec9c0a6
fix: allow environment variables without .env file for CI
chrisbyboston Aug 16, 2025
b77ba79
docs: remove AI assistant and vibecoding references
chrisbyboston Aug 17, 2025
3c0a300
feat: implement enhanced metadata export with YAML frontmatter
chrisbyboston Aug 17, 2025
3f981b6
docs: update documentation to reflect full comment support
chrisbyboston Aug 17, 2025
f2c67c2
test: add regression for ADF media attachments
chrisbyboston Nov 18, 2025
2a0fc57
fix: embed adf media attachments
chrisbyboston Nov 18, 2025
226f502
chore(release): bump version to 0.2.0
chrisbyboston Nov 18, 2025
243b128
fix: resolve attachment embeds in comments
chrisbyboston Nov 18, 2025
94d98b4
chore(vbw): bootstrap project files
dchuk Feb 17, 2026
b2a0552
chore(vbw): plan phase 1
dchuk Feb 17, 2026
561c70f
test(phase-01): add linked issues and subtasks fixtures
dchuk Feb 17, 2026
1c48b25
feat(phase-01): add linked issues section renderer
dchuk Feb 17, 2026
eb91a9b
test(phase-01): add worklog and environment fixtures
dchuk Feb 17, 2026
accd9ae
feat(phase-01): add subtasks section renderer
dchuk Feb 17, 2026
b69b680
test(phase-01): add frontmatter standard fields fixture
dchuk Feb 17, 2026
e7b775c
feat(phase-01): add environment section renderer
dchuk Feb 17, 2026
330935d
refactor(phase-01): always-present frontmatter schema
dchuk Feb 17, 2026
827cb93
test(phase-01): add linked issues and subtasks section tests
dchuk Feb 18, 2026
0fafd8e
feat(phase-01): add worklogs section renderer with ADF plain-text helper
dchuk Feb 18, 2026
020d8f4
test(phase-01): add frontmatter field tests
dchuk Feb 18, 2026
f4459be
test(phase-01): add worklog and environment section tests
dchuk Feb 18, 2026
b13e6f3
test(phase-01): add comprehensive integration fixture
dchuk Feb 18, 2026
f6ff9b7
feat(phase-01): wire new sections into compose_markdown
dchuk Feb 18, 2026
dfd85a4
test(phase-01): add integration tests for standard field coverage
dchuk Feb 18, 2026
514fc84
chore(vbw): complete phase 1
dchuk Feb 18, 2026
59b4ce2
chore(vbw): plan phase 2
dchuk Feb 18, 2026
4f19a36
feat(phase-02): implement config manager
dchuk Feb 18, 2026
ebbbfdb
chore(phase-02): add platformdirs and tomli dependencies
dchuk Feb 18, 2026
5348418
feat(phase-02): add ADF table support
dchuk Feb 18, 2026
6342b8c
feat(phase-02): add fetch_fields API method
dchuk Feb 18, 2026
e830353
feat(phase-02): add ADF panel, expand, and rule support
dchuk Feb 18, 2026
4799a13
test(phase-02): add config loading tests
dchuk Feb 18, 2026
a6edbeb
feat(phase-02): implement field metadata cache
dchuk Feb 18, 2026
2faed5f
feat(phase-02): add field-related CLI arguments
dchuk Feb 18, 2026
40eb1d0
feat(phase-02): add ADF inline node support
dchuk Feb 18, 2026
7eeb61f
test(phase-02): add field filter and precedence tests
dchuk Feb 18, 2026
d2ff0d7
feat(phase-02): add ADF task list, decision list, and media group sup…
dchuk Feb 18, 2026
de66f07
test(phase-02): add field cache tests
dchuk Feb 18, 2026
33f857e
test(phase-02): add comprehensive ADF node tests
dchuk Feb 18, 2026
52b9f0c
feat(phase-02): implement custom field renderer
dchuk Feb 18, 2026
687567a
feat(phase-02): add custom fields section to markdown output
dchuk Feb 18, 2026
3b802fd
feat(phase-02): wire custom fields pipeline to CLI
dchuk Feb 18, 2026
7195274
test(phase-02): add custom field renderer and section tests
dchuk Feb 18, 2026
8048290
test(phase-02): add phase 2 integration tests
dchuk Feb 18, 2026
935e05b
chore(vbw): complete phase 2
dchuk Feb 18, 2026
2b64a8f
feat(export): save raw JSON API response alongside markdown export
dchuk Feb 18, 2026
0a43f49
chore(vbw): plan phase 3
dchuk Feb 18, 2026
e0e900e
docs(readme): update install instructions for uv
dchuk Feb 18, 2026
7e1925c
chore(ci): migrate test job from pip to uv
dchuk Feb 18, 2026
735f47a
chore(build): migrate from setuptools to hatchling build backend
dchuk Feb 18, 2026
e8135bd
docs(readme): update developer setup for uv
dchuk Feb 18, 2026
324f336
chore(ci): migrate lint job from pip to uv
dchuk Feb 18, 2026
844d5db
docs(readme): update contributing section for uv
dchuk Feb 18, 2026
d9c2a66
chore(ci): migrate docs job from pip to uv
dchuk Feb 18, 2026
236b7c4
chore(ci): migrate publish workflow from pip to uv
dchuk Feb 18, 2026
6e86579
chore(build): commit uv.lock for reproducible dependency resolution
dchuk Feb 18, 2026
dc397b6
chore(vbw): complete phase 3
dchuk Feb 18, 2026
3dcd7f6
chore(vbw): discuss phase 4
dchuk Feb 18, 2026
52f3ad3
chore(vbw): plan phase 4
dchuk Feb 18, 2026
c13844e
feat(phase-04): add RetryConfig dataclass to retry module
dchuk Feb 18, 2026
49b353e
chore(phase-04): add aiohttp and async test dependencies
dchuk Feb 18, 2026
aed2471
feat(phase-04): add parse_retry_after helper to retry module
dchuk Feb 18, 2026
8970f9f
feat(phase-04): add retry_with_backoff async function
dchuk Feb 18, 2026
8c914c6
feat(phase-04): rewrite JiraApiClient as async aiohttp client
dchuk Feb 18, 2026
d7f1ec6
test(phase-04): add comprehensive retry module tests
dchuk Feb 18, 2026
2b13e3d
feat(phase-04): rewrite AttachmentHandler as async
dchuk Feb 18, 2026
225f26f
feat(phase-04): restructure CLI with subcommands and async export bou…
dchuk Feb 18, 2026
1d65aa7
test(phase-04): update test_components.py for async aiohttp client
dchuk Feb 18, 2026
8e27d32
test(phase-04): update test_cli.py for subcommand structure
dchuk Feb 18, 2026
d688910
chore(phase-04): 04-02 CLI subcommand restructuring complete
dchuk Feb 18, 2026
315a4bb
feat(phase-04): add search_jql with nextPageToken pagination to JiraA…
dchuk Feb 18, 2026
c7b5ff4
feat(phase-04): add BulkExporter class with semaphore concurrency
dchuk Feb 18, 2026
22842a0
feat(phase-04): wire bulk and query subcommands to BulkExporter
dchuk Feb 18, 2026
d072c50
test(phase-04): add comprehensive bulk exporter tests
dchuk Feb 18, 2026
c6c59bd
chore(phase-04): 04-04 bulk export engine complete
dchuk Feb 18, 2026
7508373
fix(phase-04): add missing await for async download_all_attachments
dchuk Feb 18, 2026
6fab0ed
chore(vbw): complete phase 4
dchuk Feb 18, 2026
44bd3b3
chore(vbw): archive milestone jarkdown
dchuk Feb 18, 2026
4eb804d
docs: update CLAUDE.md for shipped milestone
dchuk Feb 18, 2026
ebea06a
chore(vbw): verify phase 4 UAT complete
dchuk Feb 18, 2026
dc432f3
docs(all): update all documentation for v0.2.0 release
dchuk Feb 18, 2026
12d9c77
fix(cli): make JSON output opt-in with --include-json flag
dchuk Feb 18, 2026
abea93b
chore(repo): add test output gitignore rules and CLAUDE.md guidance
dchuk Feb 18, 2026
56ac53e
feat(cli): add --limit flag to query subcommand
dchuk Feb 18, 2026
6db5f91
docs(cli): document all default values for CLI arguments
dchuk Feb 18, 2026
c7a1c8b
fix(deps,refactor): remove unused requests dep and deduplicate export…
dchuk Feb 20, 2026
4d80a60
chore(qa): add phase 4 verification report and update lockfile
dchuk Feb 20, 2026
ea28d75
Merge upstream/main into refactor/cleanup-and-dedup
dchuk Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 18 additions & 41 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,18 @@ jobs:
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}

- name: Cache pip packages
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt', '**/pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pip-

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install .[dev]
run: uv sync --locked --all-extras --dev

- name: Run tests with coverage
run: |
pytest --cov=src/jarkdown --cov-report=term-missing --cov-report=xml
run: uv run pytest --cov=src/jarkdown --cov-report=term-missing --cov-report=xml

- name: Upload coverage reports to Codecov
if: matrix.python-version == '3.11'
Expand All @@ -52,30 +41,22 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
- uses: astral-sh/setup-uv@v7
with:
python-version: '3.11'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install ruff
enable-cache: true

- name: Lint with ruff
run: |
# Stop the build if there are Python syntax errors or undefined names
ruff check . --select=E9,F63,F7,F82
# exit-zero treats all errors as warnings
ruff check . --exit-zero || true
uvx ruff check . --select=E9,F63,F7,F82
uvx ruff check . --exit-zero || true

security:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
Expand All @@ -97,23 +78,19 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
- uses: astral-sh/setup-uv@v7
with:
python-version: '3.11'
enable-cache: true

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r docs/requirements.txt
pip install -e .
uv sync --locked
uv pip install -r docs/requirements.txt

- name: Build documentation
run: |
sphinx-build -b html docs/source docs/build/html --keep-going
run: uv run sphinx-build -b html docs/source docs/build/html --keep-going

- name: Check for broken links
run: |
sphinx-build -b linkcheck docs/source docs/build/linkcheck
run: uv run sphinx-build -b linkcheck docs/source docs/build/linkcheck
14 changes: 3 additions & 11 deletions .github/workflows/publish-to-pypi.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# .github/workflows/publish-to-pypi.yml
name: Publish to PyPI

on:
Expand All @@ -9,23 +8,16 @@ jobs:
publish:
runs-on: ubuntu-latest
permissions:
# This permission is mandatory for trusted publishing
id-token: write
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
- uses: astral-sh/setup-uv@v7
with:
python-version: "3.11"

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build
enable-cache: true

- name: Build package
run: python -m build
run: uv build

- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ claude-tmp/
temp/
tmp/

# Jira issue output (from test runs)
TEST-*/
VERIFICATION.md

# Documentation builds
docs/_build/
docs/build/
46 changes: 46 additions & 0 deletions .vbw-planning/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# VBW transient runtime artifacts
.execution-state.json
.execution-state.json.tmp
.context-*.md
.contracts/
.locks/
.token-state/

# Session & agent tracking
.vbw-session
.active-agent
.active-agent-count
.active-agent-count.lock/
.agent-pids

# Metrics & cost tracking
.metrics/
.cost-ledger.json

# Caching
.cache/

# Artifacts & events (v2/v3 feature-gated)
.artifacts/
.events/
.event-log.jsonl

# Snapshots & recovery
.snapshots/

# Logging & markers
.hook-errors.log
.compaction-marker
.session-log.jsonl
.session-log.jsonl.tmp
.notification-log.jsonl
.watchdog-pid
.watchdog.log
.claude-md-migrated
.tmux-mode-patched

# Baselines
.baselines/

# Codebase mapping
codebase/
1 change: 1 addition & 0 deletions .vbw-planning/.todo-flat-migrated
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
37 changes: 37 additions & 0 deletions .vbw-planning/PROJECT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# jarkdown

Export Jira Cloud issues to Markdown with attachments. A Python CLI tool that fetches issue data from the Jira REST API, downloads all attachments locally, and produces rich Markdown files with YAML frontmatter, inline images, and full comment history.

**Core value:** Complete, offline-readable Jira issue archives in Markdown format.

## Requirements

### Validated
- Single issue export to Markdown with YAML frontmatter
- Attachment download with local path replacement
- Comment export (HTML + ADF support)

### Active
- [ ] Full Jira field coverage (issue links, subtasks, time tracking, progress, votes, etc.)
- [ ] Custom field mapping and rendering
- [ ] Better ADF parsing (tables, panels, expand blocks, emoji)
- [ ] Bulk export of multiple issues
- [ ] JQL query support for batch export
- [ ] Migration to uv package manager

### Out of Scope
- Real-time sync with Jira
- Jira write-back / import functionality

## Constraints
- **Python 3.8+**: Broad compatibility across environments
- **Minimal dependencies**: Only 4 runtime deps
- **Existing test suite**: All changes must maintain passing tests

## Key Decisions

| Decision | Rationale | Outcome |
|----------|-----------|---------|
| Pipeline architecture | Simple linear data flow | Easy to extend and test |
| Session-based auth | Reuse connections | Efficient API calls |
| Exception hierarchy | Clean error handling | Components stay decoupled from CLI |
37 changes: 37 additions & 0 deletions .vbw-planning/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# jarkdown Requirements

Defined: 2026-02-17 | Core value: Complete, offline-readable Jira issue archives in Markdown

## v1 Requirements

### Core (Validated)
- [x] **REQ-01**: Jira REST API v3 integration with authentication (domain standard)
- [x] **REQ-02**: HTML to Markdown conversion via markdownify (domain standard)
- [x] **REQ-03**: Attachment download with local path replacement (domain standard)
- [x] **REQ-04**: YAML frontmatter with issue metadata (domain standard)
- [x] **REQ-05**: Comment export with ADF and rendered HTML support

### Field Coverage
- [x] **REQ-06**: Full standard field coverage — project, issuelinks, subtasks, time tracking, progress, worklogs, votes, watches, duedate, environment, statusCategory
- [x] **REQ-07**: Custom field mapping — configurable rendering of customfield_* entries in markdown output

### ADF Parsing
- [x] **REQ-08**: Complete ADF support — tables, panels, expand blocks, emoji, inline cards, decision items, task lists

### Bulk Operations
- [x] **REQ-09**: Bulk export — export multiple issues from a list of keys
- [x] **REQ-10**: JQL query support — accept JQL queries to find and export matching issues

### Tooling
- [x] **REQ-11**: Migrate to uv package manager — replace pip with uv for cleaner install and usage

## v2 Requirements
- [ ] **REQ-12**: Parallel attachment downloads for performance
- [ ] **REQ-13**: Incremental/delta export (only re-export changed issues)
- [ ] **REQ-14**: Alternative output formats (JSON, HTML)

## Out of Scope

- Real-time sync with Jira (deliberately excluded — tool is for point-in-time export)
- Jira write-back / import functionality (deliberately excluded — read-only tool)
- Jira Server/Data Center support (Cloud-only for now)
97 changes: 97 additions & 0 deletions .vbw-planning/ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# jarkdown Roadmap

**Goal:** jarkdown

**Scope:** 4 phases

## Progress
| Phase | Status | Plans | Tasks | Commits |
|-------|--------|-------|-------|---------|
| 1 | Complete | 4 | 16 | 14 |
| 2 | Complete | 4 | 18 | 18 |
| 3 | Complete | 3 | 10 | 9 |
| 4 | Complete | 4 | 19 | 17 |

---

## Phase List
- [x] [Phase 1: Standard Field Coverage](#phase-1-standard-field-coverage)
- [x] [Phase 2: Custom Fields & ADF](#phase-2-custom-fields-adf)
- [x] [Phase 3: uv Migration & Tooling](#phase-3-uv-migration-tooling)
- [x] [Phase 4: Bulk Export & JQL](#phase-4-bulk-export-jql)

---

## Phase 1: Standard Field Coverage

**Goal:** Expand markdown output to cover all standard Jira fields returned by the API, closing the gap identified from PSOP-419

**Requirements:** REQ-06

**Success Criteria:**
- project name/key included in frontmatter
- issuelinks rendered as a linked issues section
- subtasks listed with keys and summaries
- time tracking fields (estimate, spent, remaining) in frontmatter
- progress/aggregateprogress shown
- votes/watches count in frontmatter
- worklog entries rendered
- duedate and environment included
- statusCategory in frontmatter
- All fields from PSOP-419 that have values appear in output

**Dependencies:** None

---

## Phase 2: Custom Fields & ADF

**Goal:** Support configurable custom field rendering and complete ADF document format parsing

**Requirements:** REQ-07, REQ-08

**Success Criteria:**
- Custom fields with values rendered in a dedicated section
- Field name resolution via Jira field metadata API
- ADF tables converted to Markdown tables
- ADF panels rendered as blockquotes with headers
- ADF expand blocks, emoji, inline cards, task lists handled
- Config file or CLI flag for field selection

**Dependencies:** Phase 1

---

## Phase 3: uv Migration & Tooling

**Goal:** Migrate from pip to uv package manager for cleaner install and usage experience

**Requirements:** REQ-11

**Success Criteria:**
- uv.lock file replaces pip dependency resolution
- pyproject.toml updated for uv compatibility
- README and docs updated with uv install instructions
- CI workflows updated to use uv
- Development setup uses uv for venv and dependency management

**Dependencies:** Phase 2

---

## Phase 4: Bulk Export & JQL

**Goal:** Enable exporting multiple issues at once via key lists or JQL queries

**Requirements:** REQ-09, REQ-10

**Success Criteria:**
- Accept multiple issue keys on CLI
- Accept --jql flag with JQL query string
- Batch API calls with rate limiting
- Summary index file listing all exported issues
- Progress reporting during bulk operations
- Error handling for partial failures in batch

**Dependencies:** Phase 3

Loading