Skip to content

Bump the actions group with 4 updates#1

Closed
dependabot[bot] wants to merge 14 commits into
mainfrom
dependabot/github_actions/actions-02bc13e553
Closed

Bump the actions group with 4 updates#1
dependabot[bot] wants to merge 14 commits into
mainfrom
dependabot/github_actions/actions-02bc13e553

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github May 18, 2026

Bumps the actions group with 4 updates: actions/checkout, astral-sh/setup-uv, actions/upload-artifact and actions/download-artifact.

Updates actions/checkout from 4 to 6

Release notes

Sourced from actions/checkout's releases.

v6.0.0

What's Changed

Full Changelog: actions/checkout@v5.0.0...v6.0.0

v6-beta

What's Changed

Updated persist-credentials to store the credentials under $RUNNER_TEMP instead of directly in the local git config.

This requires a minimum Actions Runner version of v2.329.0 to access the persisted credentials for Docker container action scenarios.

v5.0.1

What's Changed

Full Changelog: actions/checkout@v5...v5.0.1

v5.0.0

What's Changed

⚠️ Minimum Compatible Runner Version

v2.327.1
Release Notes

Make sure your runner is updated to this version or newer to use this release.

Full Changelog: actions/checkout@v4...v5.0.0

v4.3.1

What's Changed

Full Changelog: actions/checkout@v4...v4.3.1

v4.3.0

What's Changed

... (truncated)

Changelog

Sourced from actions/checkout's changelog.

Changelog

v6.0.2

v6.0.1

v6.0.0

v5.0.1

v5.0.0

v4.3.1

v4.3.0

v4.2.2

v4.2.1

v4.2.0

v4.1.7

v4.1.6

... (truncated)

Commits

Updates astral-sh/setup-uv from 5 to 7

Release notes

Sourced from astral-sh/setup-uv's releases.

v7.2.1 🌈 update known checksums up to 0.9.28

Changes

🧰 Maintenance

📚 Documentation

⬆️ Dependency updates

v7.0.0 🌈 node24 and a lot of bugfixes

Changes

This release comes with a load of bug fixes and a speed up. Because of switching from node20 to node24 it is also a breaking change. If you are running on GitHub hosted runners this will just work, if you are using self-hosted runners make sure, that your runners are up to date. If you followed the normal installation instructions your self-hosted runner will keep itself updated.

This release also removes the deprecated input server-url which was used to download uv releases from a different server. The manifest-file input supersedes that functionality by adding a flexible way to define available versions and where they should be downloaded from.

Fixes

  • The action now respects when the environment variable UV_CACHE_DIR is already set and does not overwrite it. It now also finds cache-dir settings in config files if you set them.
  • Some users encountered problems that cache pruning took forever because they had some uv processes running in the background. Starting with uv version 0.8.24 this action uses uv cache prune --ci --force to ignore the running processes
  • If you just want to install uv but not have it available in path, this action now respects UV_NO_MODIFY_PATH
  • Some other actions also set the env var UV_CACHE_DIR. This action can now deal with that but as this could lead to unwanted behavior in some edgecases a warning is now displayed.

Improvements

If you are using minimum version specifiers for the version of uv to install for example

[tool.uv]
required-version = ">=0.8.17"

This action now detects that and directly uses the latest version. Previously it would download all available releases from the uv repo to determine the highest matching candidate for the version specifier, which took much more time.

If you are using other specifiers like 0.8.x this action still needs to download all available releases because the specifier defines an upper bound (not 0.9.0 or later) and "latest" would possibly not satisfy that.

🚨 Breaking changes

... (truncated)

