Skip to content

Releases: RoryGlenn/commitment-issues

v3.5.1

Choose a tag to compare

@github-actions github-actions released this 26 Jul 17:10
Immutable release. Only release title and notes can be modified.
322f8a3

Fixed

  • Empty project scripts survive init/uninstall; empty prepare fails
    before writes.
  • Pre-commit linting, formatting, related-test discovery, and optional test
    execution now inspect one immutable tree created from an exact copy of the
    active Git index, including Git's temporary commit --all index. Unstaged or
    untracked files can no longer hide staged problems, satisfy missing-test
    checks, enter test runs, or create false CRLF/filter warnings; deletion-only
    commits also evaluate source/test relationships in the resulting commit tree
    without changing partial staging. Blob contents are materialized in bounded
    batches, and Windows keeps dependency junctions on a traversable filesystem
    without requiring privileged symbolic-link creation.
  • init now composes install-time repair safely when a project-owned
    prepare ends in a semicolon, background operator, trailing whitespace,
    quoted shell text, or multiple lines. It repairs the exact malformed suffix
    generated by older composition, while init, doctor, and uninstall
    refuse heredoc composition plus displaced or duplicate repair commands,
    including repairs inside shell control flow, before mutation; uninstall
    restores the original project command byte-for-byte and never claims complete
    removal while an ambiguous owned repair remains.
  • Production installs no longer fail when commitment-issues is intentionally
    omitted as a development dependency. init now generates a Node-only
    prepare repair guard that invokes the exact project-local CLI when its
    package is installed and exits successfully when the package is absent,
    without a global, npx, package-runner, or network fallback. Direct package
    removal therefore cannot brick the next install, while normal installs still
    repair clone-local hooks.
  • fix:staged and commit:fix now treat a timeout, signal, spawn failure, or
    missing local fixer as an interruption, discard incomplete stdout, stop
    before later tool phases, and refuse before applying, staging, or amending.
    The exact pre-run index and HEAD remain unchanged. If a tool changed a
    target path directly, the command reports every affected path and leaves its
    worktree bytes untouched rather than risk overwriting concurrent user work;
    completed nonzero lint runs can still contribute attributable fixes.
  • fix:staged and commit:fix now refuse before fixer tools when a target has
    assume-unchanged, skip-worktree, core.ignoreStat-derived, intent-to-add,
    sparse-checkout, unresolved, or other non-ordinary index state. Snapshot
    capture binds each regular target's exact index blob to its worktree identity
    and bytes, then revalidates the complete index and target snapshot after Git
    probes, preventing hidden private edits or mixed-time inspection from being
    formatted, staged, cached, or amended.
  • commit:fix now refuses before fixer tools or repository mutation whenever
    Git reports an active merge, cherry-pick, revert, rebase, git am, or
    sequencer state. Worktree-specific operation paths are inspected fail-closed,
    including clean-index and empty-operation pauses, and revalidated before
    tools, worktree writes, index staging, and amend so continuation state is
    preserved exactly.
  • Runtime checks, fixers, panic, and direct commit-message checks now resolve
    the owning Git worktree before loading root configuration, interpreting
    Git-reported paths, finding local tools, or launching child processes.
    Commands behave consistently from repository descendants, nested
    repositories, submodules, and linked worktrees; setup, doctor, and uninstall
    now refuse descendant directories explicitly while recognizing alternate
    filesystem spellings of the root, including Windows short paths.
  • Parent SIGINT, SIGTERM, and SIGHUP now terminate active attached tool
    trees before signal-appropriate exit. Timeouts share this cleanup, and a
    bounded fallback releases pipes held by unreclaimable escaped descendants.
  • Project-file and fixer transactions now treat hardlink count as part of file
    identity. Existing hardlinked repository paths are replaced instead of
    modified through the shared inode, so external aliases retain their original
    bytes; co-selected fixer targets that share one inode are refused before
    mutation, and a hardlink added or removed while tools run causes a
    fail-closed refusal.
  • commit:fix now refuses detached or non-branch HEAD, signed commits, and
    commits retained by a local tag or locally known remote ref. It revalidates
    the exact branch attachment and protected-ref snapshot before mutation, and
    documents the honest offline boundary: remote-only refs remain unknowable
    until fetched, because the command never contacts the network.
  • fix:staged and commit:fix now bind automatic fixes to the exact HEAD,
    index file, and target bytes inspected before local tools run.
    ESLint and Prettier transform those captured bytes through stdin; the
    commands revalidate repository and publication state before staging or
    amending, install only attributable blobs under Git's index lock, and refuse
    detected concurrent edits, deletion, type replacement, index updates, HEAD
    moves, or publication without absorbing user work. Per-file tool processes
    use bounded concurrency and one shared timeout for the complete fix.
  • Setup and uninstall no longer truncate consumer-owned project files in
    place. Complete replacement bytes are staged, permissioned, synced, closed,
    and revalidated byte-for-byte through a no-follow descriptor before an atomic
    commit; short writes and later filesystem failures leave each file as a
    complete old or new version, never empty or partial. Retry also removes
    reserved transaction files left by a terminated writer without touching an
    active process's stage.

v3.5.0

Choose a tag to compare

@github-actions github-actions released this 24 Jul 02:23
Immutable release. Only release title and notes can be modified.
54c98e5

Added

  • Added a model-independent semantic context gateway for Codex and Claude.
    Cross-version host configs deliver stable, bounded, integrity-checked context
    from case-sensitive exact focuses and shared policy, with complete internal
    edges and atomic receipts. Emission is verifiable; comprehension is not.
  • Added a repository-only semantic project graph for maintainers and coding
    agents. An Espree-backed compiler maps capabilities to commands, hooks,
    modules, exports, configuration, tests, canonical docs, and package files;
    every relationship carries evidence and an explicit certainty. Deterministic
    tree/impact JSON queries report bounded retrieval bytes, while source
    fingerprints and drift checks reject stale caches and invalid claims. The
    graph remains local, does not run in normal hooks, and is excluded from the
    published npm package.
  • Added the beginner-friendly panic command: one deterministic, read-only
    view of the current Git state with explained inspection steps and narrowly
    gated, content-preserving unstage or previous-branch options. It covers
    detached HEAD, active merge/rebase/cherry-pick conflicts, staged and deleted
    changes, untracked files, and recent branch switches without executing a
    recovery operation or displaying commands that discard work or force
    history changes.
  • Added an opt-in, advisory-only staged debug-artifact check with curated
    language-scoped rules for common JavaScript, Python, Ruby, and explicit
    temporary-comment markers. It scans only added lines through the existing
    structurally validated Git patch parser, excludes documentation, fixtures,
    snapshots, and effective generated paths by default, supports deterministic
    path-glob exemptions, aggregates human output, and publishes stable JSON
    check, subtype, and rule identifiers without changing the strict schema-v1
    finding shape. Unavailable or malformed diffs warn and still allow the
    commit.
  • Added non-destructive init/doctor --integration[=<manager>]
    coexistence for Husky, Lefthook, and the Python pre-commit framework. Setup
    prints exact project-local snippets, automatic detection refuses ambiguous
    ownership, install-time verification requires the manager's executable Git
    dispatcher without rewriting it, and uninstall preserves every
    project-owned manager entry. lint-staged remains an explicitly separate
    command in the existing hook flow.
  • Added a tested, fail-closed pull-request change classifier. Pure
    documentation and metadata changes retain DCO, static quality, formatting,
    dependency audit, and focused documentation, schema, link, asset, release,
    and workflow-policy tests while skipping the irrelevant compatibility
    matrix; every deletion, rename, copy, other category, mixed change, unknown
    path, ambiguous Git status, shallow history, diff failure, or classifier
    failure runs the full required graph. The focused path also derives the
    canonical 100% badge directly, so a README edit cannot falsify or stale it.
    Pull requests execute the classifier from the immutable base commit rather
    than trusting fork code. CI Success accepts skips only for the classifier's
    exact, internally consistent documentation-only result.
  • Added a reusable before/after workflow graphic and social-ready 16:9 export,
    pairing the existing 26-second terminal demo with consistent README, package
    metadata, rationale, and launch messaging: catch mistakes while they are
    still cheap to fix, get the exact safe command, and keep CI authoritative.
  • Added an upload-ready Product Hunt media pack with a square thumbnail and
    four deterministic gallery cards showing the before/after story, two-command
    setup, advisory warning, and safe fix flow.

