Reviewed PR details and linked issues.
UnderstandCommitted .gitignore files from commits.
EditNoted git pull failure due to unstaged changes.
VerifyYou are given one or more GitHub PR URLs: https://github.com/badlogic/pi-mono/pull/906
For each PR URL, do the following in order:
packages/*/CHANGELOG.md files. Report whether an entry exists. If missing, state that a changelog entry is required before merge and that you will add it if the user decides to merge. Follow the changelog format rules in AGENTS.md. Verify:
### Breaking Changes, ### Added, ### Fixed, etc.)Fixed foo ([#123](https://github.com/badlogic/pi-mono/pull/123) by [@user](https://github.com/user))### Breaking Changes, not just ### FixedOutput format per PR: PR: Changelog:
If no issues are found, say so under Bad and Ugly.
Planning PR data retrieval
I'm preparing to fetch comprehensive PR details including title, body, comments, commits, and files using gh pr view with JSON output, and then review linked issues and diffs before reading relevant main branch files fully.
>gh pr view 906 --json title,body,comments,commits,files,author,state,createdAt,mergedAt,baseRefName,headRefName{"author":{"id":"MDQ6VXNlcjEwNDQzMDA=","is_bot":false,"login":"Perlence","name":"Sviatoslav Abakumov"},"baseRefName":"main","body":"This is an implementation of #867 and a follow-up to #900.","comments":[{"id":"IC_kwDOPbFNk87hkZ7M","author":{"login":"Perlence"},"authorAssociation":"CONTRIBUTOR","body":"Let me fix the merge conflicts.","createdAt":"2026-01-22T13:27:10Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/badlogic/pi-mono/pull/906#issuecomment-3784416972","viewerDidAuthor":false},{"id":"IC_kwDOPbFNk87hko95","author":{"login":"Perlence"},"authorAssociation":"CONTRIBUTOR","body":"Ready for review!","createdAt":"2026-01-22T13:40:14Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/badlogic/pi-mono/pull/906#issuecomment-3784478585","viewerDidAuthor":false}],"commits":[{"authoredDate":"2026-01-22T13:02:00Z","authors":[{"email":"[REDACTED]","id":"MDQ6VXNlcjEwNDQzMDA=","login":"Perlence","name":"Sviatoslav Abakumov"}],"committedDate":"2026-01-22T13:32:47Z","messageBody":"…etting","messageHeadline":"feat(coding-agent): add --verbose CLI flag to override quietStartup s…","oid":"07e2444b9bfa825978ca80a7447f2928873ac6de"}],"createdAt":"2026-01-22T13:23:33Z","files":[{"path":"packages/coding-agent/README.md","additions":2,"deletions":0},{"path":"packages/coding-agent/src/cli/args.ts","additions":4,"deletions":0},{"path":"packages/coding-agent/src/main.ts","additions":2,"deletions":1},{"path":"packages/coding-agent/src/modes/interactive/interactive-mode.ts","additions":4,"deletions":2},{"path":"packages/coding-agent/test/args.test.ts","additions":7,"deletions":0}],"headRefName":"feat/verbose-cli-flag","mergedAt":null,"state":"OPEN","title":"feat(coding-agent): add --verbose CLI flag to override quietStartup setting (round 2)"}Planning PR details gathering
I'm preparing to collect the full PR page with comments, commits, files, and diffs, using the GitHub PR diff command to capture changes effectively.
>gh pr diff 906diff --git a/packages/coding-agent/README.md b/packages/coding-agent/README.md
index 79d78c435..b8d4fc326 100644
--- a/packages/coding-agent/README.md
+++ b/packages/coding-agent/README.md
@@ -825,6 +825,7 @@ Global `~/.pi/agent/settings.json` stores persistent preferences:
| `shellPath` | Custom bash path (Windows) | auto-detected |
| `shellCommandPrefix` | Command prefix for bash (e.g., `shopt -s expand_aliases` for alias support) | - |
| `hideThinkingBlock` | Hide thinking blocks in output (Ctrl+T to toggle) | `false` |
+| `quietStartup` | Hide startup info (keybindings, loaded skills/extensions) | `false` |
| `collapseChangelog` | Show condensed changelog after update | `false` |
| `compaction.enabled` | Enable auto-compaction | `true` |
| `compaction.reserveTokens` | Tokens to reserve before compaction triggers | `16384` |
@@ -1276,6 +1277,7 @@ pi [options] [@files...] [messages...]
| `--no-prompt-templates` | Disable prompt template discovery and loading |
| `--no-themes` | Disable theme discovery and loading |
| `--export <file> [output]` | Export session to HTML |
+| `--verbose` | Force verbose startup (overrides `quietStartup` setting) |
| `--help`, `-h` | Show help |
| `--version`, `-v` | Show version |
diff --git a/packages/coding-agent/src/cli/args.ts b/packages/coding-agent/src/cli/args.ts
index ddab572c6..57c28de5c 100644
--- a/packages/coding-agent/src/cli/args.ts
+++ b/packages/coding-agent/src/cli/args.ts
@@ -38,6 +38,7 @@ export interface Args {
themes?: string[];
noThemes?: boolean;
listModels?: string | true;
+ verbose?: boolean;
messages: string[];
fileArgs: string[];
/** Unknown flags (potentially extension flags) - map of flag name to value */
@@ -148,6 +149,8 @@ export function parseArgs(args: string[], extensionFlags?: Map<string, { type: "
} else {
result.listModels = true;
}
+ } else if (arg === "--verbose") {
+ result.verbose = true;
} else if (arg.startsWith("@")) {
result.fileArgs.push(arg.slice(1)); // Remove @ prefix
} else if (arg.startsWith("--") && extensionFlags) {
@@ -211,6 +214,7 @@ ${chalk.bold("Options:")}
--no-themes Disable theme discovery and loading
--export <file> Export session file to HTML and exit
--list-models [search] List available models (with optional fuzzy search)
+ --verbose Force verbose startup (overrides quietStartup setting)
--help, -h Show this help
--version, -v Show version number
diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts
index 612449884..74964c2b9 100644
--- a/packages/coding-agent/src/main.ts
+++ b/packages/coding-agent/src/main.ts
@@ -582,7 +582,7 @@ export async function main(args: string[]) {
if (mode === "rpc") {
await runRpcMode(session);
} else if (isInteractive) {
- if (scopedModels.length > 0 && !settingsManager.getQuietStartup()) {
+ if (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {
const modelList = scopedModels
.map((sm) => {
const thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : "";
@@ -599,6 +599,7 @@ export async function main(args: string[]) {
initialMessage,
initialImages,
initialMessages: parsed.messages,
+ verbose: parsed.verbose,
});
await mode.run();
} else {
diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts
index 8171ee7f1..be7ed667b 100644
--- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts
+++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts
@@ -137,6 +137,8 @@ export interface InteractiveModeOptions {
initialImages?: ImageContent[];
/** Additional messages to send after the initial message */
initialMessages?: string[];
+ /** Force verbose startup (overrides quietStartup setting) */
+ verbose?: boolean;
}
export class InteractiveMode {
@@ -372,7 +374,7 @@ export class InteractiveMode {
this.setupAutocomplete(this.fdPath);
// Add header with keybindings from config (unless silenced)
- if (!this.settingsManager.getQuietStartup()) {
+ if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
const logo = theme.bold(theme.fg("accent", APP_NAME)) + theme.fg("dim", ` v${this.version}`);
// Build startup instructions using keybinding hint helpers
@@ -641,7 +643,7 @@ export class InteractiveMode {
}
private showLoadedResources(options?: { extensionPaths?: string[]; force?: boolean }): void {
- const shouldShow = options?.force || !this.settingsManager.getQuietStartup();
+ const shouldShow = options?.force || this.options.verbose || !this.settingsManager.getQuietStartup();
if (!shouldShow) {
return;
}
diff --git a/packages/coding-agent/test/args.test.ts b/packages/coding-agent/test/args.test.ts
index 2438de2d5..21b9af30e 100644
--- a/packages/coding-agent/test/args.test.ts
+++ b/packages/coding-agent/test/args.test.ts
@@ -220,6 +220,13 @@ describe("parseArgs", () => {
});
});
+ describe("--verbose flag", () => {
+ test("parses --verbose flag", () => {
+ const result = parseArgs(["--verbose"]);
+ expect(result.verbose).toBe(true);
+ });
+ });
+
describe("--no-tools flag", () => {
test("parses --no-tools flag", () => {
const result = parseArgs(["--no-tools"]);Checking referenced issues
I'm planning to read full content and comments of issues #867 and #900 via GitHub issue view with JSON to understand their context and any cross-links relevant to the PR.
>gh issue view 867 --json title,body,comments,labels,state{"body":"### What do you want to change?\n\nI'm wandering if it's a good idea to make startup quiet by default and introduce the `--verbose` CLI argument to override it.\n\n### Why?\n\nThe reasoning is that I don't always need to see which instructions, skills, and extensions are loaded at startup and this info takes up a lot of screen space. However, when I do need to see it, e.g. for debugging, running Pi with a CLI argument is more convenient than changing the settings and restarting.\n\nThis is a kind of follow up to #777 and #847.\n\n### How? (optional)\n\n_No response_","comments":[{"id":"IC_kwDOPbFNk87g43VB","author":{"login":"badlogic"},"authorAssociation":"OWNER","body":"Quiet by default is a no go for me, as I need it during development. However, we can add a --verbose flag that overrides whatever's stored in settings.json. Happy to merge a PR.","createdAt":"2026-01-20T13:54:14Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[{"content":"EYES","users":{"totalCount":1}}],"url":"https://github.com/badlogic/pi-mono/issues/867#issuecomment-3773003073","viewerDidAuthor":true}],"labels":[],"state":"CLOSED","title":"Feature request/discussion: Quiet startup by default and --verbose CLI flag"}Checking issue 900
>gh issue view 900 --json title,body,comments,labels,state{"body":"This is an implementation of #867. I made a couple of key decisions:\r\n\r\n- Named the flag `--verbose` and not `--no-quiet`, mainly because `--verbose` is universally recognized across CLI tools.\r\n- In `/settings`, show the value as it's stored on disk. For example, if `quietStartup` is `true` in settings.json and `--verbose` is passed making the effective value `false`, `/settings` still shows `true`.","comments":[{"id":"IC_kwDOPbFNk87hjWVT","author":{"login":"badlogic"},"authorAssociation":"OWNER","body":"This is too complex of a solution I think. There's no need to have SettingsManager handle state tracking.\r\n\r\nInteractiveMode gets passed InteractiveModeOptions. We can put the cli override in there, then evaluate it in InteractiveMode.init() along with what's stored in settings. Please send a new PR.","createdAt":"2026-01-22T12:29:40Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[{"content":"EYES","users":{"totalCount":1}}],"url":"https://github.com/badlogic/pi-mono/pull/900#issuecomment-3784140115","viewerDidAuthor":true},{"id":"IC_kwDOPbFNk87hkMT2","author":{"login":"Perlence"},"authorAssociation":"CONTRIBUTOR","body":"Hah, this is what I did at first, but I couldn't think of a good way to write a test for it, so I ended up going down this rabbit hole 😄 ","createdAt":"2026-01-22T13:14:18Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/badlogic/pi-mono/pull/900#issuecomment-3784361206","viewerDidAuthor":false}],"labels":[],"state":"CLOSED","title":"feat(coding-agent): add --verbose CLI flag to override quietStartup setting"}Planning full file reads for diff analysis
I'm preparing to read multiple full code files in parallel—including README, args.ts, main.ts, interactive-mode.ts, and args.test.ts—to gather complete context for analyzing diffs.
Recognizing file read conflict
The tool truncates large files at 50KB but instructions forbid using offset/limit when reading full files; resolving this means reading large files in parts with offsets despite the rule to ensure completeness.
Resolving large code file reading
To fully read large code files like interactive-mode.ts despite 50KB truncation, multiple sequential reads with offsets are necessary, accepting this as the only way to comply with the full-read requirement.
Checking package changelog
I'm reading the entire changelog for the coding-agent package to verify or prepare an entry.
Verifying verbose flag and docs impact
The verbose flag was added to override quiet startup and show additional info in interactive mode, especially in startup headers and resource loading. I'll confirm if documentation besides the README (like CLI refs or settings docs) needs updates and check if verbose correctly influences quietStartup in all relevant code paths.
Assessing verbose flag coverage and quietStartup uses
The verbose flag overrides quietStartup for headers and resource displays in interactive mode, but it may miss other quietStartup checks elsewhere. I'll verify all getQuietStartup usages in coding-agent to ensure verbose correctly overrides quiet behavior globally and check if CLI help and tests fully reflect the verbose flag.
>rg "getQuietStartup" -n /Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/main.ts:585: if (scopedModels.length > 0 && !settingsManager.getQuietStartup()) {
/Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/core/settings-manager.ts:392: getQuietStartup(): boolean {
/Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/modes/interactive/interactive-mode.ts:376: if (!this.settingsManager.getQuietStartup()) {
/Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/modes/interactive/interactive-mode.ts:645: const shouldShow = options?.force || !this.settingsManager.getQuietStartup();
/Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/modes/interactive/interactive-mode.ts:2631: quietStartup: this.settingsManager.getQuietStartup(),Assessing documentation and changelog updates
I'm verifying if README or other docs need updates for the new CLI verbose flag and noting a missing changelog entry that should record the addition with PR and author attribution.
Analyzing verbose flag integration and documentation
I've confirmed the verbose flag properly overrides quietStartup for headers, changelogs, and resource loading, and that CLI help and README reflect the new flag. No docs beyond README need updates, and tests cover argument parsing only with none run; the changelog entry is missing and should be added with proper attribution.
PR: https://github.com/badlogic/pi-mono/pull/906 Changelog:
Added --verbose CLI flag to force startup output even when quietStartup is enabled ([#906](https://github.com/badlogic/pi-mono/pull/906) by [@Perlence](https://github.com/Perlence)) under ### Added.Good:
Bad:
Ugly:
Questions or Assumptions:
Change summary:
--verbose CLI flag to force startup output even when quietStartup is enabled, with README and help updates plus a parseArgs test.Tests:
good to merge? then use gh cli to merge, and leave a "Thanks" comment on the pr, then pull
Requesting changelog confirmation
The PR is ready to merge but lacks a changelog entry; I'll ask if the user wants me to add one before proceeding.
Not ready to merge yet. The PR is missing a changelog entry in packages/coding-agent/CHANGELOG.md under ## [Unreleased]. Do you want me to add the entry and then proceed with the merge workflow?
no, just do as you're told
Merging PR without changelog
Proceeding to merge the PR using default merge via GitHub CLI, leaving a "Thanks" comment, and pulling latest changes as explicitly instructed without modifying the changelog.
>gh pr merge 906 --merge(no output)Noting silent success
The command or operation produced no output, which likely indicates success; adding a comment to clarify this.
>gh pr comment 906 -b "Thanks"https://github.com/badlogic/pi-mono/pull/906#issuecomment-3787034761Pulling latest changes
>git pullerror: cannot pull with rebase: You have unstaged changes.
error: Please commit or stash them.
Command exited with code 128Checking local git status
>git status --shortM packages/ai/src/models.generated.ts
?? .pi/git/
?? .pi/npm/Prompting for user conflict resolution
Pull cannot proceed due to unstaged changes from other agents affecting unmodified files, and stashing isn't possible. I'll inform the user of this and ask how to handle the conflicts before proceeding.
Merged PR 906 and left a “Thanks” comment.
git pull failed because of unstaged changes:
These are not from this session. Tell me how you want to handle them so I can finish the pull.
there are .gitignore files in them commit those
Reviewing .gitignore files and git status before committing
I'm listing the .pi/git and .pi/npm directories to check their .gitignore contents and confirm only those files get committed. After committing, I see unstaged changes remain that will block a git pull with rebase; I'll report this since pulling requires a clean working tree.
Reading .gitignore files before committing
I'll list the .pi/git and .pi/npm directories and read their .gitignore files fully before committing, then report any remaining issues afterward.
>ls -la .pi/git .pi/npm.pi/git:
total 8
drwxr-xr-x@ 3 badlogic staff 96 Jan 22 18:48 .
drwxr-xr-x@ 6 badlogic staff 192 Jan 22 18:48 ..
-rw-r--r--@ 1 badlogic staff 14 Jan 22 18:48 .gitignore
.pi/npm:
total 8
drwxr-xr-x@ 3 badlogic staff 96 Jan 22 18:48 .
drwxr-xr-x@ 6 badlogic staff 192 Jan 22 18:48 ..
-rw-r--r--@ 1 badlogic staff 14 Jan 22 18:48 .gitignoreCommitting new .gitignore files
I'm staging and committing the .gitignore files in the .pi directories as requested, then will attempt a git pull which may be blocked by a modified file; I'll report the pull failure afterward.
>git add .pi/git/.gitignore .pi/npm/.gitignore(no output)>git commit -m "chore: add pi working dir gitignores"Running formatting, linting, and type checking...
> pi-monorepo@0.0.3 check
> biome check --write . && tsgo --noEmit && npm run check -w @mariozechner/pi-web-ui
Checked 417 files in 253ms. No fixes applied.
> @mariozechner/pi-web-ui@0.49.3 check
> biome check --write . && tsc --noEmit && cd example && biome check --write . && tsc --noEmit
Checked 73 files in 36ms. No fixes applied.
Checked 3 files in 8ms. No fixes applied.
✅ All pre-commit checks passed!
[main 295dc6f4] chore: add pi working dir gitignores
2 files changed, 4 insertions(+)
create mode 100644 .pi/git/.gitignore
create mode 100644 .pi/npm/.gitignoreConfirming pre-commit checks before pull
>git pullerror: cannot pull with rebase: You have unstaged changes.
error: Please commit or stash them.
Command exited with code 128Reporting blocked status and uncommitted changes
The report is still blocked due to the packages/ai/src/models.generated.ts file. The .pi/git/ and .pi/npm files have now been committed. There's still an uncommitted change present. I'll ask for direction on how to proceed.
Committed:
git pull still fails due to unstaged changes:
I did not touch that file. How do you want to proceed with the pull?
Tests:
>git pullRebasing (1/1)Successfully rebased and updated refs/heads/main.