gruntjs/grunt
50.6
Adequate · 2 October 2026
1.8k
lines of production code
JavaScript
primary language
2
measurements over time
What this system is
This system is Grunt, a JavaScript task runner that manages build processes through a modular architecture for configuration, file handling, and task execution. It provides a command-line interface to register, load, and run tasks, supporting features like multi-tasking, glob pattern matching, and template processing. The codebase includes comprehensive test coverage and has been modernized to support newer Node.js versions and updated dependencies.
How it got here
2011 — Core library rewrite and modularization
8 changes.
This period focused on a comprehensive rewrite of the Grunt core library, introducing a modular architecture with explicit module loading, a new task execution engine, and a modernized configuration API. The work included restructuring the CLI to delegate to grunt-cli, removing legacy task stubs, and updating dependencies to enforce stricter security and Node.js version requirements.
2012–2026 — Test infrastructure modernization
6 changes.
This period focused on modernizing the testing infrastructure by migrating the unit test suite from nodeunit to QUnit. It also involved expanding test coverage for core functionalities such as recursive directory expansion, file matching, and NPM task loading through the addition of comprehensive fixtures and test cases.
Removals
Removal of default, lint, and min task stubs
The placeholder implementations for the default, lint, and min tasks have been removed from the codebase. These files previously contained only basic logging and task invocation logic without actual functionality; their deletion indicates these tasks are no longer provided as built-in stubs in this location.
lib/grunt/tasks · high confidence
Security
Grunt v1.6.3 release with security and dependency updates
This entry covers the v1.6.3 release of Grunt, which updates the js-yaml dependency to version 3.15.0 to address a security vulnerability. The release also includes updates to minimatch (to 3.1.5) and nopt (to 5.0.0). Additionally, the repository structure has been modernized with the addition of ESLint configuration files (.eslintrc.json, .eslintignore), a Code of Conduct, a Security policy, and updated documentation, while removing redundant license files.
(repo-wide) · high confidence
Behavioural changes
Grunt 1.0.0 core library rewrite
The Grunt core library has been rewritten for version 1.0.0, introducing a new modular architecture with dedicated files for configuration, file handling, task management, and error reporting. Key behavioral changes include a new config API with deep merging and template processing, a rewritten file system interface supporting glob patterns and YAML, and a new task system with multi-task support and better error handling. The CLI has been updated to use a shared options module, and the old tasks.js file has been removed in favor of the new task registration system. This is a significant breaking change that requires users to update their Gruntfiles to work with the new API.
lib/grunt · high confidence
Grunt core restructured with explicit module loading and CoffeeScript support
The lib/grunt.js entry point has been completely rewritten to replace the previous simple task-listing script with a full-featured Grunt runtime. This change introduces strict mode, explicit loading of internal modules (task, config, cli, log, etc.) via a gRequire helper, and integration with external legacy modules (grunt-legacy-util, grunt-legacy-log). It adds support for loading CoffeeScript files if the coffeescript package is installed, exposes package metadata and version, and implements the main tasks() execution flow including --version, --help, and task running with proper error handling and exit codes.
lib · high confidence
Improved output for internal subgrunt task
The internal subgrunt task now provides slightly better output when running sub-gruntfiles, enhancing the visibility of loading and execution status for internal build processes.
internal-tasks · medium confidence
Introduction of the new task runner subsystem
The task execution engine has been replaced with a new implementation in lib/util/task.js. This change introduces a redesigned task queue with support for programmatic clearing via markers, allows task names and arguments to contain spaces and colons, and exposes the current task context as Task\#current. It also adds utility methods such as task.exists, isTaskAlias, and renameTask, while enforcing strict mode and streamlining error handling to ensure assertions stop the runner correctly.
lib/util · high confidence
Switches bin entry to use grunt-cli
The bin/grunt script no longer requires the local lib/grunt module directly; instead, it delegates execution to grunt-cli/bin/grunt. This change aligns the command-line interface with the grunt-cli package, allowing for better separation between the CLI runner and the core library.
bin · high confidence
Test coverage
Added test fixtures for file I/O, encoding, and CLI testing; Added test fixtures for file expansion tasks; Added test fixtures for file extension mapping; Added test fixtures for recursive directory expansion; Added tests for loadNpmTasks and multi-task file handling; Migrate unit tests from nodeunit to QUnit.
Dependencies
Grunt 1.6.3 release with modernized dependencies and Node 16+ requirement
This update upgrades Grunt to version 1.6.3, raising the minimum supported Node.js version to 16 and replacing legacy internal utilities (such as \zlib\ and \colors\) with maintained packages like \iconv-lite\, \eventemitter2\, and \grunt-legacy-log\. The build tooling has also shifted from JSHint to ESLint for linting and from Nodeunit to QUnit for testing, while dev dependencies like \eslint\ and \qunit\ are updated to their latest major versions to ensure compatibility and security.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 49 → 51 (+1.1)
- Rubric changed (rubric-2026.09.12 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 52 → 52 (+0.0)
- Architecture 91 → 92 (+1.4)
- Maturity 34 → 34 (+0.0)
- Readiness 59 → 58 (-1.1)
- Security 100 → 100 (+0.0)
- Performance 100 (new)
Resolved (6)
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no project overview (README.md)
- Documentation: no usage examples (README.md)
- init (cyclomatic 18) (lib/grunt/task.js)
- normalizeMultiTaskFiles (cyclomatic 27) (lib/grunt/task.js)
New (2)
- task.task.init (cyclomatic 18) (lib/grunt/task.js)
- task.task.normalizeMultiTaskFiles (cyclomatic 27) (lib/grunt/task.js)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
gruntjs/grunt was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 2 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 50a8a686522b0cf1938df344b9684e843f9eae9c — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.