@unbrained/pm-cli 2026.5.18 → 2026.5.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/README.md +2 -1
- package/dist/cli/commander-usage.js +16 -2
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/annotation-command.d.ts +49 -0
- package/dist/cli/commands/annotation-command.js +135 -0
- package/dist/cli/commands/annotation-command.js.map +1 -0
- package/dist/cli/commands/append.js +3 -7
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +3 -6
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.js +12 -22
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +61 -9
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments.d.ts +5 -0
- package/dist/cli/commands/comments.js +27 -117
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +102 -15
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/context.js +4 -10
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +168 -36
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +49 -44
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +7 -4
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +3 -0
- package/dist/cli/commands/delete.js +9 -8
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +1 -0
- package/dist/cli/commands/docs.js +4 -8
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/event-validation-messages.d.ts +3 -0
- package/dist/cli/commands/event-validation-messages.js +44 -0
- package/dist/cli/commands/event-validation-messages.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +1 -0
- package/dist/cli/commands/extension.js +138 -21
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +6 -13
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js +17 -4
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +3 -2
- package/dist/cli/commands/get.js +50 -8
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -0
- package/dist/cli/commands/health.js +254 -75
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +8 -0
- package/dist/cli/commands/history-redact.js +14 -97
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.d.ts +33 -0
- package/dist/cli/commands/history-repair.js +166 -0
- package/dist/cli/commands/history-repair.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -4
- package/dist/cli/commands/history.js +10 -88
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -1
- package/dist/cli/commands/index.js +5 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +28 -0
- package/dist/cli/commands/init.js +23 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +20 -119
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/linked-test-entry.d.ts +3 -0
- package/dist/cli/commands/linked-test-entry.js +62 -0
- package/dist/cli/commands/linked-test-entry.js.map +1 -0
- package/dist/cli/commands/list.js +32 -22
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/notes.js +20 -119
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +3 -0
- package/dist/cli/commands/plan.js +184 -22
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/restore.js +7 -50
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +31 -0
- package/dist/cli/commands/schema.js +98 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/search.js +151 -40
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +4 -0
- package/dist/cli/commands/templates.js +89 -17
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.js +4 -8
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +1 -0
- package/dist/cli/commands/test.js +7 -10
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +4 -8
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +109 -51
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +3 -1
- package/dist/cli/commands/validate.js +23 -71
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +96 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +0 -1
- package/dist/cli/extension-command-help.js +2 -13
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +106 -7
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +0 -1
- package/dist/cli/help-content.js +13 -9
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +1 -0
- package/dist/cli/help-json-payload.js +33 -3
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +35 -29
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.d.ts +1 -1
- package/dist/cli/register-list-query.js +40 -17
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.d.ts +1 -1
- package/dist/cli/register-mutation.js +232 -64
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +16 -11
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +26 -14
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +0 -2
- package/dist/cli/registration-helpers.js +13 -40
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli.js +23 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/index.d.ts +0 -1
- package/dist/core/extensions/index.js +2 -14
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.js +3 -9
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/fs/path-utils.d.ts +1 -0
- package/dist/core/fs/path-utils.js +12 -0
- package/dist/core/fs/path-utils.js.map +1 -0
- package/dist/core/history/drift-scan.d.ts +11 -0
- package/dist/core/history/drift-scan.js +67 -0
- package/dist/core/history/drift-scan.js.map +1 -0
- package/dist/core/history/replay.d.ts +82 -0
- package/dist/core/history/replay.js +249 -0
- package/dist/core/history/replay.js.map +1 -0
- package/dist/core/item/item-format.js +11 -8
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.d.ts +52 -0
- package/dist/core/item/item-type-definition.js +123 -0
- package/dist/core/item/item-type-definition.js.map +1 -0
- package/dist/core/item/parse.js +3 -2
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/priority.d.ts +23 -0
- package/dist/core/item/priority.js +55 -0
- package/dist/core/item/priority.js.map +1 -0
- package/dist/core/item/status.d.ts +14 -1
- package/dist/core/item/status.js +22 -2
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +19 -0
- package/dist/core/item/toon-decode.js +69 -0
- package/dist/core/item/toon-decode.js.map +1 -0
- package/dist/core/item/type-registry.js +13 -84
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/packages/manifest.js +3 -9
- package/dist/core/packages/manifest.js.map +1 -1
- package/dist/core/schema/item-types-file.d.ts +85 -0
- package/dist/core/schema/item-types-file.js +243 -0
- package/dist/core/schema/item-types-file.js.map +1 -0
- package/dist/core/schema/runtime-schema.d.ts +2 -1
- package/dist/core/schema/runtime-schema.js +11 -9
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +3 -3
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/shared/author.d.ts +1 -0
- package/dist/core/shared/author.js +9 -0
- package/dist/core/shared/author.js.map +1 -0
- package/dist/core/shared/lazy-module.d.ts +1 -0
- package/dist/core/shared/lazy-module.js +11 -0
- package/dist/core/shared/lazy-module.js.map +1 -0
- package/dist/core/shared/option-alias-visibility.d.ts +44 -0
- package/dist/core/shared/option-alias-visibility.js +76 -0
- package/dist/core/shared/option-alias-visibility.js.map +1 -0
- package/dist/core/shared/text-normalization.d.ts +0 -1
- package/dist/core/shared/text-normalization.js +2 -5
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/store/item-store.d.ts +2 -0
- package/dist/core/store/item-store.js +70 -39
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +106 -0
- package/dist/core/store/settings-validator.js +279 -0
- package/dist/core/store/settings-validator.js.map +1 -0
- package/dist/core/store/settings.js +6 -343
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/runtime.js +5 -3
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.js +64 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +9 -2
- package/dist/sdk/cli-contracts.js +204 -13
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/runtime.d.ts +25 -1
- package/dist/sdk/runtime.js +46 -3
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js +10 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +7 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/COMMANDS.md +39 -6
- package/docs/CONFIGURATION.md +1 -1
- package/docs/RELEASING.md +11 -7
- package/docs/SDK.md +11 -2
- package/package.json +12 -11
- package/packages/pm-calendar/README.md +3 -1
- package/packages/pm-calendar/extensions/calendar/index.js +21 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +21 -2
- package/packages/pm-search-advanced/README.md +8 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
- package/packages/pm-templates/extensions/templates/runtime.js +11 -202
- package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
- package/dist/core/output/command-aware.d.ts +0 -1
- package/dist/core/output/command-aware.js +0 -397
- package/dist/core/output/command-aware.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2026.5.24] - 2026-05-24
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Contract tests now assert that the `pm-changelog` install, generate, and stage steps remain in `run-release-pipeline.mjs`, and that the `Verify generated pm changelog` step (`pnpm changelog:pm:check`) remains in `release.yml`, preventing silent regression if the integration is removed.
|
|
14
|
+
- **`pm schema add-type <Name>`** registers a config-driven custom item type into `.agents/pm/schema/types.json` (shape `{ "definitions": [...] }`) so agents can use `pm create <Name> "..."` for project-specific work categories without hand-editing settings (pm-e1va). Flags: `--description`, `--default-status`, `--folder`, repeatable `--alias`, plus `--author`/`--force` governance and `--json`. The command is an idempotent UPSERT keyed on the type name (case-insensitive, merges aliases, overrides supplied fields), refuses to redefine built-in types (Chore, Decision, Epic, Event, Feature, Issue, Meeting, Milestone, Plan, Reminder, Task), rejects aliases (or a new type name) that would collide with a built-in or another registered type so `pm create --type` never resolves ambiguously, and emits a machine envelope reporting the registered type and the file path.
|
|
15
|
+
- `pm create` and `pm update` now accept named priority aliases (`critical`, `high`, `medium`, `low`, `minimal`) in addition to numeric `0..4`, with one shared validation message for bad values (pm-fuat / pm-5k2w).
|
|
16
|
+
- Unknown package-owned commands such as `pm guide`, `pm templates`, `pm calendar`, and `pm cal` now include concrete first-party install hints instead of only reporting an unknown command (pm-fuat / pm-5k2w).
|
|
17
|
+
- The templates package now ships starter templates (`bug`, `feature`, `spike`, `chore`) so `pm templates` has a useful catalog immediately after installation; user-saved templates still override builtins by name (pm-fuat / pm-ypqp).
|
|
18
|
+
- `pm delete --dry-run` previews the item file that would be deleted without mutating item storage or history, giving the single-item destructive path the same preview affordance as broader maintenance commands (pm-tobi / pm-5k2w).
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- Extract shared `scanHistoryDrift` core function to `src/core/history/drift-scan.ts`; health and validate commands compose format-specific outputs from the single scan (pm-qsk8)
|
|
22
|
+
- Extract `createLazyModule` helper to `src/core/shared/lazy-module.ts`; replace nullable-promise-cache boilerplate in 5 CLI registration files (pm-c98b)
|
|
23
|
+
- Replace 70-line inline copy of `FRONT_MATTER_KEY_ORDER` in `shared-constants-errors.spec.ts` with structural sentinel-ordering and uniqueness assertions that catch real contract changes without needing a manual update (pm-8fx3)
|
|
24
|
+
- Extract shared `resolveAuthor` mutation-author helper to `src/core/shared/author.ts`; eliminate 10+ identical copies across command files (pm-xh0y)
|
|
25
|
+
- Extract shared `isPathWithinDirectory` path-containment helper to `src/core/fs/path-utils.ts`; deduplicate across manifest, loader, extension, files, and search modules (pm-dpzc)
|
|
26
|
+
- Update npm devDependencies to latest minor/patch: `@sentry/cli` 3.4.3, `@toon-format/toon` 2.3.0, `@types/node` 25.9.1, `@vitest/coverage-v8` 4.1.7, `tsx` 4.22.3, `vitest` 4.1.7 (pm-a2g6)
|
|
27
|
+
- The invalid-type error from `pm create`/`pm update` now appends a discoverable hint pointing agents at the new registration command: `To register a custom type, run: pm schema add-type "X" (writes .agents/pm/schema/types.json).` (pm-e1va).
|
|
28
|
+
- Daily release automation now fails loudly when source, package, script, or workflow changes exist since the last tag but `CHANGELOG.md` has an empty `[Unreleased]` section. The JSON result includes `changelog_required_files` and a deterministic `release_changelog_required:source_or_package_changes_without_unreleased_entry` warning so agents can fix the release blocker without reading the full workflow log.
|
|
29
|
+
- `pm init` now prints a concise default summary while preserving the full settings tree behind `--verbose`; `--json` output is unchanged for machine consumers (pm-fuat / pm-5k2w).
|
|
30
|
+
- Rendered text help now hides pure snake_case duplicates of kebab-case long flags while keeping those aliases parse-functional and present in machine-readable contracts/completions (pm-fuat / pm-5k2w).
|
|
31
|
+
- `pm gc` help now states that cache artifacts are deleted by default unless `--dry-run` is passed; the runtime default is unchanged for compatibility (pm-tobi / pm-5k2w).
|
|
32
|
+
- Extract shared `isTerminalStatus`/`normalizeStatusForRegistry` helpers to `src/core/item/status.ts`; deduplicate runtime terminal-status checks across the `list`, `search`, `context`, `close`, and `dedupe-audit` commands while preserving registry-aware normalization with raw-value fallback (pm-i04b).
|
|
33
|
+
- Extract shared recurrence `weekdayOrderIndex` helper to `src/types.ts`; deduplicate four identical copies across item serialization, `create`/`update` parsing, and calendar expansion (pm-max1).
|
|
34
|
+
- Extract shared item-type definition normalizer to `src/core/item/item-type-definition.ts`; single-source name/folder/alias/required-field/option/command-option-policy normalization and dedupe-sort semantics across the runtime registry and settings persistence, with the only layer-specific divergence (strict vs pass-through policy-command resolution) injected via an adapter (pm-v798).
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
- **Recover 16 unreadable item files** caused by an upstream `@toon-format/toon` 2.3.0 round-trip bug: its strict decoder mis-parses a quoted scalar value containing a bracketed token immediately followed by a colon (e.g. `[Unreleased]:`, `[med]:`) as a `key`+bracket+colon array header and throws `Invalid array length`, even though the library's own encoder emits that form. `parseToonItemDocument` now decodes via `src/core/item/toon-decode.ts`, which tries strict first and, only after failure, retries strict decoding with scalar-value brackets escaped so duplicate-key, array-length, and other strict protections remain enforced. Affected items load again across `pm get`/`list`/`search` with no `item_list_item_read_failed` warnings (pm-iqgj).
|
|
38
|
+
|
|
39
|
+
## [2026.5.23] - 2026-05-23
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
- **`pm update --blocked-by` now records a `blocked_by` dependency edge** (matching `pm create`), so `pm deps` reflects the blocker and "what is blocking me" answers are correct instead of returning an empty graph (pm-kyd6). `--unset blocked-by` removes the edge and re-pointing it replaces the stale edge, keeping the `blocked_by` scalar and the dependency graph consistent.
|
|
43
|
+
- `pm test --add` now rejects unknown keys (e.g. `name=`) with an allowed-key list instead of silently storing the whole `key=value,...` string as the command, and accepts `cmd` as an alias for `command` (pm-fu5d B2).
|
|
44
|
+
- `pm list --statuss` (and similar near-miss typos) now auto-corrects to `--status`: the `--status` filter was missing from the list flag contract that powers the never-block typo normalizer, so it alone could not be suggested/corrected (pm-fu5d U2).
|
|
45
|
+
- Crash: `pm context`, `pm list`, and `pm aggregate` no longer throw `Cannot read properties of undefined (reading 'trim')` when a status filter resolves an undefined token (Sentry PM-CLI-R; `normalizeStatusToken` now type-guards its input).
|
|
46
|
+
- Crash: keyword and hybrid `pm search` no longer throw `Cannot read properties of undefined (reading 'join')` on items without reminders/events/dependencies (Sentry PM-CLI-S; reminder/event corpus builders tolerate missing arrays).
|
|
47
|
+
- Crash: global option resolution guards against Commander command objects lacking `optsWithGlobals` (Sentry PM-CLI-T).
|
|
48
|
+
- `pm calendar --date <date>` no longer crashes.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- **Performance: removed the `zod` dependency from the settings hot path.** `settings.json` is now validated by a dependency-free validator that mirrors the previous schema exactly (type checks, required/optional fields, integer/positive constraints, literal unions, unknown-key stripping, all-or-nothing failure). Importing the settings module dropped from ~157ms to ~14ms, cutting the single largest startup cost off **every** command: `pm --help` ~227ms→~140ms and `pm list` ~540ms→~340ms (~38% faster) on the maintainer machine. One fewer runtime dependency.
|
|
52
|
+
- `pm update --status closed|canceled` now auto-routes to the close/cancel flow instead of erroring, so agents that conflate `update` and `close` are never blocked (the most frequent real CLI error in telemetry).
|
|
53
|
+
- Semantic and hybrid `pm search` degrade gracefully to keyword retrieval, with a clear label, when no embedding model is reachable — they never block.
|
|
54
|
+
- `pm close` now clears the stale active blocker (`blocked_by`/`blocked_reason` scalars and the matching `blocked_by` dependency edges) on terminal transition and annotates it via `closed_cleared_blocked_by:<id>:<blocker>`, so completed work stops surfacing in blockers views (pm-fu5d C4).
|
|
55
|
+
- `pm close` under minimal governance (validate-close off) now emits an informational `closed_with_active_children:<id>:<children>` warning when closing a parent with open children — it still never blocks, but no longer silently orphans them (pm-fu5d C3).
|
|
56
|
+
- Equal `--event` start/end timestamps are now treated as an instant event (end dropped) instead of being rejected; an end earlier than start is still rejected (pm-uzmf).
|
|
57
|
+
- Improved agent read-path token efficiency across `get`/`list`/`context` outputs.
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- `--event duration=<relative>` (e.g. `duration=2h`, `duration=+1d`) on `pm create`/`pm update` derives the event end from start; mutually exclusive with an explicit `end`. A zero-length duration collapses to an instant event, matching the equal start/end behaviour (pm-uzmf / pm-fu5d CAL1).
|
|
61
|
+
- `pm package` / `pm extension --list` as an alias for `--explore` (pm-fu5d U3).
|
|
62
|
+
- `pm search --mode semantic|hybrid` emits `search_<mode>_degraded:no_vector_matches:results_are_lexical` when vector ranking contributes no hits, so agents can tell results are effectively lexical even though the reported mode stays semantic/hybrid (pm-fu5d S1).
|
|
63
|
+
- `pm create` emits an `event_without_schedule:<id>:no_time_set` warning for Event-type items created with no schedule, so schedule-less Events that never appear on the calendar are surfaced at creation (never blocks) (pm-uzmf).
|
|
64
|
+
- `pm create <type> <title>` positional form and close-via-update auto-routing for agent ergonomics.
|
|
65
|
+
- **`pm history-repair <id>`** — a first-class, audited command that re-anchors a drifted history chain so `pm health` / `pm validate --check-history-drift` return ok. It deterministically replays the stream, recomputes every before/after hash, repairs legacy patch ops that no longer strictly apply (`replace`→`add` on first-write paths; skips unresolvable array-shape ops), reconciles the latest hash with the on-disk item document, and appends an auditable `history_repair` marker. It never modifies item content, supports `--dry-run`/`--author`/`--message`/`--force` with the same ownership/lock governance as `history-redact`, and is a safe no-op on a clean stream. Exposed via the CLI, the MCP `history-repair` action, SDK contracts, and shell completions. This is the missing peer to `history-redact` (which only re-anchors a chain when a redaction match occurs), so cleanly-drifted legacy streams could never be repaired before.
|
|
66
|
+
|
|
67
|
+
### Changed (history)
|
|
68
|
+
- Consolidated the duplicated history replay/patch mechanics shared by `history`, `restore`, `history-redact`, and `history-repair` into a single `src/core/history/replay.ts` module (`ReplayDocument`, `replayHash`, `normalizeReplayPatch*`, `toReplayDocument`, `tryApplyReplayPatch`, `verifyHistoryChain`, `reanchorHistoryEntries`). Each command keeps its own thin error-formatting wrapper to preserve exact CLI error contracts. No behavior change.
|
|
69
|
+
|
|
10
70
|
## [2026.5.18] - 2026-05-18
|
|
11
71
|
|
|
12
72
|
### Changed
|
package/README.md
CHANGED
|
@@ -117,7 +117,8 @@ For token-aware local routing, install `guide-shell` with `pm install guide-shel
|
|
|
117
117
|
- Tag-driven publishing remains in `.github/workflows/release.yml`.
|
|
118
118
|
- Local parity commands:
|
|
119
119
|
- `pnpm release:pipeline:dry-run`
|
|
120
|
-
- `pnpm release:pipeline
|
|
120
|
+
- `pnpm release:pipeline`
|
|
121
|
+
- run maintainer-only reliability checks separately and keep their raw details in ignored local notes
|
|
121
122
|
|
|
122
123
|
## Core Model
|
|
123
124
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c8215895-2ec4-5d78-97b1-42fc20757af7")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../core/fs/fs-utils.js";
|
|
4
4
|
import { resolveItemTypeRegistry } from "../core/item/type-registry.js";
|
|
5
5
|
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
@@ -73,6 +73,18 @@ export function scoreCommandPathMatch(commandPath, queryToken) {
|
|
|
73
73
|
if (normalizedPath.includes(normalizedToken)) {
|
|
74
74
|
return 3;
|
|
75
75
|
}
|
|
76
|
+
// Fall back to edit distance so transposition/typo cases (e.g. "lst" -> "list") still rank.
|
|
77
|
+
const maxDistance = normalizedToken.length >= 5 ? 2 : 1;
|
|
78
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
79
|
+
for (const segment of pathSegments) {
|
|
80
|
+
const distance = levenshteinDistanceWithinLimit(segment, normalizedToken, maxDistance);
|
|
81
|
+
if (distance !== null) {
|
|
82
|
+
bestDistance = Math.min(bestDistance, distance);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (Number.isFinite(bestDistance)) {
|
|
86
|
+
return 4 + bestDistance;
|
|
87
|
+
}
|
|
76
88
|
return Number.POSITIVE_INFINITY;
|
|
77
89
|
}
|
|
78
90
|
function toComparableFlag(flag) {
|
|
@@ -185,9 +197,11 @@ export function buildUnknownCommandGuidanceFromRuntime(rawMessage, root, extensi
|
|
|
185
197
|
const suggestedPaths = (rankedCandidates.length > 0 ? rankedCandidates : fallbackTopLevel).slice(0, 3);
|
|
186
198
|
const examples = [...new Set(["pm --help", ...suggestedPaths.map((path) => `pm ${path} --help`)])];
|
|
187
199
|
const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);
|
|
200
|
+
const didYouMean = rankedCandidates.length > 0 ? `Did you mean: ${rankedCandidates.slice(0, 3).join(", ")}?` : null;
|
|
188
201
|
return {
|
|
189
202
|
unknownCommandExamples: examples,
|
|
190
203
|
unknownCommandNextSteps: [
|
|
204
|
+
...(didYouMean ? [didYouMean] : []),
|
|
191
205
|
'Run "pm --help" to list commands available in this runtime, including active extensions.',
|
|
192
206
|
"Use one of the suggested command paths above with --help to inspect valid flags and usage.",
|
|
193
207
|
...(optionalPackageHint ? [optionalPackageHint] : []),
|
|
@@ -312,4 +326,4 @@ export async function formatCommanderUsageJson(error, rootProgram, extensionDesc
|
|
|
312
326
|
return JSON.stringify(envelope, null, 2);
|
|
313
327
|
}
|
|
314
328
|
//# sourceMappingURL=commander-usage.js.map
|
|
315
|
-
//# debugId=
|
|
329
|
+
//# debugId=c8215895-2ec4-5d78-97b1-42fc20757af7
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commander-usage.js","sources":["cli/commander-usage.ts"],"sourceRoot":"/","sourcesContent":["import { Command } from \"commander\";\nimport { pathExists } from \"../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport { BUILTIN_ITEM_TYPE_VALUES } from \"../types/index.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveServiceOverride,\n} from \"../core/extensions/index.js\";\nimport { resolveSubcommandFlagContractsForCommand } from \"../sdk/cli-contracts.js\";\nimport {\n type CommanderGuidanceContext,\n formatCommanderErrorForDisplay,\n formatCommanderErrorForJson,\n} from \"./error-guidance.js\";\nimport { normalizeHelpCommandPath } from \"./help-content.js\";\nimport { getCommandPath } from \"./registration-helpers.js\";\nimport {\n normalizeBootstrapInvocation,\n parseBootstrapGlobalOptions,\n parseBootstrapCommandName,\n} from \"./bootstrap-args.js\";\nimport {\n extractProvidedOptionFlags,\n normalizeLongFlag,\n renderPmCommand,\n} from \"./argv-utils.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport type { ExtensionCommandHelpDescriptor } from \"./extension-command-help.js\";\n\nexport const BUILTIN_TYPE_HELP_VALUES = BUILTIN_ITEM_TYPE_VALUES.join(\"|\");\n\nconst OPTIONAL_PACKAGE_INSTALL_HINTS: Record<string, string> = {\n calendar: \"calendar\",\n cal: \"calendar\",\n reindex: \"search-advanced\",\n \"search-advanced\": \"search-advanced\",\n \"dedupe-audit\": \"governance-audit\",\n \"comments-audit\": \"governance-audit\",\n normalize: \"governance-audit\",\n guide: \"guide-shell\",\n completion: \"guide-shell\",\n templates: \"templates\",\n \"test-runs\": \"linked-test-adapters\",\n beads: \"beads\",\n todos: \"todos\",\n};\n\nexport interface CommanderUsageContext extends CommanderGuidanceContext {\n message: string;\n commandName: string | undefined;\n allowedTypes: string;\n}\n\nexport function collectRuntimeCommandPaths(\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): string[] {\n const commandPaths = new Set<string>();\n const queue: Command[] = [...root.commands];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const normalizedPath = normalizeHelpCommandPath(getCommandPath(current));\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n queue.push(...current.commands);\n }\n for (const descriptorPath of extensionDescriptors.keys()) {\n const normalizedPath = normalizeHelpCommandPath(descriptorPath);\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n }\n return [...commandPaths].sort((left, right) => left.localeCompare(right));\n}\n\nexport function scoreCommandPathMatch(commandPath: string, queryToken: string): number {\n const normalizedPath = commandPath.trim().toLowerCase();\n const normalizedToken = queryToken.trim().toLowerCase();\n if (normalizedToken.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const pathSegments = normalizedPath.split(\" \");\n if (normalizedPath === normalizedToken) {\n return 0;\n }\n if (pathSegments.includes(normalizedToken)) {\n return 1;\n }\n if (pathSegments.some((segment) => segment.startsWith(normalizedToken))) {\n return 2;\n }\n if (normalizedPath.includes(normalizedToken)) {\n return 3;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction toComparableFlag(flag: string): string {\n return normalizeLongFlag(flag).slice(2).replace(/-/g, \"\");\n}\n\nfunction renderAttemptedCommand(argv: string[]): string {\n return renderPmCommand(argv);\n}\n\nfunction resolveOptionalPackageInstallHint(commandPath: string): string | null {\n const topLevel = commandPath.split(\" \")[0]?.trim().toLowerCase();\n if (!topLevel) {\n return null;\n }\n const packageAlias = OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];\n if (!packageAlias) {\n return null;\n }\n return `If this command comes from an optional package, install it with: pm install ${packageAlias}`;\n}\n\nfunction collectKnownLongFlags(commandName: string | undefined): string[] {\n const flags = new Set<string>();\n const contracts = resolveSubcommandFlagContractsForCommand(commandName);\n for (const contract of contracts) {\n if (contract.flag.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(contract.flag));\n }\n for (const alias of contract.aliases ?? []) {\n if (alias.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(alias));\n }\n }\n }\n return [...flags].sort((left, right) => left.localeCompare(right));\n}\n\nfunction suggestNearestLongFlags(unknownOption: string, knownFlags: string[]): string[] {\n if (!unknownOption.startsWith(\"--\")) {\n return [];\n }\n const unknownComparable = toComparableFlag(unknownOption);\n const maxDistance = unknownComparable.length >= 8 ? 2 : 1;\n const candidates: Array<{ flag: string; distance: number }> = [];\n for (const flag of knownFlags) {\n const distance = levenshteinDistanceWithinLimit(unknownComparable, toComparableFlag(flag), maxDistance);\n if (distance === null) {\n continue;\n }\n if (distance <= 0) {\n continue;\n }\n candidates.push({ flag, distance });\n }\n return candidates\n .sort((left, right) => {\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n return left.flag.localeCompare(right.flag);\n })\n .map((entry) => entry.flag)\n .slice(0, 3);\n}\n\nfunction rewriteUnknownOptionArgv(argv: string[], unknownOption: string, replacementFlag: string): string[] | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith(\"--\")) {\n continue;\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n if (normalizeLongFlag(key) !== normalizeLongFlag(unknownOption)) {\n continue;\n }\n const next = [...argv];\n next[index] = equalsIndex >= 0 ? `${replacementFlag}${token.slice(equalsIndex)}` : replacementFlag;\n return next;\n }\n return undefined;\n}\n\nexport function buildUnknownCommandGuidanceFromRuntime(\n rawMessage: string,\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): CommanderGuidanceContext | undefined {\n const unknownCommandMatch = rawMessage.match(/unknown command '([^']+)'/i);\n if (!unknownCommandMatch || typeof unknownCommandMatch[1] !== \"string\") {\n return undefined;\n }\n const normalizedUnknown = normalizeHelpCommandPath(unknownCommandMatch[1]);\n if (normalizedUnknown.length === 0) {\n return undefined;\n }\n const commandPaths = collectRuntimeCommandPaths(root, extensionDescriptors);\n if (commandPaths.length === 0) {\n return undefined;\n }\n\n const primaryToken = normalizedUnknown.split(\" \")[0] ?? normalizedUnknown;\n const rankedCandidates = commandPaths\n .map((commandPath) => {\n const directScore = scoreCommandPathMatch(commandPath, normalizedUnknown);\n const fallbackScore =\n primaryToken !== normalizedUnknown ? scoreCommandPathMatch(commandPath, primaryToken) : Number.POSITIVE_INFINITY;\n const score = Math.min(directScore, fallbackScore);\n return { commandPath, score };\n })\n .filter((entry) => Number.isFinite(entry.score))\n .sort((left, right) => {\n if (left.score !== right.score) {\n return left.score - right.score;\n }\n return left.commandPath.localeCompare(right.commandPath);\n })\n .map((entry) => entry.commandPath);\n\n const fallbackTopLevel = [...new Set(commandPaths.map((commandPath) => commandPath.split(\" \")[0]).filter((segment) => segment.length > 0))];\n fallbackTopLevel.sort((left, right) => left.localeCompare(right));\n const suggestedPaths = (rankedCandidates.length > 0 ? rankedCandidates : fallbackTopLevel).slice(0, 3);\n const examples = [...new Set([\"pm --help\", ...suggestedPaths.map((path) => `pm ${path} --help`)])];\n const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);\n\n return {\n unknownCommandExamples: examples,\n unknownCommandNextSteps: [\n 'Run \"pm --help\" to list commands available in this runtime, including active extensions.',\n \"Use one of the suggested command paths above with --help to inspect valid flags and usage.\",\n ...(optionalPackageHint ? [optionalPackageHint] : []),\n ],\n };\n}\n\nexport function resolveChildCommandByToken(parent: Command, token: string): Command | undefined {\n const normalizedToken = token.trim().toLowerCase();\n return parent.commands.find((candidate) => {\n if (candidate.name().trim().toLowerCase() === normalizedToken) {\n return true;\n }\n const aliases = typeof candidate.aliases === \"function\" ? candidate.aliases() : [];\n return aliases.some((alias) => alias.trim().toLowerCase() === normalizedToken);\n });\n}\n\nexport function isKnownHelpCommandPath(root: Command, commandPathTokens: string[]): boolean {\n if (commandPathTokens.length === 0) {\n return true;\n }\n let current = root;\n let matchedAny = false;\n for (const token of commandPathTokens) {\n const next = resolveChildCommandByToken(current, token);\n if (!next) {\n return matchedAny;\n }\n matchedAny = true;\n current = next;\n }\n return matchedAny;\n}\n\nexport async function resolveCommanderUsageContext(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<CommanderUsageContext> {\n const rawMessage = typeof error === \"object\" && error !== null ? (error as { message?: string }).message : undefined;\n const message = rawMessage ?? \"Invalid command usage\";\n const invocationArgv = normalizeBootstrapInvocation(process.argv.slice(2)).argv;\n const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);\n const commandName = parseBootstrapCommandName(invocationArgv);\n const attemptedCommand = renderAttemptedCommand(invocationArgv);\n const providedOptionFlags = extractProvidedOptionFlags(invocationArgv);\n let allowedTypes = BUILTIN_TYPE_HELP_VALUES;\n try {\n const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);\n if (await pathExists(getSettingsPath(pmRoot))) {\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n if (typeRegistry.types.length > 0) {\n allowedTypes = typeRegistry.types.join(\"|\");\n }\n }\n } catch {\n // Fall back to built-in type guidance when settings cannot be read.\n }\n const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);\n const unknownOptionMatch = message.match(/unknown option '([^']+)'/i);\n const unknownOptionSuggestions =\n unknownOptionMatch && commandName\n ? suggestNearestLongFlags(unknownOptionMatch[1], collectKnownLongFlags(commandName))\n : undefined;\n let suggestedRetryCommand: string | undefined;\n if (unknownOptionMatch && unknownOptionSuggestions && unknownOptionSuggestions.length > 0) {\n const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);\n if (rewritten) {\n suggestedRetryCommand = renderAttemptedCommand(rewritten);\n }\n }\n if (!suggestedRetryCommand) {\n const missingRequiredOption = message.match(/required option '([^']+)' not specified/i);\n const requiredOptionToken = missingRequiredOption?.[1]?.trim().split(/\\s+/)[0]?.replace(/[,:;]+$/g, \"\");\n if (requiredOptionToken?.startsWith(\"--\")) {\n const hasFlag = invocationArgv.some((token) => token.startsWith(requiredOptionToken));\n if (!hasFlag) {\n suggestedRetryCommand = renderAttemptedCommand([...invocationArgv, requiredOptionToken, \"<value>\"]);\n }\n }\n }\n return {\n message,\n commandName,\n allowedTypes,\n attemptedCommand,\n normalizedInvocationArgs: [...invocationArgv],\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n ...(unknownCommandGuidance ?? {}),\n };\n}\n\nexport async function formatCommanderUsageMessage(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const {\n message,\n commandName,\n allowedTypes,\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n } = usageContext;\n const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n });\n const serviceOverride = await runActiveServiceOverride(\"help_format\", {\n message: formatted,\n command: commandName,\n allowed_types: allowedTypes,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result;\n }\n return formatted;\n}\n\nexport async function formatCommanderUsageJson(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const envelope = formatCommanderErrorForJson(\n usageContext.message,\n usageContext.commandName,\n usageContext.allowedTypes,\n EXIT_CODE.USAGE,\n {\n unknownCommandExamples: usageContext.unknownCommandExamples,\n unknownCommandNextSteps: usageContext.unknownCommandNextSteps,\n attemptedCommand: usageContext.attemptedCommand,\n normalizedInvocationArgs: usageContext.normalizedInvocationArgs,\n providedOptionFlags: usageContext.providedOptionFlags,\n unknownOptionSuggestions: usageContext.unknownOptionSuggestions,\n suggestedRetryCommand: usageContext.suggestedRetryCommand,\n },\n );\n return JSON.stringify(envelope, null, 2);\n}\n"],"names":[],"mappings":"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","debugId":"88f00d54-404b-5780-9190-9ca4633a8976"}
|
|
1
|
+
{"version":3,"file":"commander-usage.js","sources":["cli/commander-usage.ts"],"sourceRoot":"/","sourcesContent":["import { Command } from \"commander\";\nimport { pathExists } from \"../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport { BUILTIN_ITEM_TYPE_VALUES } from \"../types/index.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveServiceOverride,\n} from \"../core/extensions/index.js\";\nimport { resolveSubcommandFlagContractsForCommand } from \"../sdk/cli-contracts.js\";\nimport {\n type CommanderGuidanceContext,\n formatCommanderErrorForDisplay,\n formatCommanderErrorForJson,\n} from \"./error-guidance.js\";\nimport { normalizeHelpCommandPath } from \"./help-content.js\";\nimport { getCommandPath } from \"./registration-helpers.js\";\nimport {\n normalizeBootstrapInvocation,\n parseBootstrapGlobalOptions,\n parseBootstrapCommandName,\n} from \"./bootstrap-args.js\";\nimport {\n extractProvidedOptionFlags,\n normalizeLongFlag,\n renderPmCommand,\n} from \"./argv-utils.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport type { ExtensionCommandHelpDescriptor } from \"./extension-command-help.js\";\n\nexport const BUILTIN_TYPE_HELP_VALUES = BUILTIN_ITEM_TYPE_VALUES.join(\"|\");\n\nconst OPTIONAL_PACKAGE_INSTALL_HINTS: Record<string, string> = {\n calendar: \"calendar\",\n cal: \"calendar\",\n reindex: \"search-advanced\",\n \"search-advanced\": \"search-advanced\",\n \"dedupe-audit\": \"governance-audit\",\n \"comments-audit\": \"governance-audit\",\n normalize: \"governance-audit\",\n guide: \"guide-shell\",\n completion: \"guide-shell\",\n templates: \"templates\",\n \"test-runs\": \"linked-test-adapters\",\n beads: \"beads\",\n todos: \"todos\",\n};\n\nexport interface CommanderUsageContext extends CommanderGuidanceContext {\n message: string;\n commandName: string | undefined;\n allowedTypes: string;\n}\n\nexport function collectRuntimeCommandPaths(\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): string[] {\n const commandPaths = new Set<string>();\n const queue: Command[] = [...root.commands];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const normalizedPath = normalizeHelpCommandPath(getCommandPath(current));\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n queue.push(...current.commands);\n }\n for (const descriptorPath of extensionDescriptors.keys()) {\n const normalizedPath = normalizeHelpCommandPath(descriptorPath);\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n }\n return [...commandPaths].sort((left, right) => left.localeCompare(right));\n}\n\nexport function scoreCommandPathMatch(commandPath: string, queryToken: string): number {\n const normalizedPath = commandPath.trim().toLowerCase();\n const normalizedToken = queryToken.trim().toLowerCase();\n if (normalizedToken.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const pathSegments = normalizedPath.split(\" \");\n if (normalizedPath === normalizedToken) {\n return 0;\n }\n if (pathSegments.includes(normalizedToken)) {\n return 1;\n }\n if (pathSegments.some((segment) => segment.startsWith(normalizedToken))) {\n return 2;\n }\n if (normalizedPath.includes(normalizedToken)) {\n return 3;\n }\n // Fall back to edit distance so transposition/typo cases (e.g. \"lst\" -> \"list\") still rank.\n const maxDistance = normalizedToken.length >= 5 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const segment of pathSegments) {\n const distance = levenshteinDistanceWithinLimit(segment, normalizedToken, maxDistance);\n if (distance !== null) {\n bestDistance = Math.min(bestDistance, distance);\n }\n }\n if (Number.isFinite(bestDistance)) {\n return 4 + bestDistance;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction toComparableFlag(flag: string): string {\n return normalizeLongFlag(flag).slice(2).replace(/-/g, \"\");\n}\n\nfunction renderAttemptedCommand(argv: string[]): string {\n return renderPmCommand(argv);\n}\n\nfunction resolveOptionalPackageInstallHint(commandPath: string): string | null {\n const topLevel = commandPath.split(\" \")[0]?.trim().toLowerCase();\n if (!topLevel) {\n return null;\n }\n const packageAlias = OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];\n if (!packageAlias) {\n return null;\n }\n return `If this command comes from an optional package, install it with: pm install ${packageAlias}`;\n}\n\nfunction collectKnownLongFlags(commandName: string | undefined): string[] {\n const flags = new Set<string>();\n const contracts = resolveSubcommandFlagContractsForCommand(commandName);\n for (const contract of contracts) {\n if (contract.flag.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(contract.flag));\n }\n for (const alias of contract.aliases ?? []) {\n if (alias.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(alias));\n }\n }\n }\n return [...flags].sort((left, right) => left.localeCompare(right));\n}\n\nfunction suggestNearestLongFlags(unknownOption: string, knownFlags: string[]): string[] {\n if (!unknownOption.startsWith(\"--\")) {\n return [];\n }\n const unknownComparable = toComparableFlag(unknownOption);\n const maxDistance = unknownComparable.length >= 8 ? 2 : 1;\n const candidates: Array<{ flag: string; distance: number }> = [];\n for (const flag of knownFlags) {\n const distance = levenshteinDistanceWithinLimit(unknownComparable, toComparableFlag(flag), maxDistance);\n if (distance === null) {\n continue;\n }\n if (distance <= 0) {\n continue;\n }\n candidates.push({ flag, distance });\n }\n return candidates\n .sort((left, right) => {\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n return left.flag.localeCompare(right.flag);\n })\n .map((entry) => entry.flag)\n .slice(0, 3);\n}\n\nfunction rewriteUnknownOptionArgv(argv: string[], unknownOption: string, replacementFlag: string): string[] | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith(\"--\")) {\n continue;\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n if (normalizeLongFlag(key) !== normalizeLongFlag(unknownOption)) {\n continue;\n }\n const next = [...argv];\n next[index] = equalsIndex >= 0 ? `${replacementFlag}${token.slice(equalsIndex)}` : replacementFlag;\n return next;\n }\n return undefined;\n}\n\nexport function buildUnknownCommandGuidanceFromRuntime(\n rawMessage: string,\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): CommanderGuidanceContext | undefined {\n const unknownCommandMatch = rawMessage.match(/unknown command '([^']+)'/i);\n if (!unknownCommandMatch || typeof unknownCommandMatch[1] !== \"string\") {\n return undefined;\n }\n const normalizedUnknown = normalizeHelpCommandPath(unknownCommandMatch[1]);\n if (normalizedUnknown.length === 0) {\n return undefined;\n }\n const commandPaths = collectRuntimeCommandPaths(root, extensionDescriptors);\n if (commandPaths.length === 0) {\n return undefined;\n }\n\n const primaryToken = normalizedUnknown.split(\" \")[0] ?? normalizedUnknown;\n const rankedCandidates = commandPaths\n .map((commandPath) => {\n const directScore = scoreCommandPathMatch(commandPath, normalizedUnknown);\n const fallbackScore =\n primaryToken !== normalizedUnknown ? scoreCommandPathMatch(commandPath, primaryToken) : Number.POSITIVE_INFINITY;\n const score = Math.min(directScore, fallbackScore);\n return { commandPath, score };\n })\n .filter((entry) => Number.isFinite(entry.score))\n .sort((left, right) => {\n if (left.score !== right.score) {\n return left.score - right.score;\n }\n return left.commandPath.localeCompare(right.commandPath);\n })\n .map((entry) => entry.commandPath);\n\n const fallbackTopLevel = [...new Set(commandPaths.map((commandPath) => commandPath.split(\" \")[0]).filter((segment) => segment.length > 0))];\n fallbackTopLevel.sort((left, right) => left.localeCompare(right));\n const suggestedPaths = (rankedCandidates.length > 0 ? rankedCandidates : fallbackTopLevel).slice(0, 3);\n const examples = [...new Set([\"pm --help\", ...suggestedPaths.map((path) => `pm ${path} --help`)])];\n const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);\n const didYouMean = rankedCandidates.length > 0 ? `Did you mean: ${rankedCandidates.slice(0, 3).join(\", \")}?` : null;\n\n return {\n unknownCommandExamples: examples,\n unknownCommandNextSteps: [\n ...(didYouMean ? [didYouMean] : []),\n 'Run \"pm --help\" to list commands available in this runtime, including active extensions.',\n \"Use one of the suggested command paths above with --help to inspect valid flags and usage.\",\n ...(optionalPackageHint ? [optionalPackageHint] : []),\n ],\n };\n}\n\nexport function resolveChildCommandByToken(parent: Command, token: string): Command | undefined {\n const normalizedToken = token.trim().toLowerCase();\n return parent.commands.find((candidate) => {\n if (candidate.name().trim().toLowerCase() === normalizedToken) {\n return true;\n }\n const aliases = typeof candidate.aliases === \"function\" ? candidate.aliases() : [];\n return aliases.some((alias) => alias.trim().toLowerCase() === normalizedToken);\n });\n}\n\nexport function isKnownHelpCommandPath(root: Command, commandPathTokens: string[]): boolean {\n if (commandPathTokens.length === 0) {\n return true;\n }\n let current = root;\n let matchedAny = false;\n for (const token of commandPathTokens) {\n const next = resolveChildCommandByToken(current, token);\n if (!next) {\n return matchedAny;\n }\n matchedAny = true;\n current = next;\n }\n return matchedAny;\n}\n\nexport async function resolveCommanderUsageContext(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<CommanderUsageContext> {\n const rawMessage = typeof error === \"object\" && error !== null ? (error as { message?: string }).message : undefined;\n const message = rawMessage ?? \"Invalid command usage\";\n const invocationArgv = normalizeBootstrapInvocation(process.argv.slice(2)).argv;\n const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);\n const commandName = parseBootstrapCommandName(invocationArgv);\n const attemptedCommand = renderAttemptedCommand(invocationArgv);\n const providedOptionFlags = extractProvidedOptionFlags(invocationArgv);\n let allowedTypes = BUILTIN_TYPE_HELP_VALUES;\n try {\n const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);\n if (await pathExists(getSettingsPath(pmRoot))) {\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n if (typeRegistry.types.length > 0) {\n allowedTypes = typeRegistry.types.join(\"|\");\n }\n }\n } catch {\n // Fall back to built-in type guidance when settings cannot be read.\n }\n const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);\n const unknownOptionMatch = message.match(/unknown option '([^']+)'/i);\n const unknownOptionSuggestions =\n unknownOptionMatch && commandName\n ? suggestNearestLongFlags(unknownOptionMatch[1], collectKnownLongFlags(commandName))\n : undefined;\n let suggestedRetryCommand: string | undefined;\n if (unknownOptionMatch && unknownOptionSuggestions && unknownOptionSuggestions.length > 0) {\n const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);\n if (rewritten) {\n suggestedRetryCommand = renderAttemptedCommand(rewritten);\n }\n }\n if (!suggestedRetryCommand) {\n const missingRequiredOption = message.match(/required option '([^']+)' not specified/i);\n const requiredOptionToken = missingRequiredOption?.[1]?.trim().split(/\\s+/)[0]?.replace(/[,:;]+$/g, \"\");\n if (requiredOptionToken?.startsWith(\"--\")) {\n const hasFlag = invocationArgv.some((token) => token.startsWith(requiredOptionToken));\n if (!hasFlag) {\n suggestedRetryCommand = renderAttemptedCommand([...invocationArgv, requiredOptionToken, \"<value>\"]);\n }\n }\n }\n return {\n message,\n commandName,\n allowedTypes,\n attemptedCommand,\n normalizedInvocationArgs: [...invocationArgv],\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n ...(unknownCommandGuidance ?? {}),\n };\n}\n\nexport async function formatCommanderUsageMessage(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const {\n message,\n commandName,\n allowedTypes,\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n } = usageContext;\n const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n });\n const serviceOverride = await runActiveServiceOverride(\"help_format\", {\n message: formatted,\n command: commandName,\n allowed_types: allowedTypes,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result;\n }\n return formatted;\n}\n\nexport async function formatCommanderUsageJson(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const envelope = formatCommanderErrorForJson(\n usageContext.message,\n usageContext.commandName,\n usageContext.allowedTypes,\n EXIT_CODE.USAGE,\n {\n unknownCommandExamples: usageContext.unknownCommandExamples,\n unknownCommandNextSteps: usageContext.unknownCommandNextSteps,\n attemptedCommand: usageContext.attemptedCommand,\n normalizedInvocationArgs: usageContext.normalizedInvocationArgs,\n providedOptionFlags: usageContext.providedOptionFlags,\n unknownOptionSuggestions: usageContext.unknownOptionSuggestions,\n suggestedRetryCommand: usageContext.suggestedRetryCommand,\n },\n );\n return JSON.stringify(envelope, null, 2);\n}\n"],"names":[],"mappings":"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","debugId":"c8215895-2ec4-5d78-97b1-42fc20757af7"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import { mutateItem } from "../../core/store/item-store.js";
|
|
3
|
+
interface AnnotationEntry {
|
|
4
|
+
created_at: string;
|
|
5
|
+
author: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
interface AnnotationCommandOptions {
|
|
9
|
+
limit?: string;
|
|
10
|
+
author?: string;
|
|
11
|
+
message?: string;
|
|
12
|
+
force?: boolean;
|
|
13
|
+
includeMeta?: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface AnnotationInput {
|
|
16
|
+
mode: "list" | "add" | "stdin" | "file";
|
|
17
|
+
value?: string;
|
|
18
|
+
emptyFlag?: string;
|
|
19
|
+
}
|
|
20
|
+
interface OwnershipConflictGuidance {
|
|
21
|
+
required: string;
|
|
22
|
+
examples: string[];
|
|
23
|
+
nextSteps: string[];
|
|
24
|
+
}
|
|
25
|
+
interface AnnotationCommandConfig<TKey extends string> {
|
|
26
|
+
input: AnnotationInput;
|
|
27
|
+
collectionKey: TKey;
|
|
28
|
+
op: Parameters<typeof mutateItem>[0]["op"];
|
|
29
|
+
parseText: (raw: string) => string;
|
|
30
|
+
allowAuditBypass: boolean;
|
|
31
|
+
conflictGuidance: OwnershipConflictGuidance;
|
|
32
|
+
}
|
|
33
|
+
type AnnotationCommandResult<TKey extends string, TEntry extends AnnotationEntry> = {
|
|
34
|
+
id: string;
|
|
35
|
+
count: number;
|
|
36
|
+
} & Record<TKey, TEntry[]> & {
|
|
37
|
+
total_count?: number;
|
|
38
|
+
returned_count?: number;
|
|
39
|
+
has_more?: boolean;
|
|
40
|
+
limit?: number;
|
|
41
|
+
};
|
|
42
|
+
export declare function limitAnnotationEntries<TEntry>(values: TEntry[], limit: number | undefined): TEntry[];
|
|
43
|
+
export declare function readAnnotationEntries<TEntry>(source: Record<string, unknown>, collectionKey: string): TEntry[];
|
|
44
|
+
export declare function parseAnnotationTextInput(raw: string, options?: {
|
|
45
|
+
stripPlainTextPrefix?: boolean;
|
|
46
|
+
}): string;
|
|
47
|
+
export declare function wrapOwnershipConflict(error: unknown, guidance: OwnershipConflictGuidance): never;
|
|
48
|
+
export declare function runAnnotationCommand<TKey extends string, TEntry extends AnnotationEntry>(id: string, options: AnnotationCommandOptions, global: GlobalOptions, config: AnnotationCommandConfig<TKey>): Promise<AnnotationCommandResult<TKey, TEntry>>;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="caaa2ed3-8a3b-566d-aa92-cfc6540d26c1")}catch(e){}}();
|
|
3
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
|
+
import { getActiveExtensionRegistrations } from "../../core/extensions/index.js";
|
|
5
|
+
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
6
|
+
import { parseCsvKv } from "../../core/item/parse.js";
|
|
7
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
8
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
9
|
+
import { nowIso } from "../../core/shared/time.js";
|
|
10
|
+
import { resolveAuthor } from "../../core/shared/author.js";
|
|
11
|
+
import { locateItem, mutateItem, readLocatedItem } from "../../core/store/item-store.js";
|
|
12
|
+
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
13
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
14
|
+
import { parseLimit } from "../shared-parsers.js";
|
|
15
|
+
export function limitAnnotationEntries(values, limit) {
|
|
16
|
+
if (limit === undefined)
|
|
17
|
+
return values;
|
|
18
|
+
if (limit === 0)
|
|
19
|
+
return [];
|
|
20
|
+
return values.slice(Math.max(0, values.length - limit));
|
|
21
|
+
}
|
|
22
|
+
export function readAnnotationEntries(source, collectionKey) {
|
|
23
|
+
const value = source[collectionKey];
|
|
24
|
+
return Array.isArray(value) ? value : [];
|
|
25
|
+
}
|
|
26
|
+
export function parseAnnotationTextInput(raw, options = {}) {
|
|
27
|
+
const trimmed = raw.trim();
|
|
28
|
+
if (!trimmed) {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
const textPrefixMatch = /^(?:[-*+]\s*)?text\s*[:=]/i.exec(trimmed);
|
|
32
|
+
if (options.stripPlainTextPrefix === true && textPrefixMatch && !trimmed.startsWith("```")) {
|
|
33
|
+
const text = trimmed.slice(textPrefixMatch[0].length).trim();
|
|
34
|
+
return text || trimmed;
|
|
35
|
+
}
|
|
36
|
+
const looksStructured = /^(?:[-*+]\s*)?text\s*[:=]/im.test(trimmed) || trimmed.startsWith("```");
|
|
37
|
+
if (!looksStructured) {
|
|
38
|
+
return trimmed;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const kv = parseCsvKv(trimmed, "--add");
|
|
42
|
+
const keys = Object.keys(kv).map((key) => key.trim().toLowerCase());
|
|
43
|
+
if (keys.some((key) => key !== "text")) {
|
|
44
|
+
return trimmed;
|
|
45
|
+
}
|
|
46
|
+
const text = kv.text?.trim();
|
|
47
|
+
return text || trimmed;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return trimmed;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function wrapOwnershipConflict(error, guidance) {
|
|
54
|
+
if (error instanceof PmCliError &&
|
|
55
|
+
error.exitCode === EXIT_CODE.CONFLICT &&
|
|
56
|
+
error.message.includes("is assigned to") &&
|
|
57
|
+
error.message.includes("Use --force to override")) {
|
|
58
|
+
throw new PmCliError(error.message, error.exitCode, {
|
|
59
|
+
code: "ownership_conflict",
|
|
60
|
+
required: guidance.required,
|
|
61
|
+
examples: guidance.examples,
|
|
62
|
+
nextSteps: guidance.nextSteps,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
export async function runAnnotationCommand(id, options, global, config) {
|
|
68
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
69
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
70
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
71
|
+
}
|
|
72
|
+
const settings = await readSettings(pmRoot);
|
|
73
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
74
|
+
const limit = parseLimit(options.limit);
|
|
75
|
+
if (config.input.mode === "list") {
|
|
76
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
77
|
+
if (!located) {
|
|
78
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
79
|
+
}
|
|
80
|
+
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
81
|
+
const allEntries = readAnnotationEntries(loaded.document.metadata, config.collectionKey);
|
|
82
|
+
return renderAnnotationResult(located.id, config.collectionKey, allEntries, limit, options.includeMeta === true);
|
|
83
|
+
}
|
|
84
|
+
const author = resolveAuthor(options.author, settings.author_default);
|
|
85
|
+
const text = config.parseText(config.input.value ?? "");
|
|
86
|
+
if (!text.trim()) {
|
|
87
|
+
throw new PmCliError(`${config.input.emptyFlag ?? "--add"} text cannot be empty`, EXIT_CODE.USAGE);
|
|
88
|
+
}
|
|
89
|
+
let result;
|
|
90
|
+
try {
|
|
91
|
+
result = await mutateItem({
|
|
92
|
+
pmRoot,
|
|
93
|
+
settings,
|
|
94
|
+
id,
|
|
95
|
+
op: config.op,
|
|
96
|
+
author,
|
|
97
|
+
message: options.message,
|
|
98
|
+
force: options.force,
|
|
99
|
+
bypassAssigneeConflict: config.allowAuditBypass,
|
|
100
|
+
mutate(document) {
|
|
101
|
+
const entries = readAnnotationEntries(document.metadata, config.collectionKey);
|
|
102
|
+
entries.push({
|
|
103
|
+
created_at: nowIso(),
|
|
104
|
+
author,
|
|
105
|
+
text,
|
|
106
|
+
});
|
|
107
|
+
document.metadata[config.collectionKey] = entries;
|
|
108
|
+
return { changedFields: [config.collectionKey] };
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
wrapOwnershipConflict(error, config.conflictGuidance);
|
|
114
|
+
}
|
|
115
|
+
const allEntries = readAnnotationEntries(result.item, config.collectionKey);
|
|
116
|
+
return renderAnnotationResult(result.item.id, config.collectionKey, allEntries, limit, options.includeMeta === true);
|
|
117
|
+
}
|
|
118
|
+
function renderAnnotationResult(id, collectionKey, allEntries, limit, includeMeta) {
|
|
119
|
+
const entries = limitAnnotationEntries(allEntries, limit);
|
|
120
|
+
return {
|
|
121
|
+
id,
|
|
122
|
+
[collectionKey]: entries,
|
|
123
|
+
count: entries.length,
|
|
124
|
+
...(includeMeta
|
|
125
|
+
? {
|
|
126
|
+
total_count: allEntries.length,
|
|
127
|
+
returned_count: entries.length,
|
|
128
|
+
has_more: entries.length < allEntries.length,
|
|
129
|
+
...(limit !== undefined ? { limit } : {}),
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=annotation-command.js.map
|
|
135
|
+
//# debugId=caaa2ed3-8a3b-566d-aa92-cfc6540d26c1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation-command.js","sources":["cli/commands/annotation-command.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseCsvKv } from \"../../core/item/parse.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { parseLimit } from \"../shared-parsers.js\";\n\ninterface AnnotationEntry {\n created_at: string;\n author: string;\n text: string;\n}\n\ninterface AnnotationCommandOptions {\n limit?: string;\n author?: string;\n message?: string;\n force?: boolean;\n includeMeta?: boolean;\n}\n\ninterface AnnotationInput {\n mode: \"list\" | \"add\" | \"stdin\" | \"file\";\n value?: string;\n emptyFlag?: string;\n}\n\ninterface OwnershipConflictGuidance {\n required: string;\n examples: string[];\n nextSteps: string[];\n}\n\ninterface AnnotationCommandConfig<TKey extends string> {\n input: AnnotationInput;\n collectionKey: TKey;\n op: Parameters<typeof mutateItem>[0][\"op\"];\n parseText: (raw: string) => string;\n allowAuditBypass: boolean;\n conflictGuidance: OwnershipConflictGuidance;\n}\n\ntype AnnotationCommandResult<TKey extends string, TEntry extends AnnotationEntry> = {\n id: string;\n count: number;\n} & Record<TKey, TEntry[]> & {\n total_count?: number;\n returned_count?: number;\n has_more?: boolean;\n limit?: number;\n };\n\nexport function limitAnnotationEntries<TEntry>(values: TEntry[], limit: number | undefined): TEntry[] {\n if (limit === undefined) return values;\n if (limit === 0) return [];\n return values.slice(Math.max(0, values.length - limit));\n}\n\nexport function readAnnotationEntries<TEntry>(source: Record<string, unknown>, collectionKey: string): TEntry[] {\n const value = source[collectionKey];\n return Array.isArray(value) ? (value as TEntry[]) : [];\n}\n\nexport function parseAnnotationTextInput(raw: string, options: { stripPlainTextPrefix?: boolean } = {}): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n return \"\";\n }\n const textPrefixMatch = /^(?:[-*+]\\s*)?text\\s*[:=]/i.exec(trimmed);\n if (options.stripPlainTextPrefix === true && textPrefixMatch && !trimmed.startsWith(\"```\")) {\n const text = trimmed.slice(textPrefixMatch[0].length).trim();\n return text || trimmed;\n }\n const looksStructured = /^(?:[-*+]\\s*)?text\\s*[:=]/im.test(trimmed) || trimmed.startsWith(\"```\");\n if (!looksStructured) {\n return trimmed;\n }\n try {\n const kv = parseCsvKv(trimmed, \"--add\");\n const keys = Object.keys(kv).map((key) => key.trim().toLowerCase());\n if (keys.some((key) => key !== \"text\")) {\n return trimmed;\n }\n const text = kv.text?.trim();\n return text || trimmed;\n } catch {\n return trimmed;\n }\n}\n\nexport function wrapOwnershipConflict(error: unknown, guidance: OwnershipConflictGuidance): never {\n if (\n error instanceof PmCliError &&\n error.exitCode === EXIT_CODE.CONFLICT &&\n error.message.includes(\"is assigned to\") &&\n error.message.includes(\"Use --force to override\")\n ) {\n throw new PmCliError(error.message, error.exitCode, {\n code: \"ownership_conflict\",\n required: guidance.required,\n examples: guidance.examples,\n nextSteps: guidance.nextSteps,\n });\n }\n throw error;\n}\n\nexport async function runAnnotationCommand<TKey extends string, TEntry extends AnnotationEntry>(\n id: string,\n options: AnnotationCommandOptions,\n global: GlobalOptions,\n config: AnnotationCommandConfig<TKey>,\n): Promise<AnnotationCommandResult<TKey, TEntry>> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const limit = parseLimit(options.limit);\n\n if (config.input.mode === \"list\") {\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n const loaded = await readLocatedItem(located, { schema: settings.schema });\n const allEntries = readAnnotationEntries<TEntry>(loaded.document.metadata, config.collectionKey);\n return renderAnnotationResult(located.id, config.collectionKey, allEntries, limit, options.includeMeta === true);\n }\n\n const author = resolveAuthor(options.author, settings.author_default);\n const text = config.parseText(config.input.value ?? \"\");\n if (!text.trim()) {\n throw new PmCliError(`${config.input.emptyFlag ?? \"--add\"} text cannot be empty`, EXIT_CODE.USAGE);\n }\n\n let result: Awaited<ReturnType<typeof mutateItem>>;\n try {\n result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: config.op,\n author,\n message: options.message,\n force: options.force,\n bypassAssigneeConflict: config.allowAuditBypass,\n mutate(document) {\n const entries = readAnnotationEntries<TEntry>(document.metadata, config.collectionKey);\n entries.push({\n created_at: nowIso(),\n author,\n text,\n } as TEntry);\n document.metadata[config.collectionKey] = entries as never;\n return { changedFields: [config.collectionKey] };\n },\n });\n } catch (error: unknown) {\n wrapOwnershipConflict(error, config.conflictGuidance);\n }\n\n const allEntries = readAnnotationEntries<TEntry>(result.item, config.collectionKey);\n return renderAnnotationResult(result.item.id, config.collectionKey, allEntries, limit, options.includeMeta === true);\n}\n\nfunction renderAnnotationResult<TKey extends string, TEntry extends AnnotationEntry>(\n id: string,\n collectionKey: TKey,\n allEntries: TEntry[],\n limit: number | undefined,\n includeMeta: boolean,\n): AnnotationCommandResult<TKey, TEntry> {\n const entries = limitAnnotationEntries(allEntries, limit);\n return {\n id,\n [collectionKey]: entries,\n count: entries.length,\n ...(includeMeta\n ? {\n total_count: allEntries.length,\n returned_count: entries.length,\n has_more: entries.length < allEntries.length,\n ...(limit !== undefined ? { limit } : {}),\n }\n : {}),\n } as AnnotationCommandResult<TKey, TEntry>;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AA+ClD,MAAM,UAAU,sBAAsB,CAAS,MAAgB,EAAE,KAAyB;IACxF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAS,MAA+B,EAAE,aAAqB;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,UAA8C,EAAE;IACpG,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,eAAe,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,oBAAoB,KAAK,IAAI,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,IAAI,IAAI,OAAO,CAAC;IACzB,CAAC;IACD,MAAM,eAAe,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7B,OAAO,IAAI,IAAI,OAAO,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,QAAmC;IACvF,IACE,KAAK,YAAY,UAAU;QAC3B,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QACrC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EACjD,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;YAClD,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU,EACV,OAAiC,EACjC,MAAqB,EACrB,MAAqC;IAErC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;QACpH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,qBAAqB,CAAS,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACjG,OAAO,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,uBAAuB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACrG,CAAC;IAED,IAAI,MAA8C,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC;YACxB,MAAM;YACN,QAAQ;YACR,EAAE;YACF,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,sBAAsB,EAAE,MAAM,CAAC,gBAAgB;YAC/C,MAAM,CAAC,QAAQ;gBACb,MAAM,OAAO,GAAG,qBAAqB,CAAS,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,MAAM,EAAE;oBACpB,MAAM;oBACN,IAAI;iBACK,CAAC,CAAC;gBACb,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,OAAgB,CAAC;gBAC3D,OAAO,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,qBAAqB,CAAS,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpF,OAAO,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;AACvH,CAAC;AAED,SAAS,sBAAsB,CAC7B,EAAU,EACV,aAAmB,EACnB,UAAoB,EACpB,KAAyB,EACzB,WAAoB;IAEpB,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO;QACL,EAAE;QACF,CAAC,aAAa,CAAC,EAAE,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,GAAG,CAAC,WAAW;YACb,CAAC,CAAC;gBACE,WAAW,EAAE,UAAU,CAAC,MAAM;gBAC9B,cAAc,EAAE,OAAO,CAAC,MAAM;gBAC9B,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;gBAC5C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C;YACH,CAAC,CAAC,EAAE,CAAC;KACiC,CAAC;AAC7C,CAAC","debugId":"caaa2ed3-8a3b-566d-aa92-cfc6540d26c1"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1320d28a-e9cf-584d-95d1-640b1c128e60")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
4
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
5
5
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
6
|
+
import { resolveAuthor } from "../../core/shared/author.js";
|
|
6
7
|
import { createStdinTokenResolver } from "../../core/item/parse.js";
|
|
7
8
|
import { mutateItem } from "../../core/store/item-store.js";
|
|
8
9
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
9
10
|
import { readSettings } from "../../core/store/settings.js";
|
|
10
|
-
function resolveAuthor(candidate, defaultAuthor) {
|
|
11
|
-
const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;
|
|
12
|
-
const trimmed = resolved.trim();
|
|
13
|
-
return trimmed || "unknown";
|
|
14
|
-
}
|
|
15
11
|
export async function runAppend(id, options, global) {
|
|
16
12
|
if (options.body === undefined) {
|
|
17
13
|
throw new PmCliError("Missing required --body text", EXIT_CODE.USAGE);
|
|
@@ -49,4 +45,4 @@ export async function runAppend(id, options, global) {
|
|
|
49
45
|
};
|
|
50
46
|
}
|
|
51
47
|
//# sourceMappingURL=append.js.map
|
|
52
|
-
//# debugId=
|
|
48
|
+
//# debugId=1320d28a-e9cf-584d-95d1-640b1c128e60
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append.js","sources":["cli/commands/append.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { createStdinTokenResolver } from \"../../core/item/parse.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\n\nexport interface AppendCommandOptions {\n body: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface AppendResult {\n item: Record<string, unknown>;\n appended: string;\n changed_fields: string[];\n}\n\
|
|
1
|
+
{"version":3,"file":"append.js","sources":["cli/commands/append.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { createStdinTokenResolver } from \"../../core/item/parse.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\n\nexport interface AppendCommandOptions {\n body: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface AppendResult {\n item: Record<string, unknown>;\n appended: string;\n changed_fields: string[];\n}\n\n\nexport async function runAppend(id: string, options: AppendCommandOptions, global: GlobalOptions): Promise<AppendResult> {\n if (options.body === undefined) {\n throw new PmCliError(\"Missing required --body text\", EXIT_CODE.USAGE);\n }\n const stdinResolver = createStdinTokenResolver();\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const author = resolveAuthor(options.author, settings.author_default);\n const bodyInput = await stdinResolver.resolveValue(options.body, \"--body\");\n const appended = (bodyInput ?? \"\").trim();\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"append\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n if (appended.length === 0) {\n return { changedFields: [] };\n }\n const spacer = document.body.trim().length > 0 ? \"\\n\\n\" : \"\";\n document.body = `${document.body.replace(/\\s+$/, \"\")}${spacer}${appended}\\n`;\n return { changedFields: [\"body\"] };\n },\n });\n\n return {\n item: result.item as unknown as Record<string, unknown>,\n appended: appended.length > 0 ? appended : \"\",\n changed_fields: result.changedFields,\n };\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAgB5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,OAA6B,EAAE,MAAqB;IAC9F,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,MAAM;QACN,QAAQ;QACR,EAAE;QACF,EAAE,EAAE,QAAQ;QACZ,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,CAAC,QAAQ;YACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;YAC/B,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,QAAQ,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC;YAC7E,OAAO,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAA0C;QACvD,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC7C,cAAc,EAAE,MAAM,CAAC,aAAa;KACrC,CAAC;AACJ,CAAC","debugId":"1320d28a-e9cf-584d-95d1-640b1c128e60"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="132930ce-4e5e-5b59-938c-0871bc77b52e")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
4
|
import { getActiveExtensionRegistrations } from "../../core/extensions/index.js";
|
|
5
5
|
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
@@ -13,7 +13,7 @@ import { compareTimestampStrings, nowIso, resolveIsoOrRelative } from "../../cor
|
|
|
13
13
|
import { listAllFrontMatter } from "../../core/store/item-store.js";
|
|
14
14
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
15
15
|
import { readSettings } from "../../core/store/settings.js";
|
|
16
|
-
import {
|
|
16
|
+
import { weekdayOrderIndex } from "../../types/index.js";
|
|
17
17
|
export const CALENDAR_VIEW_VALUES = ["agenda", "day", "week", "month"];
|
|
18
18
|
export const CALENDAR_OUTPUT_VALUES = ["markdown", "toon", "json"];
|
|
19
19
|
const UTC_DAY_TO_WEEKDAY = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
|
|
@@ -21,9 +21,6 @@ const DEFAULT_RECURRENCE_LOOKAHEAD_DAYS = 365;
|
|
|
21
21
|
const DEFAULT_RECURRENCE_LOOKBACK_DAYS = 365;
|
|
22
22
|
const DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS = 28;
|
|
23
23
|
const MAX_RECURRENCE_OCCURRENCES = 1000;
|
|
24
|
-
function weekdayOrderIndex(value) {
|
|
25
|
-
return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
|
|
26
|
-
}
|
|
27
24
|
function parseNonNegativeInteger(raw, label) {
|
|
28
25
|
if (raw === undefined)
|
|
29
26
|
return undefined;
|
|
@@ -785,4 +782,4 @@ export async function runCalendar(options, global) {
|
|
|
785
782
|
};
|
|
786
783
|
}
|
|
787
784
|
//# sourceMappingURL=calendar.js.map
|
|
788
|
-
//# debugId=
|
|
785
|
+
//# debugId=132930ce-4e5e-5b59-938c-0871bc77b52e
|