Commits
  • 37802ad Fetch uv from Astral's mirror by default (#809)
  • 9f00d18 chore(deps): bump zizmorcore/zizmor-action from 0.5.0 to 0.5.2 (#808)
  • fd8f376 Switch to ESM for source and test, use CommonJS for dist (#806)
  • f9070de Bump deps (#805)
  • cadb67b chore: update known checksums for 0.10.10 (#804)
  • e06108d Use astral-sh/versions as primary version provider (#802)
  • 0f6ec07 docs: replace copilot instructions with AGENTS.md (#794)
  • 821e5c9 docs: add cross-client dependabot rollup skill (#793)
  • 6ee6290 chore(deps): bump versions (#792)
  • 9f332a1 Add riscv64 architecture support to platform detection (#791)
  • Additional commits viewable in compare view

Updates actions/upload-artifact from 4 to 7

Release notes

Sourced from actions/upload-artifact's releases.

v7.0.0

v7 What's new

Direct Uploads

Adds support for uploading single files directly (unzipped). Callers can set the new archive parameter to false to skip zipping the file during upload. Right now, we only support single files. The action will fail if the glob passed resolves to multiple files. The name parameter is also ignored with this setting. Instead, the name of the artifact will be the name of the uploaded file.

ESM

To support new versions of the @actions/* packages, we've upgraded the package to ESM.

What's Changed

New Contributors

Full Changelog: actions/upload-artifact@v6...v7.0.0

v6.0.0

v6 - What's new

[!IMPORTANT] actions/upload-artifact@v6 now runs on Node.js 24 (runs.using: node24) and requires a minimum Actions Runner version of 2.327.1. If you are using self-hosted runners, ensure they are updated before upgrading.

Node.js 24

This release updates the runtime to Node.js 24. v5 had preliminary support for Node.js 24, however this action was by default still running on Node.js 20. Now this action by default will run on Node.js 24.

What's Changed

Full Changelog: actions/upload-artifact@v5.0.0...v6.0.0

v5.0.0

What's Changed

BREAKING CHANGE: this update supports Node v24.x. This is not a breaking change per-se but we're treating it as such.

... (truncated)

Commits
  • 043fb46 Merge pull request #797 from actions/yacaovsnc/update-dependency
  • 634250c Include changes in typespec/ts-http-runtime 0.3.5
  • e454baa Readme: bump all the example versions to v7 (#796)
  • 74fad66 Update the readme with direct upload details (#795)
  • bbbca2d Support direct file uploads (#764)
  • 589182c Upgrade the module to ESM and bump dependencies (#762)
  • 47309c9 Merge pull request #754 from actions/Link-/add-proxy-integration-tests
  • 02a8460 Add proxy integration test
  • b7c566a Merge pull request #745 from actions/upload-artifact-v6-release
  • e516bc8 docs: correct description of Node.js 24 support in README
  • Additional commits viewable in compare view

Updates actions/download-artifact from 4 to 8

Release notes

Sourced from actions/download-artifact's releases.

v8.0.0

v8 - What's new

[!IMPORTANT] actions/download-artifact@v8 has been migrated to an ESM module. This should be transparent to the caller but forks might need to make significant changes.

[!IMPORTANT] Hash mismatches will now error by default. Users can override this behavior with a setting change (see below).

Direct downloads

To support direct uploads in actions/upload-artifact, the action will no longer attempt to unzip all downloaded files. Instead, the action checks the Content-Type header ahead of unzipping and skips non-zipped files. Callers wishing to download a zipped file as-is can also set the new skip-decompress parameter to true.

Enforced checks (breaking)

A previous release introduced digest checks on the download. If a download hash didn't match the expected hash from the server, the action would log a warning. Callers can now configure the behavior on mismatch with the digest-mismatch parameter. To be secure by default, we are now defaulting the behavior to error which will fail the workflow run.

ESM

To support new versions of the @actions/* packages, we've upgraded the package to ESM.

What's Changed

Full Changelog: actions/download-artifact@v7...v8.0.0

v7.0.0

v7 - What's new

[!IMPORTANT] actions/download-artifact@v7 now runs on Node.js 24 (runs.using: node24) and requires a minimum Actions Runner version of 2.327.1. If you are using self-hosted runners, ensure they are updated before upgrading.

Node.js 24

This release updates the runtime to Node.js 24. v6 had preliminary support for Node 24, however this action was by default still running on Node.js 20. Now this action by default will run on Node.js 24.

What's Changed

New Contributors

Full Changelog: actions/download-artifact@v6.0.0...v7.0.0

v6.0.0

... (truncated)

Commits
  • 3e5f45b Add regression tests for CJK characters (#471)
  • e6d03f6 Add a regression test for artifact name + content-type mismatches (#472)
  • 70fc10c Merge pull request #461 from actions/danwkennedy/digest-mismatch-behavior
  • f258da9 Add change docs
  • ccc058e Fix linting issues
  • bd7976b Add a setting to specify what to do on hash mismatch and default it to error
  • ac21fcf Merge pull request #460 from actions/danwkennedy/download-no-unzip
  • 15999bf Add note about package bumps
  • 974686e Bump the version to v8 and add release notes
  • fbe48b1 Update test names to make it clearer what they do
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

msradam and others added 14 commits May 18, 2026 00:17
Base install (parser + JCL/JSON/YAML/CSV serializers) is unchanged from
0.2.0 in terms of public API.

New optional extra `pip install fromjcl[zoau]` adds:
- --to zoau: translate steps into ZOAU 1.x shell (dtouch, drm, dcp,
  dgrep, dsed, dzip/dunzip, dmv, mls, ...)
- --to mvscmd: lower-level mvscmd/mvscmdauth fallback for steps without
  an opinionated ZOAU mapping
- bashlex-based validator: every flag in the emitted script is checked
  against a frozen 55-verb / 493-flag ZOAU manpage table; warnings
  surface as `# WARNING:` lines and exit non-zero in --strict (default)
- Every emitted shell script carries an EXPERIMENTAL banner

Also:
- IF/THEN/ELSE translation: JCL conditionals become bash `if (( ... ))`
  guards. ABEND/RUN get best-effort approximations with explicit warnings.
- Corpus grows 50 -> 55 samples (IBM bucket 14 -> 19) with new coverage
  for JES2 /*JOBPARM + /*OUTPUT referbacks, JES3 /*SETUP + /*MESSAGE,
  JCLLIB ORDER=, PROC step DD overrides, BPXBATCH inline shell.
- New combinatoric roundtrip matrix test:
  JCL -> {JSON,YAML,CSV} -> JCL -> Job IR fixed-point under dataclass
  equality. Two pre-existing bugs are pinned as xfail with explicit
  fix-locations: IF re-emission exceeds 71-col limit; CSV drops job
  SET symbols.
- Two parser limitations surfaced by the expanded corpus are filed as
  TODOs in _scanner.py: /*-control statements drop cols 73-80;
  trailing \x1a EOF triggers spurious synthetic SYSIN.

Audit pass per stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments:
- Rewrote tests/test_cli_gate.py — it had been 100% silently skipped
  because it `importorskip`ed ansible, which the OSS slice does not
  ship. Now exercises the zoau gate honestly (added 5 tests).
- Removed duplicate / magic-number comments (yaml.py, jcl.py).
- Added defensive comments for C-port parity (_scanner.py), domain
  decisions (common.py program lists, classify.py DISP semantics),
  and the bash truthy idiom in _conditions.py.
- TODOs added for silent lossy defaults in rejcl.py.

Punted to a local `dev` branch (not pushed): the Ansible converters
(zos_core, zos_mvs_raw), the z/OSMF converter, the Makefile converter,
and the dep/conditions graph utilities that depend on them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Audit against peers (ibm_zos_core, Zowe CLI, MikeFultonDev/JCLParser,
ibmruntimes/zoslib, zopencommunity/meta) surfaced a small set of gaps
in the disclosure stack ahead of publishing 0.3.0.

- Add NOTICE consolidating attribution for the JCLParser port and the
  IBM/IBM-Z-zOS vendored samples; include it in pyproject license-files
  so it ships in the sdist/wheel.
- Tighten the README Trademarks section: drop "JCL" (generic technical
  term, not on IBM's published trademark register), expand ZOAU to
  "Z Open Automation Utilities (ZOAU)", cite ibm.com/legal/copytrade,
  add the IBM standard "Other product and service names ..." sentence.
  Keep the "independent community effort, not affiliated" sentence —
  fromjcl is the only audited project that needs this, since the peers
  are either IBM-led or under a foundation umbrella.
- Add CONTRIBUTING.md requiring DCO sign-off (matches Zowe/zopen),
  documents the test-corpus convention.
- Add SECURITY.md with private reporting via GitHub Security tab + email.
- Add CODE_OF_CONDUCT.md (Contributor Covenant 2.1 verbatim) with the
  maintainer email as enforcement contact.
- Add `# SPDX-License-Identifier: Apache-2.0` header to every
  src/fromjcl/*.py (22 files). Matches the per-file licensing posture
  of Zowe, zoslib, and IBM-Z-zOS.

Deferred to a follow-up commit: replacing the 9 IBM-Redbook-transcribed
JCL samples (DFSMS / MVS-JCL-Reference / MVS-JCL-User's-Guide) with
hand-authored paraphrases. The current SOURCES.md "fair use" framing is
the only piece of the audit that none of the peer projects do — clean
room paraphrases remove the exposure entirely.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…BM-Redbook examples

CORPUS

- ibm/ grows from 14 to 47 samples by pulling from github.com/IBM/* and
  zowe/* (Apache-2.0 / MIT only). Coverage now spans BCPii SYSAFF=,
  CICS DFHCSDUP, DB2 utilities, DBB COBOL/PL/I, ICSF SORT+REXX,
  CustomPac SMP/E, Open Enterprise SDK for Apache Kafka, zOS Client
  Web Enablement Toolkit, ansible-collections samples, RACF/SAF
  PassTicket, CA-Top Secret, Z Open Editor ALLOCATE/PLIALLOC/ASMALLOC/
  REXALLOC/RUN/INCLUDE, multi-step PROC with PEND, and a real-world
  844-line DB2 install job. Triage rejected templated files with
  jinja {{ }} placeholders and one source-malformed file with non-space
  data in col 72 of a JOB card.
- Replace 9 IBM-Redbook-transcribed samples (DFSMS AMS, MVS JCL
  Reference, MVS JCL User's Guide) with hand-authored paraphrases that
  exercise the same parser constructs. SOURCES.md no longer claims
  fair use on any sample — only Apache-2.0 / MIT GitHub vendoring and
  clean-room paraphrases.

PARSER FIXES (driven by samples the agent rejected during corpus pull)

- Bare `/*` end-of-data delimiters between DD blocks (not after an
  in-stream DD) were silently appended as a continuation record of the
  previous statement and re-emitted as `//`. They now get their own
  /* statement; `_reconstruct_jes2` truncates to the recorded record
  length so the original `/*\n` survives byte-exact.
- Trailing EBCDIC `\x1a` EOF sentinel triggered a spurious synthetic
  `//SYSIN DD *` to hold the byte. `_records_from_bytes` now strips
  at and after the sentinel.
- `INCLUDE` statements were dropping their `MEMBER=` parameter because
  `INCLUDE` was missing from `_dispatch`'s `with_params` allowlist.
- Multi-line IF conditions continued across records joined adjacent
  fragments without a separator (`OR\n   COND` became `ORCOND`). Now
  joins with a space. The 71-col multi-line IF re-emission gap stays
  documented in `_REJCL_XFAIL`.

SERIALIZER FIXES (rejcl roundtrip path)

- Blank lines inside in-stream `DD *` blocks now survive the synthesis
  path. The `if line:` filter in `_emit_dd_with_instream` was dropping
  them; switched to `splitlines()`.
- The instream cleanup in `serialize/__init__.py:remove_nulls` strips
  at most one terminating newline, so trailing blank lines (encoded as
  `\n\n`) survive JSON/YAML/CSV roundtrip.

Tests: 652 passing, 20 xfailed. The xfails document three remaining
limitations: multi-line IF re-emission exceeds the 71-col limit; CSV
has no column for job-level SET symbols; PARM with a paren-list
containing a quoted token over-escapes through the rejcl path. Two
parser limitations stay filed as in-code TODOs: cols 73-80 dropped on
`/*` JES2/3 statements; `//*` comment inside a continuation chain
crashes or corrupts (affects SMP/E samples — gimzip/PTF@/PTFMERGE
remain rejected from the corpus).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Keeping a CHANGELOG ahead of any release just creates rot. Start one
when there is a v0.3.0 tag to be the "before" line.

Also drops the matching CHANGELOG reference from README and the
"keep the changelog current" line from CONTRIBUTING.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Behaviour is preserved: same positional input, same options
(--rejcl, --from, --to, -o/--output, --strict/--no-strict), same
exit codes, same gate semantics. main() still returns int so the
test harness (which calls cli.main() directly under monkeypatched
argv) is unchanged.

What we gain in exchange for the typer dependency:
- Rich-formatted --help with per-option type annotations.
- Bad enum values get a structured error box instead of a one-line
  argparse error.
- Argument/option semantics are declared with type hints, which
  shortens the file from ~150 to ~180 lines but moves all the
  "what's allowed" knowledge into typing.

OutputFormat / InputFormat StrEnums replace string choices lists;
the few places that compared `fmt == "zoau"` now compare against the
enum member.

typer pulls in click, rich, shellingham — pure Python wheels, all
install on z/OS via IBM Open Enterprise Python.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment audit (against the Stack Overflow 9 rules) flagged four small
items in serialize/jcl.py and _scanner.py:

- serialize/jcl.py:_format_param — drop two redundant comments around
  the PARM-already-quoted branch (rule 1); the conditional is
  self-explanatory.
- serialize/jcl.py:_emit_quoted_parm — rewrite docstring to say what
  the "incomplete final line" actually is (rule 4) and drop the
  inline comments that duplicated it (rule 1).
- _scanner.py — _blank_record and _blank_after_prefix were
  byte-identical; collapse to one (_blank_after_prefix wins because
  its name describes what it actually checks: cols 3..71, not the
  full record).

OSS readiness audit returned READY with five optional polish items.
Adopting two now:

- .github/workflows/ci.yml — checkout, uv setup on Python 3.12,
  uv sync --all-groups, install bashlex (the [zoau] extra), run
  tests/check.sh, build wheel + sdist, upload artifacts. Makes the
  "CI runs the same pipeline" line in CONTRIBUTING.md real.
- tests/jcl_samples/zoau/SOURCES.md — one-line note explaining the
  .jcl / .zoau twin pairs and the oracle test that consumes them.

Skipping the audit's other three suggestions:
- Inline "Vendored from <URL>, Apache-2.0" markers on the 8
  vendored-from-Apache-source samples would break byte-exact
  roundtrip; SOURCES.md attribution is already authoritative.
- PyPI install-verification badge is premature before the first
  release.
- Tag-and-push v0.3.0 is a release step for the maintainer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PARSER + SERIALIZER

Previously the test report showed 20 xfailed. Three root causes
addressed so the report is now 672 passed / 0 xfailed / 0 failed.

- serialize/jcl.py:_format_param. PARM=(token,token,'spaced') is a
  paren-list, not a quoted string. Pass it through unchanged instead
  of wrapping the whole value in single quotes and doubling inner
  apostrophes. Resolves the 3 asm_lked_go_cond rejcl-matrix entries.
- serialize/csv.py. Add a `symbols` column that flattens job-level
  SET symbols to `name=value;name=value`. rejcl reverses on read.
  Resolves 14 csv-only rejcl-matrix entries.
- serialize/csv.py:_format_instream. Old code used `.strip("\\n")`
  which strips any trailing chars in the set {backslash, n} and ate
  trailing blank lines. Mirror the rule already in remove_nulls:
  strip exactly one terminator if the last line has content; keep
  trailing blank lines.
- serialize/jcl.py:_emit_if. Long IF conditions (composite "(NOT A)
  AND (B)" forms that rejcl reconstructs from nested IF/ELSE) now
  break across continuation records at whitespace, with the
  continuation starting at col 11 to mirror the scanner's join
  behavior. Resolves the 3 if_nested_procs rejcl-matrix entries.

VOICE

- Em dashes removed across docs and source comments (CONTRIBUTING.md,
  6 source files, 5 test files). Replaced with periods, colons,
  parentheses, or commas as fits the sentence.
- The one fixable "not just" in classify.py rewritten. The instance
  in CODE_OF_CONDUCT.md stays as part of the verbatim Contributor
  Covenant 2.1 text.

README

- Mention typer in the runtime dep list (was wrong before).
- Note the 83-sample corpus and where it came from.
- Add an extra jq query example and a one-line dataclasses note for
  the Python-API section.
- Add CI workflow callout in Development.
- Cross-link CONTRIBUTING and SECURITY in Docs.

PYPI

- `twine check dist/*` PASSED on both wheel and sdist.
- METADATA is PEP 639 (License-Expression: Apache-2.0) and includes
  LICENSE + NOTICE under License-File.
- 30-file wheel, 170 KB; sdist ships LICENSE, NOTICE, PKG-INFO,
  README, pyproject, src/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
REGRESSION COVERAGE

Three test files cover gaps the corpus tests missed:

- test_golden_conversions.py: 10 tests. The json_samples/ and
  yml_samples/ goldens (5 paired with JCL inputs) were sitting unused;
  this wires them in. Catches semantic drift (field rename, value
  normalisation) that the matrix tests miss because the matrix only
  checks "non-empty steps". Goldens were regenerated to reflect the
  current YAML block-scalar representer and trailing-newline rule;
  any future serializer change that drifts from them fails here.
- test_cli_smoke.py: 7 tests. Spawns the installed `fromjcl` entry
  point via subprocess and exercises --to yaml, --to json, --to jcl
  byte-exact, stdin input, --rejcl through a temp file, bad-format
  rejection, and --help. The existing test_cli_gate.py monkeypatches
  sys.argv and calls main() directly so cannot catch [project.scripts]
  wiring bugs. This file does.
- test_models.py: 19 tests. Direct unit coverage for Disposition,
  Space, and DCB factory methods, including the None / empty /
  referback (`*.STEP.DD`) / malformed-numeric / unrecognised-key
  branches the corpus tests do not reach.

Total: 672 -> 708 tests, still 0 failures / 0 xfails.

pyproject.toml now adds S603 (subprocess-in-tests) to the
tests/** ruff-lint ignore list; we trust our own binary on
known inputs.

COMMENTS

Pass over every multi-line comment block added in the recent fix
commits. Removed narrative bloat. New rule of thumb in this codebase:
if the comment runs 3+ lines, either the code needs to be rewritten
to be self-explanatory or the comment is over-explaining. Defenders
of unidiomatic code stay (rule 5 of the SO guide), but they are now
one or two lines, not five.

Trimmed blocks in: _scanner.py (ScanState enum, Stmt dataclass, JES2/3
cols-73-80 TODO, \\x1a EOF strip, bare /* dispatch, IF continuation
join, conditional_col, JCLCMD body capture), serialize/__init__.py
(remove_nulls), serialize/csv.py (_step_base symbols, _format_instream),
serialize/jcl.py (_format_param PARM shapes, _emit_if continuation,
_emit_dd_with_instream blank lines, _reconstruct_jes2 trim),
converters/common.py (program lists, STEPLIB insert, DIRBLKS),
converters/classify.py (IEFBR14 DISP, matcher order),
converters/_conditions.py (ABENDCC),
converters/shell/zoau.py (type_map, ISRSUPC dispatch),
rejcl.py (CSV JOB-fields, DLM TODO, removed a duplicated block),
models.py (DD concatenation, bare-token-as-PROC), cli.py (main()
docstring), _validate.py (flag tokens, # banner strip).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
typer.echo() appends a trailing newline beyond what the serializer
emits. Concretely, `fromjcl --to jcl` piped to stdout produced
`...text\n\n` while `--to jcl -o file` produced `...text\n`. The
file-output path was right; only stdout was off by one byte.

_write_output now ensures exactly one trailing newline on both paths
by writing the same normalized text via sys.stdout.write for stdout
and Path.write_text for files. `fromjcl --to jcl | diff - input.jcl`
is now empty.

Found during a fresh-install smoke check against
`dist/fromjcl-0.3.0-py3-none-any.whl` from a clean venv.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LIBRARY API

Until now `from fromjcl import ...` exposed only `parse` and `Job`.
Everything else (serializers, model dataclasses, the reverse path)
was reachable but underground. Promote them:

  from fromjcl import (
      parse, parse_bytes,
      Job, Step, DD, Dataset, Disposition, Space, DCB,
      to_json, to_yaml, to_csv, to_jcl, to_raw,
      from_dump,
  )

Anything under `fromjcl._*` or `fromjcl.converters.*` stays internal
and may change without a deprecation cycle. README has a new Python
API section with examples and a name table. test_public_api.py locks
the surface in (5 tests) so accidental additions or removals fail
the build.

SECURITY / COMPLIANCE

Per a fresh comparison with ibm_zos_core, zowe-cli, IBM/zoslib, and
MikeFultonDev/JCLParser, three P0 gaps closed and one piece of
ceremony dropped:

- .github/workflows/release.yml uses PyPI Trusted Publishing
  (id-token: write, pypa/gh-action-pypi-publish), so releases get
  PEP 740 attestations automatically and there is no long-lived API
  token in GitHub secrets. Triggers on `v*` tags or manual dispatch;
  runs the full quality gate, then twine check, then publish.
- .github/dependabot.yml configures weekly github-actions updates.
  (pip ecosystem dropped per scope discussion: too noisy for a
  single-maintainer project; pip-audit in CI already catches CVEs.)
- ci.yml gains bandit + pip-audit + twine check.
- bandit, pip-audit, twine moved into the dev dep group.
- Dev-dep CVEs in pytest (CVE-2025-71176) and pygments
  (CVE-2026-4539) pinned to fixed versions. PYSEC-2022-42969 in `py`
  is documented as not-applicable (`py.path.svnwc` not invoked).
- CODEOWNERS deleted as solo-maintainer ceremony with no signal.

DOCS + DEMO

- docs/demo.tape + docs/demo.gif: a VHS recording of the CLI walking
  through `--to yaml`, `--to zoau`, `jq` querying, and byte-exact
  roundtrip. README embeds the gif under the lead snippet.
- docs/sample.jcl: tiny self-contained JCL used by the demo so the
  recording does not depend on the test corpus.
- docs/marp/visual.md + fromjcl-before-after.png: a 16:9 slide built
  with the neobrutalism marp theme (thick borders, offset shadows,
  yellow accent badge). Shows JCL on the left and YAML + ZOAU shell
  on the right. Suitable for a LinkedIn share.

ATTRIBUTION

- _scanner.py module docstring now cites Mike Fulton's JCLParser
  by name with the URL and Apache 2.0. Earlier audit confirmed
  fromjcl's attribution stack (NOTICE, README, ARCHITECTURE,
  parser_edge_cases/SOURCES.md) already exceeds what JCLParser
  itself requires (no NOTICE upstream; LICENSE is just the 11-line
  Apache trailer).

Tests: 708 -> 713 (added 5 in test_public_api.py).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- .gitignore: docs/marp/ excluded going forward.
- Untracked: visual.md, .marprc.js, theme CSS, and the rendered PNG.
  Files stay on disk so the deck can still be re-rendered locally.
- Updated visual: 16:10 aspect (1280x800, was 1280x720), coral
  accent (#ff5b3a) instead of yellow, tighter top padding, larger
  code font, footer band with `pip install fromjcl` and the repo URL.

The docs/demo.gif stays tracked since it is embedded in the README
and shows visiting users what the CLI does.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Missed in 2b79300; the docs/marp/ delete made it into that commit
but the gitignore line that prevents re-tracking did not.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hed ARCHITECTURE

README

- PyPI version, Python versions, license, and CI status badges. These
  only become useful once we are on PyPI; that happened today.
- Docs section gains a link to CHANGELOG.md.

CHANGELOG.md

- v0.3.0 entry written now that the release is live on PyPI. The
  earlier commit dropped the file because no release existed yet to
  anchor it; now there is one.

docs/ARCHITECTURE.md

- Rewritten to match the actual OSS slice. The previous version still
  referenced _ansible_modules.py, converters/ansible/, converters/zosmf.py,
  converters/makefile.py, converters/_deps.py, and argparse, none of
  which ship. Module map and intent table now reflect what is actually
  in src/.
- Added a Public API section that mirrors fromjcl/__init__.py and the
  test_public_api.py contract.
- Bumped corpus count from 50 to 83.
- Added a rejcl-matrix section under "Roundtrip guarantees" so the
  semantic-equivalence contract is documented next to the byte-exact
  one.

.github/

- ISSUE_TEMPLATE/bug_report.md and feature_request.md so first-time
  reporters know what to include (JCL repro, version, [zoau] yes/no).
- pull_request_template.md reminds contributors to run tests/check.sh,
  update the corpus for parser changes, update test_public_api.py
  when adding or removing public names, and sign off commits.

Tests still 713 / 0 failed / 0 xfailed. Wheel + sdist rebuilt and
twine check PASSED.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bumps the actions group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact).


Updates `actions/checkout` from 4 to 6
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)

Updates `astral-sh/setup-uv` from 5 to 7
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@v5...v7)

Updates `actions/upload-artifact` from 4 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

Updates `actions/download-artifact` from 4 to 8
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: astral-sh/setup-uv
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels May 18, 2026
@dependabot @github
Copy link
Copy Markdown
Contributor Author

dependabot Bot commented on behalf of github May 18, 2026

Looks like these dependencies are updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this May 18, 2026
@dependabot dependabot Bot deleted the dependabot/github_actions/actions-02bc13e553 branch May 18, 2026 06:38
Repository owner locked and limited conversation to collaborators May 18, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant