Skip to content

Fix output_format override corrupting all command output, and adopt pm-cli 2026.7.27 - #40

Merged
unbraind merged 3 commits into
mainfrom
fix/output-format-decline-and-adopt-2026.7.27
Jul 27, 2026
Merged

Fix output_format override corrupting all command output, and adopt pm-cli 2026.7.27#40
unbraind merged 3 commits into
mainfrom
fix/output-format-decline-and-adopt-2026.7.27

Conversation

@unbraind

@unbraind unbraind commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes a bug that corrupted the output of every pm command in any workspace with pm-starter
installed, and adopts pm-cli 2026.7.27.

Under pm-cli 2026.7.27 an output_format service override's bare return value IS what the host
renders
. This extension declined payloads by returning the inbound ctx.payload, which
2026.7.27 no longer reads as "not handled". The result: unrelated commands printed the whole
command context instead of their own output.

Reproduced against real data

$ pm init probe --json >/dev/null && pm create --title "Real item" --type Task --json >/dev/null

$ pm list --limit 2                      # before install
items:
  - id: "probe-yuf8"
    status: "open"
    type: "Task"
    title: "Real item"
count: 1

$ pm install ./pm-starter --project --json | jq .ok
true

$ pm list --limit 2                      # AFTER install — item list gone
global:
  quiet: false
  noChangedFields: false
  idOnly: false
  ...
format: "toon"
options:
  ...

After this fix, in a fresh workspace with two seeded items:

$ pm install /…/pm-starter --project --json     # ok=true warnings=[]
$ pm list --limit 3
items:
  - id: "probe-mer2"
    status: "open"
    type: "Issue"
    title: "Seeded issue"
  - id: "probe-be2g"
    status: "open"
    type: "Task"
    title: "Seeded task"
$ pm list --limit 1 --json      # valid JSON, count=1
$ pm starter --help             # registers

The fix

The decline path now returns the { handled: false } decision. pm's
isServiceOverrideDecision predicate accepts that only when handled is false and the
object carries exactly that one key, so the literal is written deliberately rather than spread
into a larger object.

The SDK does export declineServiceOverride() (from sdk/authoring), which returns the same
object — but it is a runtime value, and a standalone-installed extension loads only its own
dist/ and cannot resolve the SDK at runtime (see the note at the top of index.ts). The
matching ServiceOverrideDecision type is not part of the public SDK surface either, so
there is nothing to type-import. Both points are raised upstream.

Why the dependency bump ships in the same PR

pm-cli 2026.7.26 has no isServiceOverrideDecision at all, so the decision object is not
understood there. The regression test can only exercise the real contract once the dependency is
bumped. This was visible during development: against the pinned 2026.7.26 tree the harness
reported handled: true with result: { handled: false }; on 2026.7.27 it correctly reports
handled: false.

  • @unbrained/pm-cli peerDependencies >=2026.7.26>=2026.7.27
  • @unbrained/pm-cli devDependencies ^2026.7.26^2026.7.27
  • package version2026.7.27

The test that should have caught this

test/smoke.test.ts used a hand-rolled api double whose registerService was a no-op
(registerService: () => {}). It discarded the registered override, so the override's return
value was never evaluated — this entire bug class was invisible to the suite.

The new test drives pm's real service runner via the SDK harness
(createExtensionTestHarness + runRegisteredServiceOverrideForTest) and asserts
handled === false, that a declined payload is returned to the host untouched, and that no
extension_service_override_* warnings are emitted.

Falsification checked — this test is not vacuous:

index.ts state result
old ctx?.payload form 9 pass / 1 fail (new test fails)
{ handled: false } fix 10 pass / 0 fail

Upstream

