Repository navigation
Releases: RoryGlenn/commitment-issues
Releases · RoryGlenn/commitment-issues
Release list
v3.5.1
Immutable
release. Only release title and notes can be modified.
Fixed
- Empty project scripts survive
init/uninstall; emptypreparefails
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 temporarycommit --allindex. 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. initnow composes install-time repair safely when a project-owned
prepareends in a semicolon, background operator, trailing whitespace,
quoted shell text, or multiple lines. It repairs the exact malformed suffix
generated by older composition, whileinit,doctor, anduninstall
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-issuesis intentionally
omitted as a development dependency.initnow generates a Node-only
preparerepair 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:stagedandcommit:fixnow 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 andHEADremain 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:stagedandcommit:fixnow 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:fixnow 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, andSIGHUPnow 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:fixnow refuses detached or non-branchHEAD, 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:stagedandcommit:fixnow bind automatic fixes to the exactHEAD,
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
Immutable
release. Only release title and notes can be modified.
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
paniccommand: 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 Successaccepts 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 namednode:testphases 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 forcommit-msg, normally invoked automatically by Git.
The low-levelfix-staged-jspackage 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.batcandidates. 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.shruntime.
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 honorCOMMITMENT_ISSUES=0and legacyHUSKY=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, orlatestmismatch 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-runno 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
Immutable
release. Only release title and notes can be modified.
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/shand 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
validatedvX.Y.Ztitle 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-modulesacross 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
doctorrepair after clones because it does not run npm'sprepare
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-ownedpreparelogic 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 usescommitment-issuesand that confusing
guidance should be reported. A versioned marker below Git's common directory
is shared by linked worktrees;showWelcomeOnFirstCommit: falseopts 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.hooksPathrecognition now removes trailing separators with
a bounded linear-time scan, preventing adversarial repository configuration
from stallinginit,doctor, oruninstallthrough 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.huskydirectory, preventing owned-artifact cleanup
from deleting files outside the repository. - Setup and removal now refuse linked or non-regular
package.json,
.gitignore, and.commitmentrc.jsonpaths. 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 insidenode_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 entirescripts/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 canonicalmainhistory, 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 whilelateststill 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-issuesentry. Missing local installs
self-neutralize instead of falling through to a same-named global binary,
and exact older generated hooks remain safely repairable bydoctor. - 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
preparecommand as a
dependency install script. Consumer hook repair remains composed explicitly
byinitand 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 largeCOLUMNSvalue; the shared renderer
falls back to the smallest valid rounded presentation. FORCE_COLOR=0now 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. Nestedgit 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-bytrailer 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--quietcannot silently
perform the normal action. Other public commands also reject arguments
outside their documented contracts. initnow inspects and preflights project-file writes before installing
hooks, reports unreadable `.gitig...
v3.3.2
Immutable
release. Only release title and notes can be modified.
v3.3.2
v3.3.0
Immutable
release. Only release title and notes can be modified.
v3.3.0
v3.2.0
Immutable
release. Only release title and notes can be modified.
3.2.0
v3.1.0
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
Immutable
release. Only release title and notes can be modified.
3.0.1
v3.0.0
Immutable
release. Only release title and notes can be modified.
3.0.0
v2.5.1
Immutable
release. Only release title and notes can be modified.
2.5.1