Changed

  • Replaced direct npm publishing with stage-only OIDC and human 2FA approval.
    The exact candidate, source, toolchain, draft, provenance, and four recovery
    states are verified before an npm-incapable GitHub finalizer runs.
  • Refactored the packed package-manager lifecycle from one monolithic smoke
    script into named node:test phases over one shared disposable fixture.
    Exact-tarball inspection, real Git hooks, workspace and worktree behavior,
    clone repair, uninstall ownership, and the npm/pnpm/Yarn/Bun CI matrices
    remain intact, while failures now identify the lifecycle phase directly.
  • Simplified the before/after graphic into a picture-first, jargon-free story:
    send, wait, find a mistake, and redo versus spot it, fix it, and send once.
  • Redesigned CLI help around described setup, check, and fix actions, with the
    installed version, examples, safe command-specific help, and a separate
    integration section for commit-msg, normally invoked automatically by Git.
    The low-level fix-staged-js package compatibility command remains callable
    but no longer competes with the safer developer-facing fix action in primary
    help.

Fixed

  • Made Husky, Lefthook, and pre-commit coexistence entries select only the
    first regular executable project-local launcher from the exact extensionless,
    .exe, .cmd, and .bat candidates. Missing, pruned, wrong-kind, or
    non-executable launchers now fail open silently without a PATH/global
    fallback, while literal hook argv and real blocking exits still propagate.
  • Hardened hook-manager coexistence verification: Lefthook snippets are static
    and resolve the active commit-message path inside Commitment Issues,
    effective Lefthook wrappers must forward hook arguments, pre-commit wrappers
    must contain a real dispatch, and linked Husky roots/runtime directories are
    rejected without reading through them. Custom executable Husky v8 hooks
    remain valid unless they explicitly source an invalid _/husky.sh runtime.
    Active older direct, duplicate, and cross-stage Commitment Issues calls are
    reported for targeted replacement, removal, or relocation instead of being
    hidden by a healthy guarded entry. A cross-stage-only hook also retains its
    missing own-stage snippet so relocation alone is not presented as complete.
    Init and doctor now print remediation snippets only for inactive hook
    entries, so fully wired integrations are not told to add duplicates.
    Uninstall cleanup guidance also recognizes exact current and pre-dispatch
    manager entries even after custom commands, without treating them as healthy
    or changing manager-owned files.
    Lefthook's fixed package-owned file producer keeps empty commits and pushes
    inside the policy path, while canonical POSIX/Windows and workspace-root
    wrappers are inspected without executing repository-controlled manager code.
  • The staged large-file guard now gives its fixed-argv, NUL-safe whole-index
    probe an explicit bounded output buffer instead of inheriting Node's roughly
    1 MiB default. Large indexes no longer silently disable oversized-file
    findings, and genuine Git or buffer failures remain advisory but visible.
  • Pre-push now accepts the documented complete PRE_COMMIT_* range environment
    when the pre-commit framework has consumed Git's stdin. Manager-composed hook
    entrypoints honor COMMITMENT_ISSUES=0 and legacy HUSKY=0, and Husky
    snippets preserve nonzero blocking exits before later custom commands.
  • Pre-commit lint, format, and staged-test checks plus configured pre-push tests
    now partition path arguments by one shared platform-aware byte/unit budget
    instead of passing an unbounded argv. Non-zero batches continue so every
    finding and test summary is aggregated, while one overall timeout still
    stops interrupted work and cleans up its process tree. The staged large-file
    guard now reads Git's NUL-delimited whole-index stage data and filters exact
    staged paths locally, removing its unbounded pathspec argv without weakening
    hostile-path handling.
  • Contributor onboarding now distinguishes first-time locked dependency setup
    (npm ci) from the lighter hook verification and repair command
    (npm run doctor). The once-per-clone welcome names that repair task
    directly while retaining its detected package-manager command.
  • Release evidence now treats the hosted workflow's single accepted tarball as
    the authoritative byte-level candidate and records each run's SHA-256,
    source, tag, runner OS/image, and exact Node/npm versions together without
    blessing a rejected rebuild. Local pre-release packs remain content and
    behavior evidence without promising identical compressed bytes across
    environments; Audit 9 now records both v3.4.0 artifacts accurately without
    changing the immutable release.
  • Trusted npm publication now tolerates the registry's short metadata and
    attestation propagation delay. Only exact-version and exact-attestation HTTP
    404 responses receive bounded backoff inside a hard 60-second deadline;
    malformed data, unexpected statuses, and any package, tarball, provenance,
    source, or latest mismatch still fail immediately without republishing.
  • Corrected the once-per-clone welcome so it accurately describes Commitment
    Issues in ordinary consumer repositories instead of claiming every project
    uses its own product.
  • init --dry-run no longer tells an already-configured project to rerun and
    apply changes when there are no changes to apply. Dry runs that preview real
    setup work retain the apply instruction.

v3.4.0

Choose a tag to compare

@github-actions github-actions released this 17 Jul 12:23
Immutable release. Only release title and notes can be modified.
b561790

Added

  • Added bounded hook-performance benchmarks for smoke, 250-pair full-hook, and
    1,000-pair argument-pressure repositories. The reproducible reports measure
    discovery, commit/push latency, process-tree memory, fixture size, hostile
    path handling, and conservative Windows argv limits without putting timing
    assertions in ordinary pull-request CI.
  • Added required packed-artifact shell compatibility CI for Linux /bin/sh,
    Bash, and Fish; macOS /bin/sh and Zsh; and Windows PowerShell and Command
    Prompt. Every lane runs an offline commit/push/doctor/uninstall scenario from
    a hostile path with stripped executable discovery. A separate manual
    checklist defines VS Code, JetBrains, and GitHub Desktop UI validation;
    v3.4.0's unavailable GUI lanes are explicitly unverified and deferred to
    #231 rather than inferred from shell success.
  • Added a release metadata gate that requires package.json, both root
    lockfile version records, the exact tag, one dated changelog section, and its
    reviewed notes to agree before publication. GitHub Releases now use the
    validated vX.Y.Z title and extracted changelog body; recovery checks the
    same metadata, while a machine-readable ledger preserves the immutable
    v3.3.0–v3.3.2 exceptions without weakening future releases.
  • Added a shipped compatibility matrix for package managers, Node versions,
    operating systems, shells, Git clients, install modes, and explicit
    unsupported boundaries. Required lifecycle CI now covers Bun 1.3.14, pnpm 10,
    Yarn Classic 1.22.22, and Yarn Berry 4.17.0 with
    nodeLinker: node-modules across Ubuntu, macOS, and Windows at Node 24, plus
    exact-minimum-Node lanes on Ubuntu. Berry uses an independent
    integrity-locked CLI fixture, manager-native workspace commands, and explicit
    doctor repair after clones because it does not run npm's prepare
    lifecycle; Plug'n'Play remains unsupported.
  • Added deterministic cross-version lifecycle coverage using pinned immutable
    v2.5.1, v3.2.0, and v3.3.2 release fixtures. Required pull-request CI proves
    npm upgrades on Ubuntu/Node 24, a read-only release-candidate job exercises
    the exact tarball before its hash-checked handoff to the OIDC publish job, and
    weekly health runs the migration through pnpm, Yarn, and Bun. The supported
    forward path preserves project-owned prepare logic and custom hooks while
    refreshing only exact generated state; in-place downgrades are explicitly
    unsupported and have a documented manual rollback.
  • Pre-commit now shows a default-on Commit Owl welcome once per clone so
    contributors know the repository uses commitment-issues and that confusing
    guidance should be reported. A versioned marker below Git's common directory
    is shared by linked worktrees; showWelcomeOnFirstCommit: false opts out,
    JSON and hook bypasses do not consume it, and all marker failures fail open.

Fixed

  • Large machine-readable hook results now drain every partial or temporarily
    blocked pipe write before immediate exit, preventing JSON above the first
    roughly 64 KiB from being truncated.
  • Repository-controlled filenames, refs, configuration values, and captured
    diagnostics can no longer inject carriage returns, line breaks, tabs, or
    other terminal controls into product-owned human output. Unsafe bytes render
    visibly, ANSI CSI/OSC sequences are stripped, intentional message layout and
    Unicode remain intact, and JSON mode keeps the exact semantic values.
  • Husky-era core.hooksPath recognition now removes trailing separators with
    a bounded linear-time scan, preventing adversarial repository configuration
    from stalling init, doctor, or uninstall through regular-expression
    backtracking.
  • Required and scheduled Yarn Classic jobs now resolve exact version 1.22.22
    from the reviewed npm lockfile instead of installing a second global copy
    outside the repository's integrity-pinned dependency graph.
  • Legacy Husky migration and uninstall cleanup now refuse to follow a linked or
    otherwise uninspectable .husky directory, preventing owned-artifact cleanup
    from deleting files outside the repository.
  • Setup and removal now refuse linked or non-regular package.json,
    .gitignore, and .commitmentrc.json paths. Descriptor and file-identity
    checks prevent a repository-controlled replacement from redirecting project
    writes outside the checkout.
  • Packed Markdown links are now checked against the exact npm tarball manifest
    and again after installation. Links from shipped docs to repository-only
    policies, plans, and audit evidence now use canonical GitHub URLs instead of
    paths that break on npm or inside node_modules.
  • Public adoption, launch, OpenSSF, and security guidance now reflects the exact
    supported package managers, v3.3.2's documented legacy empty release notes,
    local secret-scanning boundary, and completed mainline-tag authorization
    control instead of carrying forward broader or historical claims.
  • The npm tarball now uses a closed allowlist for the 28 installed runtime
    scripts instead of publishing the entire scripts/ tree. Six lifecycle and
    coverage maintenance modules remain repository-only, while package-content
    tests verify the public bin, complete relative-import closure, and exact
    runtime/maintenance classification.
  • Release tags now fail before dependency installation, packing, or publication
    unless their commit is reachable from the canonical main history, closing
    the gap between the reviewed-mainline release policy and the publish
    workflow.
  • The publish workflow now packs once and lifecycle-tests that exact tarball
    before hashing, uploading, and publishing it. The integration verifies the
    packed CLI bin, Node shebang, and reported version on every platform, plus
    normalized executable and non-executable modes on the POSIX release producer.
  • Failed releases now use a tested, fail-closed recovery classification instead
    of blindly repeating publication. Exact same-source and same-byte runs may
    resume unfinished downstream work only while latest still names the
    candidate. The final job cryptographically verifies its local SLSA bundle;
    existing draft assets must be byte-identical, and a draft already containing
    provenance requires a failed-job rerun that retains the original bundle.
    Mismatches and published partial releases require a new patch. npm dist-tag
    changes and deprecation remain manual owner actions, and destructive
    unpublish is never a recovery step.
  • Generated hooks now invoke only the project-local
    node_modules/.bin/commitment-issues entry. Missing local installs
    self-neutralize instead of falling through to a same-named global binary,
    and exact older generated hooks remain safely repairable by doctor.
  • The CLI now reports the required and detected Node versions before dispatch
    when a lenient package manager launches it below Node 22.11.0.
  • pnpm and Yarn recovery/removal guidance now includes required workspace-root
    flags. ESLint/Prettier install hints and quickstarts use major-bounded specs
    that remain installable at the exact Node floor.
  • The package no longer ships its repository-only prepare command as a
    dependency install script. Consumer hook repair remains composed explicitly
    by init and works after normal clone installs.
  • First-run pre-commit warnings and errors now take priority over the Commit Owl
    welcome instead of producing two boxes. The welcome remains unconsumed until
    a later clean or informational run, preserving the one-box-per-invocation
    contract under both hook-output policies.
  • Terminal boxes no longer crash when a launcher supplies a malformed,
    impossibly narrow, or unreasonably large COLUMNS value; the shared renderer
    falls back to the smallest valid rounded presentation.
  • FORCE_COLOR=0 now removes both preformatted body escapes and Boxen border
    color, matching the documented explicit color-disable contract.
  • Opt-in staged-secret enforcement now fails closed when Git cannot launch,
    exits nonzero, or returns malformed patch structure. Advisory mode still
    warns and continues, while terminal and JSON output distinguish an
    unavailable scan from a detected secret. Git-quoted hostile paths and valid
    binary, rename, deletion, missing-newline, and large patch shapes have
    regression coverage.
  • Discovered Node test paths beginning with - are now passed after -- and
    made absolute when necessary, preventing the built-in test runner from
    interpreting a repository filename as an option at commit or push time.
  • Hook classification and repair now refuse symbolic-link hook files and hook
    directories, including dangling links, so setup cannot write through an
    uninspectable hook path.
  • Pre-push Node test reports now live below a randomized private temporary
    directory instead of a predictable process-ID filename.
  • Hook-launched test commands and the repository's disposable Git fixtures no
    longer inherit Git's repository-local routing variables. Nested git init,
    commit, and push commands now stay inside their intended fixture instead of
    mutating the hook caller's repository or remote.
  • Restored post-merge DCO enforcement after one unsigned roadmap update by
    recording the narrow governance exception and synchronizing the operational
    audit baseline across both workflows, the checker, and maintainer guidance.
  • DCO range checks now recognize a valid trailing Signed-off-by trailer after
    Dependabot's commit-message metadata without accepting matching lines in the
    message body.
  • CLI setup and hook-health commands now reject unknown options before
    mutation, so a misspelled --dry-run, -n, or --quiet cannot silently
    perform the normal action. Other public commands also reject arguments
    outside their documented contracts.
  • init now inspects and preflights project-file writes before installing
    hooks, reports unreadable `.gitig...
Read more

v3.3.2

Choose a tag to compare

@github-actions github-actions released this 12 Jul 13:33
Immutable release. Only release title and notes can be modified.
57ac737
v3.3.2

v3.3.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 11:50
Immutable release. Only release title and notes can be modified.
a653c1d
v3.3.0

v3.2.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 12:37
Immutable release. Only release title and notes can be modified.
3.2.0

v3.1.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 02:03
Immutable release. Only release title and notes can be modified.
ci: stop self-updating npm in publish.yml

Node 24 bundles npm >= 11.5.1 already; 'npm install -g npm@latest'
self-updated npm in place and corrupted it (MODULE_NOT_FOUND: sigstore),
failing the v3.1.0 publish. Verify the version instead of mutating.

v3.0.1

Choose a tag to compare

@github-actions github-actions released this 08 Jul 19:50
Immutable release. Only release title and notes can be modified.
3.0.1

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 08 Jul 19:17
Immutable release. Only release title and notes can be modified.
3.0.0

v2.5.1

Choose a tag to compare

@github-actions github-actions released this 08 Jul 15:30
Immutable release. Only release title and notes can be modified.
2.5.1