Filed as unbraind/pm-cli#776: the semantics
change shipped under a Fixed changelog entry ("First-party service collision: builtin-calendar
and builtin-guide-shell both override the global output_format service") with no breaking marker
and no migration note, it fails silently and globally with exit code 0, and
ServiceOverrideDecision is unexported while its runtime constructors are exported. pm-graph and
pm-slack-standup carried the same payload-echo pattern and are being fixed too.

Gates

build, typecheck, check, 10/10 tests, changelog:full + changelog:check (after
git fetch origin --tags --force, since stale local tags otherwise red the CI changelog check).

Production proof captured above with the built extension installed into a throwaway workspace —
not the dev runner. pm health's only remaining warning is
extension_migration_pending:project:pm-starter:pm-starter-0001-noop, which is the template's
own deliberate demo migration, not an activation failure.

Version-metadata fix (b383b26) — caught in review

A pm extension declares its version in three places: package.json, manifest.json, and a
version: constant inside the module. The initial commit bumped only package.json, so an
installed pm-starter would have reported a stale 2026.7.26 to the host and to
pm extension --manage. Greptile flagged the mismatch; b383b26 aligns manifest.json and the
index.ts constant and rebuilds dist/.

The sibling agent-driven bumps (pm-changelog, pm-gantt-chart, pm-graph) had handled manifest.json
correctly — this was a gap in a hand-run bump that rewrote only package.json. The same drift was
fixed proactively in pm-slack-standup.

Gates re-run after the fix: build, typecheck, 10/10 tests, changelog:check up to date.

pm items

  • pm-starter-ejr6 — Issue: output_format decline fix + 2026.7.27 adoption

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @unbraind, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@unbraind, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e67d565d-68c6-40c2-95e9-573a475c1158

📥 Commits

Reviewing files that changed from the base of the PR and between cf2e51f and 7b3ced8.

⛔ Files ignored due to path filters (4)
  • dist/index.d.ts.map is excluded by !**/dist/**, !**/*.map
  • dist/index.js is excluded by !**/dist/**
  • dist/index.js.map is excluded by !**/dist/**, !**/*.map
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (8)
  • .agents/pm/history/pm-starter-1atg.jsonl
  • .agents/pm/history/pm-starter-ejr6.jsonl
  • .agents/pm/issues/pm-starter-1atg.toon
  • .agents/pm/issues/pm-starter-ejr6.toon
  • CHANGELOG.md
  • index.ts
  • package.json
  • test/smoke.test.ts

Walkthrough

The extension now declines unclaimed output_format overrides instead of echoing command context, updates the pm-cli requirement, aligns all version sources at 2026.7.27, and adds regression tests and changelog/PM records.

Changes

Extension corrections

Layer / File(s) Summary
Output override decline behavior
index.ts, package.json, test/smoke.test.ts, .agents/pm/issues/pm-starter-ejr6.toon, .agents/pm/history/pm-starter-ejr6.jsonl
The output_format override returns { handled: false }; pm-cli requirements and SDK-based regression coverage are updated accordingly.
Version metadata alignment and validation
index.ts, manifest.json, package.json, test/smoke.test.ts, CHANGELOG.md, .agents/pm/issues/pm-starter-1atg.toon, .agents/pm/history/pm-starter-1atg.jsonl
Runtime, manifest, and package versions are set to 2026.7.27, with matching-version tests and release documentation updates.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ServiceRunner
  participant Extension
  participant Host
  ServiceRunner->>Extension: invoke output_format override
  Extension->>ServiceRunner: return handled=false
  ServiceRunner->>Host: pass through original payload
Loading

Possibly related issues

  • unbraind/pm-cli#776 — The PR fixes the same output_format pass-through regression by returning { handled: false } and adding regression coverage.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the two main changes: fixing the output_format override and bumping pm-cli to 2026.7.27.
Description check ✅ Passed The description is detailed but clearly matches the change set, including the output_format fix, version bump, and regression test.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/output-format-decline-and-adopt-2026.7.27

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Reviewer's Guide

Updates the pm-starter extension to decline output_format service payloads correctly under pm-cli 2026.7.27, adds a regression test that exercises the real service runner, and bumps the package and pm-cli dependencies to the new version with corresponding changelog and metadata updates.

Sequence diagram for updated output_format service override handling

sequenceDiagram
  actor User
  participant pm_cli
  participant ServiceRunner
  participant pm_starter_output_format

  User->>pm_cli: pm list --json
  pm_cli->>ServiceRunner: run output_format service
  ServiceRunner->>pm_starter_output_format: api.registerService("output_format") handler
  pm_starter_output_format-->>ServiceRunner: { handled: false }
  ServiceRunner->>pm_cli: isServiceOverrideDecision({ handled: false })
  pm_cli-->>User: render default command result (items, count)
Loading

File-Level Changes

Change Details Files
Change output_format service override to explicitly decline all payloads using the { handled: false } decision instead of echoing the context payload, preventing global output corruption.
  • Replace the output_format service override implementation in TypeScript to return a literal { handled: false } decision and update the surrounding documentation comments to explain the new semantics and why declineServiceOverride cannot be used at runtime.
  • Regenerate the compiled JavaScript in dist/index.js to mirror the new service override behavior and comments.
index.ts
dist/index.js
Add a regression test that drives pm's real service runner via the SDK harness to ensure the output_format override declines unclaimed payloads correctly and does not emit warnings.
  • Import createExtensionTestHarness and runRegisteredServiceOverrideForTest from @unbrained/pm-cli/sdk/testing.
  • Instantiate a real harness for the pm-starter extension with full capabilities and assert activation succeeds and that the output_format override is registered.
  • Execute the registered output_format service override with a sample payload and assert handled===false, the result equals the original payload, and no warnings are emitted.
test/smoke.test.ts
Align package metadata and tooling with pm-cli 2026.7.27 and record the release in the changelog and pm agent history.
  • Bump package.json version from 2026.7.26 to 2026.7.27 and update @unbrained/pm-cli peerDependency and devDependency ranges from 2026.7.26 to 2026.7.27.
  • Update the changelog to mark release 2026.7.27 with a dated heading instead of an Unreleased section.
  • Regenerate package-lock.json and dist source maps to reflect the new build and dependency graph.
  • Add pm agent history and issue tracking artifacts for pm-starter-ejr6 under .agents/pm/.
package.json
CHANGELOG.md
package-lock.json
dist/index.d.ts.map
dist/index.js.map
.agents/pm/history/pm-starter-ejr6.jsonl
.agents/pm/issues/pm-starter-ejr6.toon

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@greptile-apps

greptile-apps Bot commented Jul 27, 2026

Copy link
Copy Markdown

Greptile Summary

The PR corrects the output_format override contract and completes the 2026.7.27 release alignment.

  • Declines unhandled output-format payloads with { handled: false }.
  • Updates the pm-cli development and peer requirements to 2026.7.27.
  • Aligns package, manifest, source, and distributed runtime version metadata.
  • Adds regression coverage for service-override behavior and version consistency.

Confidence Score: 5/5

The PR appears safe to merge.

The previously reported runtime-version mismatch is resolved across package.json, manifest.json, index.ts, and dist/index.js, and no blocking failure remains.

Important Files Changed

Filename Overview
index.ts Correctly declines the global output-format service and reports version 2026.7.27.
dist/index.js Rebuilt installable output contains the corrected override and aligned runtime version.
test/smoke.test.ts Adds real service-runner coverage and checks package, manifest, and extension version consistency.
package.json Requires pm-cli 2026.7.27 for the updated service-override decision contract.
package-lock.json Locks the development pm-cli dependency to 2026.7.27.

Reviews (5): Last reviewed commit: "test: pin extension self-reported versio..." | Re-trigger Greptile

Comment thread package.json
unbraind added a commit that referenced this pull request Jul 27, 2026
…version

Greptile review on PR #40 caught that package.json declared 2026.7.27 while
manifest.json and the extension's self-reported version constant in index.ts
still declared 2026.7.26, so an installed pm-starter would report a stale
version to the host and to `pm extension --manage`.

Aligned both and rebuilt. The agent-driven bumps in pm-changelog,
pm-gantt-chart and pm-graph had already handled manifest.json correctly — this
was a gap in the hand-run bump, which rewrote only package.json.

Gates re-run: build, typecheck, 10/10 tests, changelog:check up to date.
@unbraind

Copy link
Copy Markdown
Owner Author

Bot feedback triage — all four read, voted, and acted on

@greptile-apps 👍 — you found a real bug and it is now fixed. The version-metadata
mismatch was exactly right: package.json said 2026.7.27 while manifest.json and the
extension's self-reported version constant in index.ts still said 2026.7.26, so an
installed pm-starter would report a stale version to the host and to pm extension --manage.

Root cause, for your model: the sibling bumps in this fleet (pm-changelog, pm-gantt-chart,
pm-graph) all updated manifest.json correctly. This one was bumped by a hand-run script that
rewrote only package.json, so the two other version sites drifted. Fixed in b383b26,
which aligns manifest.json and the index.ts constant and rebuilds dist/. The same gap
existed in pm-slack-standup and was fixed there proactively rather than waiting for a second
review to catch it.

Generalisable rule for this codebase: a pm extension declares its version in three places —
package.json, manifest.json, and a version: constant inside the extension module. A change
to one without the others is always a defect. That is a high-value invariant to keep flagging.

Your 4/5 confidence and "safe to merge after considering a non-blocking mismatch" was well
calibrated — the mismatch was real but not a correctness risk in the override path.

@sourcery-ai 👍 — the reviewer's guide and the sequence diagram are accurate, including the
isServiceOverrideDecision({ handled: false }) step, which is the subtle part. Worth recording
why that literal is written the way it is: pm's predicate accepts a decline only when
handled is false and Reflect.ownKeys(value).length === 1. So spreading anything else into
that object — a result key, a debug field — silently turns the decline back into a claim. If you
see a { handled: false, ... } with extra keys in this codebase, that is a bug worth flagging.

@coderabbitai 👎 — Review limit reached (42-minute window), so no files were analysed. No
signal, and explicitly not an approval. Will re-request once the window clears. Context for that
review: the interesting file is index.ts:setupServices, and the thing worth checking is that the
decline object has exactly one key.

@gemini-code-assist 👎 — consumer Gemini Code Assist is sunset and all review activity has
ceased. No signal, not an approval.

Note on the Greptile Review: FAILURE check state

Recording this so it is not misread later: the failing check corresponds to Greptile's confidence
gate, not to a blocking defect — its own summary said "safe to merge after considering a
non-blocking runtime version-metadata mismatch". The mismatch it flagged has now been fixed, so a
re-review should clear it.

Since the last review

b383b26 — aligns manifest.json + the index.ts version constant to 2026.7.27 and rebuilds.
Gates re-run after the fix: build, typecheck, 10/10 tests, changelog:check up to date.

@coderabbitai review

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

@unbraind: Understood. I’ll re-review #40, with particular attention to index.ts:setupServices ensuring the decline is exactly { handled: false } with no additional own keys, and to version consistency across all three metadata locations.

ᕱ⑅ᕱ


✏️ Learnings added
Learnt from: unbraind
URL: https://github.com/unbraind/pm-starter/pull/40

Timestamp: 2026-07-27T15:25:24.131Z
Learning: In pm-starter, every pm extension version must be identical in all three declaration sites: the package `version` in `package.json`, the extension version in `manifest.json`, and the `version:` constant in the extension module (for this PR, `index.ts`). A change that updates only some of these sites is a defect because installed-extension and management metadata becomes stale.

Learnt from: unbraind
URL: https://github.com/unbraind/pm-starter/pull/40

Timestamp: 2026-07-27T15:25:24.131Z
Learning: For pm-starter's `index.ts` `setupServices` output_format service override under pm-cli 2026.7.27+, an unhandled payload must decline by returning the literal `{ handled: false }`. pm-cli recognizes a decline only when `handled` is false and `Reflect.ownKeys(value).length === 1`; adding or spreading any other key causes the override to be treated as a claim.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

unbraind added a commit that referenced this pull request Jul 27, 2026
…t.json

PR #40's version alignment (b383b26) fixed the immediate drift — package.json
said 2026.7.27 while the extension export still said 2026.7.26 — but nothing
prevented the next hand-run bump from drifting the same way. The version lives
in three places that must agree (package.json, manifest.json, and the version
constant in index.ts compiled into the committed dist/), and the extension
cannot read package.json at runtime because standalone installs resolve only
their own dist/, so the duplication is deliberate and needs a guard.

Add a regression test asserting the default export's version equals both
package.json and manifest.json. It imports the extension from dist/, so it
also fails when source and the committed build are out of sync. No any casts
(JSON parsed to unknown and narrowed); top-level imports only.

Falsification verified: reverting index.ts to 2026.7.26 yields 10 pass / 1
fail; restoring yields 11/11. Gates: build, tsc --noEmit, 11/11 tests,
changelog regenerated and changelog:check green.

Closes pm-starter-1atg.
@unbraind

Copy link
Copy Markdown
Owner Author

@greptileai @coderabbitai full review

Two commits pushed since the last pass, both addressing the P2 finding on package.json:

  • b383b26 — aligns manifest.json and the index.ts self-reported version constant with package.json at 2026.7.27, and rebuilds the committed dist/ so the installable artifact stops reporting 2026.7.26.
  • cf2e51f — adds a regression test pinning the extension's self-reported version to both package.json and manifest.json, so the three sites cannot drift apart again silently.

Verified locally: 11/11 tests pass, dist/index.js contains only 2026.7.27, and no stale 2026.7.26 remains in any shipped file.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

@unbraind: Re-running a full review of #40, including the version-alignment commits, the committed dist/ artifact, the new drift-regression test, and the setupServices decline-object contract.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 57 minutes.

unbraind added 3 commits July 27, 2026 23:41
Under pm-cli 2026.7.27 an `output_format` service override's bare return value
IS what the host renders. This extension declined by returning the inbound
`ctx.payload`, which 2026.7.27 no longer reads as "not handled" — so EVERY
command in any workspace with pm-starter installed printed the whole command
context (`global`, `format`, `options`, …) instead of its own result.

Reproduced against real data in a throwaway workspace: `pm list` printed a
seeded item, installing pm-starter made it print the command context, and the
item renders correctly again after this fix.

The decline path now returns the `{ handled: false }` decision. pm's
`isServiceOverrideDecision` predicate accepts that only when `handled` is false
AND the object carries exactly that one key, so the literal is written
deliberately. The SDK's `declineServiceOverride()` returns the same object, but
it is a runtime value and a standalone-installed extension cannot resolve the
SDK at runtime (see the note at the top of index.ts); the matching
`ServiceOverrideDecision` type is not part of the public SDK surface either.

This matters disproportionately here: pm-starter is the reference template handed
to every new extension author, so the broken pattern was being taught.

Paired with the 2026.7.27 dependency adoption (`>=2026.7.27` /  `^2026.7.27`,
version 2026.7.27) because 2026.7.26 has no `isServiceOverrideDecision` at all —
the regression test can only exercise the real contract once the dependency is
bumped. Confirmed: the pinned 2026.7.26 tree reported `handled: true` with
`result: { handled: false }`; on 2026.7.27 the runner correctly reports
`handled: false`.

The regression test uses the REAL SDK harness (`createExtensionTestHarness` +
`runRegisteredServiceOverrideForTest`) rather than this file's hand-rolled api
double. The double registered `registerService` as a no-op that discarded the
override, so its return value was never evaluated and this entire bug class was
invisible to the suite. Falsification verified: reverting index.ts to the old
`ctx.payload` form fails the new test (9 pass / 1 fail); restoring the fix passes
(10 pass / 0 fail).

Filed upstream as unbraind/pm-cli#776 — the semantics changed under a "Fixed"
changelog entry with no migration note, and the decision type is unexported.

Gates: build, typecheck, check, 10/10 tests, changelog:full + changelog:check
after `git fetch --tags --force`. Production proof: install ok with no warnings,
`pm list` unaffected, `pm list --json` valid, `pm starter --help` registers.

pm items:
- pm-starter-ejr6 (Issue) — output_format decline fix + 2026.7.27 adoption
…version

Greptile review on PR #40 caught that package.json declared 2026.7.27 while
manifest.json and the extension's self-reported version constant in index.ts
still declared 2026.7.26, so an installed pm-starter would report a stale
version to the host and to `pm extension --manage`.

Aligned both and rebuilt. The agent-driven bumps in pm-changelog,
pm-gantt-chart and pm-graph had already handled manifest.json correctly — this
was a gap in the hand-run bump, which rewrote only package.json.

Gates re-run: build, typecheck, 10/10 tests, changelog:check up to date.
…t.json

PR #40's version alignment (b383b26) fixed the immediate drift — package.json
said 2026.7.27 while the extension export still said 2026.7.26 — but nothing
prevented the next hand-run bump from drifting the same way. The version lives
in three places that must agree (package.json, manifest.json, and the version
constant in index.ts compiled into the committed dist/), and the extension
cannot read package.json at runtime because standalone installs resolve only
their own dist/, so the duplication is deliberate and needs a guard.

Add a regression test asserting the default export's version equals both
package.json and manifest.json. It imports the extension from dist/, so it
also fails when source and the committed build are out of sync. No any casts
(JSON parsed to unknown and narrowed); top-level imports only.

Falsification verified: reverting index.ts to 2026.7.26 yields 10 pass / 1
fail; restoring yields 11/11. Gates: build, tsc --noEmit, 11/11 tests,
changelog regenerated and changelog:check green.

Closes pm-starter-1atg.
@unbraind
unbraind force-pushed the fix/output-format-decline-and-adopt-2026.7.27 branch from cf2e51f to 7b3ced8 Compare July 27, 2026 21:41
@unbraind
unbraind merged commit abfb87f into main Jul 27, 2026
6 checks passed
@unbraind
unbraind deleted the fix/output-format-decline-and-adopt-2026.7.27 branch July 27, 2026 21:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant