Revision history for App::prepare4release 0.03 2026-04-05 Fix Makefile.PL PREPARE4RELEASE postamble replacement: _replace_marked_postamble_block used s/// with the /x flag, which ignored spaces in the pattern and treated # as a comment, so lines like "# BEGIN PREPARE4RELEASE_POSTAMBLE" never matched and pod2markdown was not upgraded to pod2github under --github/--gitlab. Use a single-line pattern with ms only (no /x). _patch_meta_merge_block: log "patched existing META_MERGE" only when content actually changes. Tests: t/postamble-crlf.t (CRLF + LF + realistic Makefile.PL fragment). 0.02 2026-04-05 Invalid prepare4release.json: warn and treat as {} (no fatal decode). Root JSON keys copied into Makefile.PL WriteMakefile: author, abstract, abstract_from, license, min_perl_version / perl_min, module_name / name, version_from, exe_files (array). New App::prepare4release::Deps: static scan of lib/, bin/, maint/, t/ (optional xt/) for use/require; optional --sync-deps / dependencies.sync merges missing modules into PREREQ_PM and TEST_REQUIRES; appends requires/test_requires to cpanfile when present (dependencies.sync_cpanfile, dependencies.skip, dependencies.scan_xt). Module::CoreList for omitting core deps without explicit use VERSION. Tests: t/config-load.t, t/makefile-metadata.t, t/deps-sync.t; integration fixtures use dependencies.skip. Deps.pm: $VERSION for Test::Version. POD/README: document JSON resilience, metadata keys, dependency sync. t/deps-sync.t: use lib ../lib for harnesses without prove -Ilib; Deps: guard Module::CoreList::is_core with eval + can() for older perls. 0.01 2026-03-31 MY::postamble runs maint/inject-readme-badges.pl after pod2github/pod2markdown: generated standalone Perl (core only) embeds frozen README shields so make README.md does not require App::prepare4release at build time; commit the script for CPAN clones. POD: section L. With --cpan: ensure LICENSE (Artistic/Copying from upstream or built-in fallback), README stub when only README.md exists, default MANIFEST.SKIP if missing, then perl Makefile.PL and make manifest. Version bump to 0.01. xt/metacpan-live.t: import cmp_ok from Test2::Tools::Basic. xt/author/cpants.t: remove tarball after analysis (fixes portability.t). Ship LICENSE, README, MANIFEST.SKIP for CPANTS/kwalitee. 0.001 CI: GitHub Actions / GitLab CI templates (Perl matrix via MetaCPAN ceiling), optional ci.apt_packages, Alien::* scan hint, tests and expanded POD. xt/metacpan-live.t runs against live MetaCPAN when RELEASE_TESTING is set. Tests use Test2::V1; Makefile.PL author Sergey Kovalev. Warn on Test::More/Test::Most in t/xt; xt/author extended tests (Synopsis, …). Removed Test::Kwalitee::Extra / xt/author/kwalitee-extra.t. xt/author/pause-permissions.t and pod-coverage.t use Test::More (not Test2) so Test::PAUSE::Permissions / Test::Pod::Coverage load correctly. Those tests' skip_all now includes $^X and $@ (diagnose wrong perl / @INC). pause-permissions: use all_permissions_ok (CPAN API). pod-coverage: FQCN pod_coverage_ok (avoid Test::More plan import clash). xt/author/cpants.t: Module::CPANTS::Analyse on make tardist (RELEASE_TESTING=1). cpants.t: require Module::CPANTS::Kwalitee->can(new); TEST_REQUIRES Kwalitee. cpants.t: unlink existing tarball before tardist (non-interactive gzip). Empty or whitespace-only prepare4release.json loads as {}; t/config-load.t. META_MERGE patch: quotemeta resources head in s/// (brace in pattern). Do not warn legacy Test::More on author tests that require Test::Builder. Makefile.PL: fix META_MERGE (resources/bugtracker inside resources => {}). Badges in README.md (after make/pod2conversion), not in POD; strip legacy POD badge blocks. git.author required for --github/--gitlab unless git.repo is a full path or URL. CI badge: GitHub only with --github; GitLab pipeline only with --gitlab (host: git.server, else from git.repo URL, else gitlab.com). Fix _pod_badge_markdown_line when called as a method (invocant shift). README license badge: Makefile.PL LICENSE or infer from root LICENSE file; link to repo LICENSE blob with --github/--gitlab and git.default_branch. Perl badge minimum: min_perl_version / perl_min in JSON, else MIN_PERL_VERSION. README badges: no HTML comment wrappers; strip prior shields by line pattern. MetaCPAN matrix ceiling: GET /v1/release/perl (fix bogus sort=version first hit). Ceiling tag: robust version parse; reject minors below 10 (bogus v5.8.x data). GitHub CI: use shogo82148/actions-setup-perl (shivammathur/setup-perl does not exist). Makefile.PL: TEST_REQUIRES only Test2::Suite; xt/author deps in META develop; generated CI uses cpanm --installdeps . without --with-develop. CI: perl Makefile.PL before installdeps; explicit cpanm Test2::Suite (cpanfile shortcut). t/helpers-more.t: unit tests for URL/git helpers, badges, license inference, README badge insert/strip, parse_argv, MetaCPAN ceiling helpers, list_files_for_eol_xt. t/more-coverage.t: integration run() via fork+exec (FindBin-safe), apply_ci_files, warn_legacy_test_frameworks, Makefile postamble/META_MERGE, strip POD badges, etc. t/coverage-edge.t: MetaCPAN/HTTP fallbacks (mocked HTTP::Tiny::get), empty CI matrix, split_pm without __END__, ensure_meta_merge skip, license/min-perl edge cases. Fix _find_exe_in_path: was using invocant as program name (method needs ($class, $name)). Integration runs use --verbose to exercise run() diagnostic warnings.