Skip to content
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ adheres to [Semantic Versioning](https://semver.org/).

## [Unreleased]

### Added
- `qr learn` fills common developer-loop commands into `.qr/profile.json`:
`dev_command`, `run_command`, and `debug_command`, plus richer `scripts`
defaults for Rust/Go/Python and framework-aware Node fallbacks (Next.js,
Vite). Makefile targets and Justfile recipes are merged into `scripts`
without clobbering manifest keys. `.qr.toml` can override the new fields.

### Fixed
- `qr learn` no longer treats plain `main.py` as FastAPI, invents `next lint`,
PM-qualifies Makefile/Justfile role commands on Node projects, or records
`cargo run` / `go run .` when no runnable binary/root main package exists.
Makefile `:=`/`?=` assignments and Justfile `set`/`export`/`alias` lines are
skipped; Pipenv projects get a `pipenv run` prefix like uv/poetry/pdm.
### Changed
- Bare `qr go` / `qr g` now opens a lightweight live-filter picker for cached projects while `qr go <project>` keeps the existing direct lookup behavior.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ QuickRunner (`qr`) is a fast Rust CLI for common developer shell workflows: jump
- `qr stats` / `qr s`: aggregated command stats from a local SQLite database
- `qr scan` / `qr x`: manual project rescan
- `qr do <task>` / `qr d`: natural language → a shell command (run only after explicit confirmation) or a suggested coding-agent hand-off
- `qr learn` / `qr l`: profile the current project (language, package manager, scripts) into `./.qr/profile.json`
- `qr learn` / `qr l`: profile the current project (language, package manager, common build/test/dev/run/debug commands, scripts) into `./.qr/profile.json`
- `qr config` / `qr c`: open `config.toml` in your editor (`qr config path` prints its location)
- `qr doctor`: report the health and location of the config and project cache
- `qr init` / `qr i`: creates config, installs the shell wrapper, optionally stores your AI key in the OS keychain, prompts to install an hourly rescan cron (default no), and runs an initial scan
Expand Down
3 changes: 3 additions & 0 deletions src/commands/do_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,9 @@ mod tests {
test_command: Some("cargo test".into()),
build_command: Some("cargo build".into()),
lint_command: Some("cargo clippy".into()),
dev_command: Some("cargo run".into()),
run_command: Some("cargo run".into()),
debug_command: Some("RUST_BACKTRACE=1 cargo run".into()),
scripts: Default::default(),
prefer_agent: Some("claude".into()),
entry_points: vec![],
Expand Down
9 changes: 9 additions & 0 deletions src/commands/learn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ pub fn print_summary(result: &LearnResult) {
if let Some(lint_command) = &result.profile.lint_command {
println!(" → Lint: {lint_command}");
}
if let Some(dev_command) = &result.profile.dev_command {
println!(" → Dev: {dev_command}");
}
if let Some(run_command) = &result.profile.run_command {
println!(" → Run: {run_command}");
}
if let Some(debug_command) = &result.profile.debug_command {
println!(" → Debug: {debug_command}");
}
if !result.profile.scripts.is_empty() {
let names = result.profile.scripts.keys().cloned().collect::<Vec<_>>();
println!(" → Scripts: {}", names.join(", "));
Expand Down
Loading
Loading