# Changelog

<!-- Entries are one line per item and section headings repeat for every release,
     so the line-length and duplicate-heading rules don't fit this file. -->
<!-- markdownlint-disable MD013 MD024 -->

## master (unreleased)

### New features

- [#2121](https://github.com/bbatsov/projectile/pull/2121): Projectile now recognizes the subprojects of a monorepo - any directory below the root holding a manifest of its own.
  - `projectile-find-file-in-subproject` (`s-p c m f`) prompts for a subproject and completes over just its files; `projectile-project-subprojects` lists them, scanning the project's file listing so the ignore rules apply.
  - `projectile-run-subproject` (`s-p c m r`) joins the existing `projectile-compile-subproject` and `projectile-test-subproject`, which now share the lifecycle machinery rather than reimplementing it.
  - What counts as a subproject manifest comes from `projectile-subproject-markers`, derived by default from every registered project type - so a polyglot repository works out of the box, where `projectile-subproject-root` previously only looked for the marker of the project's own type (and errored outright for a type without one, e.g. Go).
- [#2120](https://github.com/bbatsov/projectile/pull/2120): `projectile-run-task` now also offers the tasks a project's own tooling defines, so it's useful in a fresh checkout without any configuration.
  - npm scripts (run through whichever package manager the lock file points at), Deno tasks, Composer scripts, just recipes, go-task tasks and Make targets.
  - Discovered tasks are named after the tool that defines them (`npm:build`, `make:test`), so they never collide with the tasks you configure yourself.
  - Turn it off with `projectile-discover-tasks`, or add your own reader to `projectile-task-providers`.
- [#2119](https://github.com/bbatsov/projectile/pull/2119): Add 34 project types Projectile had no support for, which used to come out as generic projects.
  - JavaScript: `node` (a `package.json` with no lock file next to it), `bun`, `deno`, `nx` and `turborepo`.
  - Python: `python-uv` and `python-pdm`.
  - PHP: `php-composer` and `php-laravel` - Symfony was the only PHP type we shipped.
  - Apple and mobile: `xcode` and `flutter`.
  - Infrastructure: `terraform`, `pulumi`, `helm`, `ansible` and `docker-compose`.
  - Build and task runners: `just`, `mise`, `buck2` and `pants`.
  - Languages: `gleam`, `babashka`, `scala-cli`, `dub`, `fpm`, `alire`, `foundry`, `godot` and `platformio`.
  - Static sites: `hugo`, `jekyll`, `zola`, `mkdocs` and `quarto`.
- [#2119](https://github.com/bbatsov/projectile/pull/2119): A project type marker can now be an `(:any "file1" "file2")` clause, matched when any one of its files is present, so a build file with several spellings no longer needs a predicate function.
- [#2115](https://github.com/bbatsov/projectile/pull/2115): Add `projectile-replace-undo` (`s-p u`), which reverts the last replace applied from the reviewable replace buffer.
  - Only the edits that were actually written are recorded, and a file is reverted only if the replaced text is still exactly where the replace put it - anything changed since is reported and left alone.
  - Open buffers are edited in place instead of being written behind, mirroring what applying does; the record covers just the last apply and doesn't survive an Emacs restart.
- [#2114](https://github.com/bbatsov/projectile/pull/2114): Add project-scoped bookmarks - `projectile-bookmark-set` (`s-p B s`), `projectile-bookmark-jump` (`s-p B j`) and `projectile-bookmark-delete` (`s-p B d`).
  - They're plain Emacs bookmarks, so they show up in `list-bookmarks` and are persisted by `bookmark.el` itself; Projectile only scopes the completion to the current project and suggests a project-prefixed name.
  - A bookmark counts as the project's when its file lives under the project root or its name starts with the project's name - see `projectile-bookmark-scope`.
- [#2113](https://github.com/bbatsov/projectile/pull/2113): Add `projectile-todos` (`s-p s t`), which collects the project's `TODO`/`FIXME`-style annotations into the reviewable search buffer.
...
...
