@unbrained/pm-cli 2026.3.12 → 2026.5.1
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/.agents/pm/extensions/.managed-extensions.json +42 -0
- package/.agents/pm/extensions/beads/index.js +109 -0
- package/.agents/pm/extensions/beads/manifest.json +7 -0
- package/{dist/cli/commands/beads.js → .agents/pm/extensions/beads/runtime.js} +31 -21
- package/.agents/pm/extensions/beads/runtime.ts +702 -0
- package/.agents/pm/extensions/todos/index.js +126 -0
- package/.agents/pm/extensions/todos/manifest.json +7 -0
- package/{dist/extensions/builtins/todos/import-export.js → .agents/pm/extensions/todos/runtime.js} +39 -29
- package/.agents/pm/extensions/todos/runtime.ts +568 -0
- package/AGENTS.md +196 -92
- package/CHANGELOG.md +399 -0
- package/CODE_OF_CONDUCT.md +42 -0
- package/CONTRIBUTING.md +144 -0
- package/PRD.md +512 -164
- package/README.md +1053 -2
- package/SECURITY.md +51 -0
- package/dist/cli/commands/activity.d.ts +5 -0
- package/dist/cli/commands/activity.js +66 -3
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.d.ts +54 -0
- package/dist/cli/commands/aggregate.js +181 -0
- package/dist/cli/commands/aggregate.js.map +1 -0
- package/dist/cli/commands/append.js +4 -1
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +109 -0
- package/dist/cli/commands/calendar.js +797 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/claim.d.ts +5 -1
- package/dist/cli/commands/claim.js +42 -21
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts +1 -0
- package/dist/cli/commands/close.js +54 -5
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.d.ts +91 -0
- package/dist/cli/commands/comments-audit.js +195 -0
- package/dist/cli/commands/comments-audit.js.map +1 -0
- package/dist/cli/commands/comments.d.ts +1 -0
- package/dist/cli/commands/comments.js +70 -21
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.d.ts +10 -4
- package/dist/cli/commands/completion.js +1184 -137
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +35 -3
- package/dist/cli/commands/config.js +968 -13
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.d.ts +86 -0
- package/dist/cli/commands/context.js +299 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/contracts.d.ts +78 -0
- package/dist/cli/commands/contracts.js +920 -0
- package/dist/cli/commands/contracts.js.map +1 -0
- package/dist/cli/commands/create.d.ts +48 -14
- package/dist/cli/commands/create.js +1331 -160
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.d.ts +81 -0
- package/dist/cli/commands/dedupe-audit.js +330 -0
- package/dist/cli/commands/dedupe-audit.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +52 -0
- package/dist/cli/commands/deps.js +204 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +19 -0
- package/dist/cli/commands/docs.js +212 -13
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +122 -0
- package/dist/cli/commands/extension.js +1850 -0
- package/dist/cli/commands/extension.js.map +1 -0
- package/dist/cli/commands/files.d.ts +52 -1
- package/dist/cli/commands/files.js +443 -13
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.d.ts +11 -1
- package/dist/cli/commands/gc.js +89 -11
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +13 -0
- package/dist/cli/commands/get.js +35 -3
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -2
- package/dist/cli/commands/health.js +774 -23
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history.d.ts +20 -0
- package/dist/cli/commands/history.js +152 -6
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +16 -3
- package/dist/cli/commands/index.js +16 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +7 -2
- package/dist/cli/commands/init.js +137 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.d.ts +17 -0
- package/dist/cli/commands/learnings.js +129 -0
- package/dist/cli/commands/learnings.js.map +1 -0
- package/dist/cli/commands/list.d.ts +29 -1
- package/dist/cli/commands/list.js +289 -53
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.d.ts +51 -0
- package/dist/cli/commands/normalize.js +298 -0
- package/dist/cli/commands/normalize.js.map +1 -0
- package/dist/cli/commands/notes.d.ts +17 -0
- package/dist/cli/commands/notes.js +129 -0
- package/dist/cli/commands/notes.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +1 -0
- package/dist/cli/commands/reindex.js +208 -32
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.js +164 -30
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/search.d.ts +14 -1
- package/dist/cli/commands/search.js +475 -81
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.js +26 -10
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +26 -0
- package/dist/cli/commands/templates.js +179 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/test-all.d.ts +19 -1
- package/dist/cli/commands/test-all.js +161 -13
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test-runs.d.ts +63 -0
- package/dist/cli/commands/test-runs.js +179 -0
- package/dist/cli/commands/test-runs.js.map +1 -0
- package/dist/cli/commands/test.d.ts +75 -1
- package/dist/cli/commands/test.js +1360 -41
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.d.ts +57 -0
- package/dist/cli/commands/update-many.js +631 -0
- package/dist/cli/commands/update-many.js.map +1 -0
- package/dist/cli/commands/update.d.ts +30 -0
- package/dist/cli/commands/update.js +1393 -84
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +30 -0
- package/dist/cli/commands/validate.js +1140 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/error-guidance.d.ts +33 -0
- package/dist/cli/error-guidance.js +337 -0
- package/dist/cli/error-guidance.js.map +1 -0
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +92 -0
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +20 -0
- package/dist/cli/help-content.js +543 -0
- package/dist/cli/help-content.js.map +1 -0
- package/dist/cli/main.js +3625 -445
- package/dist/cli/main.js.map +1 -1
- package/dist/core/extensions/index.d.ts +13 -1
- package/dist/core/extensions/index.js +108 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/item-fields.d.ts +2 -0
- package/dist/core/extensions/item-fields.js +79 -0
- package/dist/core/extensions/item-fields.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +322 -9
- package/dist/core/extensions/loader.js +911 -20
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runtime-registrations.d.ts +5 -0
- package/dist/core/extensions/runtime-registrations.js +51 -0
- package/dist/core/extensions/runtime-registrations.js.map +1 -0
- package/dist/core/history/history-stream-policy.d.ts +20 -0
- package/dist/core/history/history-stream-policy.js +53 -0
- package/dist/core/history/history-stream-policy.js.map +1 -0
- package/dist/core/history/history.js +90 -1
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/item/id.js +4 -1
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/index.d.ts +1 -0
- package/dist/core/item/index.js +1 -0
- package/dist/core/item/index.js.map +1 -1
- package/dist/core/item/item-format.d.ts +11 -5
- package/dist/core/item/item-format.js +507 -24
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/parent-reference-policy.d.ts +6 -0
- package/dist/core/item/parent-reference-policy.js +32 -0
- package/dist/core/item/parent-reference-policy.js.map +1 -0
- package/dist/core/item/parse.d.ts +5 -0
- package/dist/core/item/parse.js +216 -19
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/sprint-release-format.d.ts +6 -0
- package/dist/core/item/sprint-release-format.js +33 -0
- package/dist/core/item/sprint-release-format.js.map +1 -0
- package/dist/core/item/status.d.ts +3 -0
- package/dist/core/item/status.js +24 -0
- package/dist/core/item/status.js.map +1 -0
- package/dist/core/item/type-registry.d.ts +37 -0
- package/dist/core/item/type-registry.js +706 -0
- package/dist/core/item/type-registry.js.map +1 -0
- package/dist/core/lock/lock.d.ts +1 -1
- package/dist/core/lock/lock.js +101 -12
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/output/command-aware.d.ts +1 -0
- package/dist/core/output/command-aware.js +394 -0
- package/dist/core/output/command-aware.js.map +1 -0
- package/dist/core/output/output.d.ts +3 -0
- package/dist/core/output/output.js +124 -6
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/schema/runtime-field-filters.d.ts +3 -0
- package/dist/core/schema/runtime-field-filters.js +39 -0
- package/dist/core/schema/runtime-field-filters.js.map +1 -0
- package/dist/core/schema/runtime-field-values.d.ts +8 -0
- package/dist/core/schema/runtime-field-values.js +154 -0
- package/dist/core/schema/runtime-field-values.js.map +1 -0
- package/dist/core/schema/runtime-schema.d.ts +68 -0
- package/dist/core/schema/runtime-schema.js +554 -0
- package/dist/core/schema/runtime-schema.js.map +1 -0
- package/dist/core/search/cache.d.ts +13 -1
- package/dist/core/search/cache.js +123 -14
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/semantic-defaults.d.ts +6 -0
- package/dist/core/search/semantic-defaults.js +120 -0
- package/dist/core/search/semantic-defaults.js.map +1 -0
- package/dist/core/search/vector-stores.js +3 -1
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/shared/command-types.d.ts +2 -0
- package/dist/core/shared/conflict-markers.d.ts +7 -0
- package/dist/core/shared/conflict-markers.js +27 -0
- package/dist/core/shared/conflict-markers.js.map +1 -0
- package/dist/core/shared/constants.d.ts +15 -4
- package/dist/core/shared/constants.js +141 -1
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +10 -1
- package/dist/core/shared/errors.js +3 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/text-normalization.d.ts +4 -0
- package/dist/core/shared/text-normalization.js +33 -0
- package/dist/core/shared/text-normalization.js.map +1 -0
- package/dist/core/shared/time.d.ts +1 -2
- package/dist/core/shared/time.js +98 -11
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/index.d.ts +1 -0
- package/dist/core/store/index.js +1 -0
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/store/item-format-migration.d.ts +9 -0
- package/dist/core/store/item-format-migration.js +87 -0
- package/dist/core/store/item-format-migration.js.map +1 -0
- package/dist/core/store/item-store.d.ts +13 -4
- package/dist/core/store/item-store.js +238 -51
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.d.ts +21 -3
- package/dist/core/store/paths.js +59 -4
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.d.ts +14 -1
- package/dist/core/store/settings.js +463 -7
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/consent.d.ts +2 -0
- package/dist/core/telemetry/consent.js +79 -0
- package/dist/core/telemetry/consent.js.map +1 -0
- package/dist/core/telemetry/runtime.d.ts +38 -0
- package/dist/core/telemetry/runtime.js +733 -0
- package/dist/core/telemetry/runtime.js.map +1 -0
- package/dist/core/test/background-runs.d.ts +117 -0
- package/dist/core/test/background-runs.js +760 -0
- package/dist/core/test/background-runs.js.map +1 -0
- package/dist/core/test/item-test-run-tracking.d.ts +9 -0
- package/dist/core/test/item-test-run-tracking.js +50 -0
- package/dist/core/test/item-test-run-tracking.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +92 -0
- package/dist/sdk/cli-contracts.js +2357 -0
- package/dist/sdk/cli-contracts.js.map +1 -0
- package/dist/sdk/index.d.ts +34 -0
- package/dist/sdk/index.js +23 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/types.d.ts +197 -3
- package/dist/types.js +48 -1
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +368 -39
- package/docs/EXTENSIONS.md +454 -49
- package/docs/RELEASING.md +68 -19
- package/docs/SDK.md +123 -0
- package/docs/examples/starter-extension/README.md +48 -0
- package/docs/examples/starter-extension/index.js +191 -0
- package/docs/examples/starter-extension/manifest.json +17 -0
- package/docs/examples/starter-extension/package.json +10 -0
- package/package.json +33 -6
- package/.pi/extensions/pm-cli/index.ts +0 -778
- package/dist/cli/commands/beads.d.ts +0 -16
- package/dist/cli/commands/beads.js.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -18
- package/dist/cli/commands/install.js +0 -87
- package/dist/cli/commands/install.js.map +0 -1
- package/dist/core/extensions/builtins.d.ts +0 -3
- package/dist/core/extensions/builtins.js +0 -47
- package/dist/core/extensions/builtins.js.map +0 -1
- package/dist/extensions/builtins/beads/index.d.ts +0 -8
- package/dist/extensions/builtins/beads/index.js +0 -33
- package/dist/extensions/builtins/beads/index.js.map +0 -1
- package/dist/extensions/builtins/todos/import-export.d.ts +0 -26
- package/dist/extensions/builtins/todos/import-export.js.map +0 -1
- package/dist/extensions/builtins/todos/index.d.ts +0 -8
- package/dist/extensions/builtins/todos/index.js +0 -38
- package/dist/extensions/builtins/todos/index.js.map +0 -1
package/SECURITY.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Security fixes are applied to the latest release line and the default branch under active development.
|
|
6
|
+
|
|
7
|
+
## Reporting a Vulnerability
|
|
8
|
+
|
|
9
|
+
If you discover a vulnerability, please report it privately first:
|
|
10
|
+
|
|
11
|
+
1. Open a private security advisory in GitHub, if available.
|
|
12
|
+
2. If advisories are unavailable, open an issue marked `security` with minimal exploit details and request private follow-up.
|
|
13
|
+
|
|
14
|
+
Please include:
|
|
15
|
+
|
|
16
|
+
- A clear description of the issue
|
|
17
|
+
- Affected versions/commit range
|
|
18
|
+
- Reproduction steps or proof of concept
|
|
19
|
+
- Suggested mitigation, if known
|
|
20
|
+
|
|
21
|
+
## Response Expectations
|
|
22
|
+
|
|
23
|
+
- Initial acknowledgement target: within 3 business days
|
|
24
|
+
- Triage and severity assessment: as quickly as possible
|
|
25
|
+
- Fix and coordinated disclosure timeline: based on severity and impact
|
|
26
|
+
|
|
27
|
+
Please avoid public disclosure before a fix or mitigation is available.
|
|
28
|
+
|
|
29
|
+
## Telemetry and Privacy Controls
|
|
30
|
+
|
|
31
|
+
Telemetry is opt-out and defaults to enabled for operational diagnostics.
|
|
32
|
+
|
|
33
|
+
- Disable globally at any time: `pm config global set telemetry-tracking --policy disabled`
|
|
34
|
+
- First-run consent prompt is interactive-only and is skipped for non-interactive/CI/json automation paths.
|
|
35
|
+
- Sensitive values are redacted prior to export (for example token/password/api-key style fields).
|
|
36
|
+
- Runtime telemetry failures are non-blocking and do not alter command success/failure behavior.
|
|
37
|
+
|
|
38
|
+
Retention and DSAR operations are handled on the remote telemetry platform:
|
|
39
|
+
|
|
40
|
+
- Raw event retention target: 365 days
|
|
41
|
+
- Aggregated daily rollups retained long-term
|
|
42
|
+
|
|
43
|
+
## Extension Runtime Trust Model
|
|
44
|
+
|
|
45
|
+
`pm` extensions execute as local Node.js code and can intercept command execution, parser/preflight lifecycle, output/error/help rendering, lock/history/item-store service paths, and search/vector runtime paths.
|
|
46
|
+
|
|
47
|
+
- Treat third-party extensions as fully trusted code.
|
|
48
|
+
- Prefer project-reviewed extensions committed to the repository.
|
|
49
|
+
- For incident triage or hardening runs, disable extensions with `--no-extensions`.
|
|
50
|
+
- In the full trusted-default model, `parser`, `preflight`, and `services` capabilities can bypass or replace core safety gates; only enable these capabilities for audited extensions.
|
|
51
|
+
- Include extension manifest name/version, capability list, and active settings selectors (`search.provider`, `vector_store.adapter`) in security reports when relevant.
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
2
|
import type { HistoryEntry } from "../../types/index.js";
|
|
3
3
|
export interface ActivityCommandOptions {
|
|
4
|
+
id?: string;
|
|
5
|
+
op?: string;
|
|
6
|
+
author?: string;
|
|
7
|
+
from?: string;
|
|
8
|
+
to?: string;
|
|
4
9
|
limit?: string;
|
|
5
10
|
}
|
|
6
11
|
export interface ActivityEntry extends HistoryEntry {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { getActiveExtensionRegistrations, runActiveOnReadHooks } from "../../core/extensions/index.js";
|
|
3
4
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
|
-
import {
|
|
5
|
+
import { enforceHistoryStreamPolicyForItems } from "../../core/history/history-stream-policy.js";
|
|
6
|
+
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
5
7
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
6
8
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
9
|
+
import { compareTimestampStrings, nowIso, resolveIsoOrRelative } from "../../core/shared/time.js";
|
|
10
|
+
import { listAllFrontMatter } from "../../core/store/item-store.js";
|
|
7
11
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
8
12
|
import { readSettings } from "../../core/store/settings.js";
|
|
9
13
|
import { readHistoryEntries } from "./history.js";
|
|
@@ -16,6 +20,33 @@ function parseLimit(raw) {
|
|
|
16
20
|
}
|
|
17
21
|
return Math.floor(parsed);
|
|
18
22
|
}
|
|
23
|
+
function parseNonEmptyFilter(raw, flagLabel) {
|
|
24
|
+
if (raw === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const normalized = raw.trim();
|
|
27
|
+
if (normalized.length === 0) {
|
|
28
|
+
throw new PmCliError(`${flagLabel} must not be empty`, EXIT_CODE.USAGE);
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
function parseRangeBound(raw, nowValue, fieldLabel) {
|
|
33
|
+
if (raw === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
const normalized = raw.trim();
|
|
36
|
+
if (normalized.length === 0) {
|
|
37
|
+
throw new PmCliError("Activity time bounds must not be empty", EXIT_CODE.USAGE);
|
|
38
|
+
}
|
|
39
|
+
return resolveIsoOrRelative(normalized, new Date(nowValue), fieldLabel);
|
|
40
|
+
}
|
|
41
|
+
function includeByTimeWindow(entry, from, to) {
|
|
42
|
+
if (from && compareTimestampStrings(entry.ts, from) < 0) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (to && compareTimestampStrings(entry.ts, to) >= 0) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
19
50
|
function limitEntries(values, limit) {
|
|
20
51
|
if (limit === undefined)
|
|
21
52
|
return values;
|
|
@@ -51,8 +82,25 @@ export async function runActivity(options, global) {
|
|
|
51
82
|
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
52
83
|
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
53
84
|
}
|
|
85
|
+
const nowValue = nowIso();
|
|
86
|
+
const idFilter = parseNonEmptyFilter(options.id, "Activity --id");
|
|
87
|
+
const opFilter = parseNonEmptyFilter(options.op, "Activity --op");
|
|
88
|
+
const authorFilter = parseNonEmptyFilter(options.author, "Activity --author");
|
|
89
|
+
const fromBound = parseRangeBound(options.from, nowValue, "--from");
|
|
90
|
+
const toBound = parseRangeBound(options.to, nowValue, "--to");
|
|
91
|
+
if (fromBound && toBound && compareTimestampStrings(fromBound, toBound) >= 0) {
|
|
92
|
+
throw new PmCliError("Activity --from must be before --to", EXIT_CODE.USAGE);
|
|
93
|
+
}
|
|
54
94
|
const limit = parseLimit(options.limit);
|
|
55
|
-
await readSettings(pmRoot);
|
|
95
|
+
const settings = await readSettings(pmRoot);
|
|
96
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
97
|
+
const items = await listAllFrontMatter(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);
|
|
98
|
+
await enforceHistoryStreamPolicyForItems({
|
|
99
|
+
pmRoot,
|
|
100
|
+
settings,
|
|
101
|
+
itemIds: items.map((item) => item.id),
|
|
102
|
+
commandLabel: "activity",
|
|
103
|
+
});
|
|
56
104
|
const historyDir = path.join(pmRoot, "history");
|
|
57
105
|
await runActiveOnReadHooks({
|
|
58
106
|
path: historyDir,
|
|
@@ -62,11 +110,26 @@ export async function runActivity(options, global) {
|
|
|
62
110
|
const combined = [];
|
|
63
111
|
for (const file of historyFiles) {
|
|
64
112
|
const id = file.slice(0, -".jsonl".length);
|
|
113
|
+
if (idFilter && id !== idFilter) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
65
116
|
const entries = await readHistoryEntries(path.join(historyDir, file), id);
|
|
66
117
|
for (const entry of entries) {
|
|
67
|
-
|
|
118
|
+
if (opFilter && entry.op !== opFilter) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (authorFilter && entry.author !== authorFilter) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const candidate = {
|
|
68
125
|
id,
|
|
69
126
|
...entry,
|
|
127
|
+
};
|
|
128
|
+
if (!includeByTimeWindow(candidate, fromBound, toBound)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
combined.push({
|
|
132
|
+
...candidate,
|
|
70
133
|
});
|
|
71
134
|
}
|
|
72
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/cli/commands/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/cli/commands/activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import { type ItemStatus } from "../../types/index.js";
|
|
3
|
+
type AggregateGroupField = "parent" | "type" | "priority" | "status" | "assignee" | "tags" | "sprint" | "release";
|
|
4
|
+
type AggregateGroupValue = string | number | null;
|
|
5
|
+
type AggregateGroupRecord = Partial<Record<AggregateGroupField, AggregateGroupValue>>;
|
|
6
|
+
export interface AggregateOptions {
|
|
7
|
+
groupBy?: string;
|
|
8
|
+
count?: boolean;
|
|
9
|
+
includeUnparented?: boolean;
|
|
10
|
+
status?: string;
|
|
11
|
+
type?: string;
|
|
12
|
+
tag?: string;
|
|
13
|
+
priority?: string;
|
|
14
|
+
deadlineBefore?: string;
|
|
15
|
+
deadlineAfter?: string;
|
|
16
|
+
assignee?: string;
|
|
17
|
+
assigneeFilter?: string;
|
|
18
|
+
parent?: string;
|
|
19
|
+
sprint?: string;
|
|
20
|
+
release?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AggregateRow {
|
|
23
|
+
group: AggregateGroupRecord;
|
|
24
|
+
count: number;
|
|
25
|
+
}
|
|
26
|
+
export interface AggregateResult {
|
|
27
|
+
groups: AggregateRow[];
|
|
28
|
+
count: number;
|
|
29
|
+
totals: {
|
|
30
|
+
items_considered: number;
|
|
31
|
+
items_grouped: number;
|
|
32
|
+
items_skipped_unparented: number;
|
|
33
|
+
};
|
|
34
|
+
filters: {
|
|
35
|
+
group_by: AggregateGroupField[];
|
|
36
|
+
count: boolean;
|
|
37
|
+
include_unparented: boolean;
|
|
38
|
+
status: ItemStatus | null;
|
|
39
|
+
type: string | null;
|
|
40
|
+
tag: string | null;
|
|
41
|
+
priority: string | null;
|
|
42
|
+
deadline_before: string | null;
|
|
43
|
+
deadline_after: string | null;
|
|
44
|
+
assignee: string | null;
|
|
45
|
+
assignee_filter: string | null;
|
|
46
|
+
parent: string | null;
|
|
47
|
+
sprint: string | null;
|
|
48
|
+
release: string | null;
|
|
49
|
+
};
|
|
50
|
+
now: string;
|
|
51
|
+
warnings?: string[];
|
|
52
|
+
}
|
|
53
|
+
export declare function runAggregate(options: AggregateOptions, global: GlobalOptions): Promise<AggregateResult>;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
2
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
3
|
+
import { nowIso } from "../../core/shared/time.js";
|
|
4
|
+
import { normalizeStatusInput } from "../../core/item/status.js";
|
|
5
|
+
import { resolveRuntimeStatusRegistry } from "../../core/schema/runtime-schema.js";
|
|
6
|
+
import { resolvePmRoot } from "../../core/store/paths.js";
|
|
7
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
8
|
+
import { runList } from "./list.js";
|
|
9
|
+
const AGGREGATE_GROUP_FIELDS = [
|
|
10
|
+
"parent",
|
|
11
|
+
"type",
|
|
12
|
+
"priority",
|
|
13
|
+
"status",
|
|
14
|
+
"assignee",
|
|
15
|
+
"tags",
|
|
16
|
+
"sprint",
|
|
17
|
+
"release",
|
|
18
|
+
];
|
|
19
|
+
function parseStatus(raw, statusRegistry) {
|
|
20
|
+
if (raw === undefined) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const normalized = normalizeStatusInput(raw, statusRegistry);
|
|
24
|
+
if (!normalized) {
|
|
25
|
+
throw new PmCliError(`Status filter must be one of ${statusRegistry.definitions.map((definition) => definition.id).join("|")}`, EXIT_CODE.USAGE);
|
|
26
|
+
}
|
|
27
|
+
return normalized;
|
|
28
|
+
}
|
|
29
|
+
function parseGroupBy(raw) {
|
|
30
|
+
const value = raw?.trim() ?? "parent,type";
|
|
31
|
+
if (value.length === 0) {
|
|
32
|
+
throw new PmCliError("--group-by requires at least one field name", EXIT_CODE.USAGE);
|
|
33
|
+
}
|
|
34
|
+
const requested = [...new Set(value.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0))];
|
|
35
|
+
if (requested.length === 0) {
|
|
36
|
+
throw new PmCliError("--group-by requires a comma-separated list of fields", EXIT_CODE.USAGE);
|
|
37
|
+
}
|
|
38
|
+
for (const field of requested) {
|
|
39
|
+
if (!AGGREGATE_GROUP_FIELDS.includes(field)) {
|
|
40
|
+
throw new PmCliError(`Aggregate group fields must be one of ${AGGREGATE_GROUP_FIELDS.join("|")}; received "${field}"`, EXIT_CODE.USAGE);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return requested;
|
|
44
|
+
}
|
|
45
|
+
function normalizeTagGroupValue(tags) {
|
|
46
|
+
const normalized = [...new Set(tags.map((tag) => tag.trim().toLowerCase()).filter((tag) => tag.length > 0))].sort((left, right) => left.localeCompare(right));
|
|
47
|
+
if (normalized.length === 0) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return normalized.join(",");
|
|
51
|
+
}
|
|
52
|
+
function resolveGroupValue(field, item) {
|
|
53
|
+
switch (field) {
|
|
54
|
+
case "parent":
|
|
55
|
+
return item.parent ?? null;
|
|
56
|
+
case "type":
|
|
57
|
+
return item.type;
|
|
58
|
+
case "priority":
|
|
59
|
+
return item.priority;
|
|
60
|
+
case "status":
|
|
61
|
+
return item.status;
|
|
62
|
+
case "assignee":
|
|
63
|
+
return item.assignee ?? null;
|
|
64
|
+
case "tags":
|
|
65
|
+
return normalizeTagGroupValue(item.tags);
|
|
66
|
+
case "sprint":
|
|
67
|
+
return item.sprint ?? null;
|
|
68
|
+
case "release":
|
|
69
|
+
return item.release ?? null;
|
|
70
|
+
default:
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function compareNullableGroupValue(left, right) {
|
|
75
|
+
const leftValue = left ?? null;
|
|
76
|
+
const rightValue = right ?? null;
|
|
77
|
+
if (leftValue === rightValue) {
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
if (leftValue === null) {
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
if (rightValue === null) {
|
|
84
|
+
return -1;
|
|
85
|
+
}
|
|
86
|
+
if (typeof leftValue === "number" && typeof rightValue === "number") {
|
|
87
|
+
return leftValue - rightValue;
|
|
88
|
+
}
|
|
89
|
+
return String(leftValue).localeCompare(String(rightValue));
|
|
90
|
+
}
|
|
91
|
+
function buildGroupKey(groupBy, group) {
|
|
92
|
+
return groupBy.map((field) => `${field}:${JSON.stringify(group[field] ?? null)}`).join("|");
|
|
93
|
+
}
|
|
94
|
+
function compareAggregateRows(left, right, groupBy) {
|
|
95
|
+
for (const field of groupBy) {
|
|
96
|
+
const byField = compareNullableGroupValue(left.group[field], right.group[field]);
|
|
97
|
+
if (byField !== 0) {
|
|
98
|
+
return byField;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
export async function runAggregate(options, global) {
|
|
104
|
+
if (options.count === false) {
|
|
105
|
+
throw new PmCliError("Aggregate currently supports grouped counts only. Pass --count.", EXIT_CODE.USAGE);
|
|
106
|
+
}
|
|
107
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
108
|
+
const settings = await readSettings(pmRoot);
|
|
109
|
+
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
110
|
+
const groupBy = parseGroupBy(options.groupBy);
|
|
111
|
+
const status = parseStatus(options.status, statusRegistry);
|
|
112
|
+
const includeUnparented = options.includeUnparented === true;
|
|
113
|
+
const listed = await runList(status, {
|
|
114
|
+
type: options.type,
|
|
115
|
+
tag: options.tag,
|
|
116
|
+
priority: options.priority,
|
|
117
|
+
deadlineBefore: options.deadlineBefore,
|
|
118
|
+
deadlineAfter: options.deadlineAfter,
|
|
119
|
+
assignee: options.assignee,
|
|
120
|
+
assigneeFilter: options.assigneeFilter,
|
|
121
|
+
parent: options.parent,
|
|
122
|
+
sprint: options.sprint,
|
|
123
|
+
release: options.release,
|
|
124
|
+
}, global);
|
|
125
|
+
const grouped = new Map();
|
|
126
|
+
let skippedUnparented = 0;
|
|
127
|
+
let groupedItemCount = 0;
|
|
128
|
+
for (const listedItem of listed.items) {
|
|
129
|
+
const item = listedItem;
|
|
130
|
+
const group = {};
|
|
131
|
+
for (const field of groupBy) {
|
|
132
|
+
group[field] = resolveGroupValue(field, item);
|
|
133
|
+
}
|
|
134
|
+
if (groupBy.includes("parent") && group.parent === null && !includeUnparented) {
|
|
135
|
+
skippedUnparented += 1;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const key = buildGroupKey(groupBy, group);
|
|
139
|
+
const existing = grouped.get(key);
|
|
140
|
+
if (existing) {
|
|
141
|
+
existing.count += 1;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
grouped.set(key, {
|
|
145
|
+
group,
|
|
146
|
+
count: 1,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
groupedItemCount += 1;
|
|
150
|
+
}
|
|
151
|
+
const groups = [...grouped.values()].sort((left, right) => compareAggregateRows(left, right, groupBy));
|
|
152
|
+
const warnings = listed.warnings && listed.warnings.length > 0 ? listed.warnings : undefined;
|
|
153
|
+
return {
|
|
154
|
+
groups,
|
|
155
|
+
count: groups.length,
|
|
156
|
+
totals: {
|
|
157
|
+
items_considered: listed.items.length,
|
|
158
|
+
items_grouped: groupedItemCount,
|
|
159
|
+
items_skipped_unparented: skippedUnparented,
|
|
160
|
+
},
|
|
161
|
+
filters: {
|
|
162
|
+
group_by: groupBy,
|
|
163
|
+
count: true,
|
|
164
|
+
include_unparented: includeUnparented,
|
|
165
|
+
status: status ?? null,
|
|
166
|
+
type: options.type ?? null,
|
|
167
|
+
tag: options.tag ?? null,
|
|
168
|
+
priority: options.priority ?? null,
|
|
169
|
+
deadline_before: options.deadlineBefore ?? null,
|
|
170
|
+
deadline_after: options.deadlineAfter ?? null,
|
|
171
|
+
assignee: options.assignee ?? null,
|
|
172
|
+
assignee_filter: options.assigneeFilter ?? null,
|
|
173
|
+
parent: options.parent ?? null,
|
|
174
|
+
sprint: options.sprint ?? null,
|
|
175
|
+
release: options.release ?? null,
|
|
176
|
+
},
|
|
177
|
+
now: nowIso(),
|
|
178
|
+
...(warnings ? { warnings } : {}),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/cli/commands/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
2
2
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
3
3
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
4
|
+
import { createStdinTokenResolver } from "../../core/item/parse.js";
|
|
4
5
|
import { mutateItem } from "../../core/store/item-store.js";
|
|
5
6
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
6
7
|
import { readSettings } from "../../core/store/settings.js";
|
|
@@ -13,13 +14,15 @@ export async function runAppend(id, options, global) {
|
|
|
13
14
|
if (options.body === undefined) {
|
|
14
15
|
throw new PmCliError("Missing required --body text", EXIT_CODE.USAGE);
|
|
15
16
|
}
|
|
17
|
+
const stdinResolver = createStdinTokenResolver();
|
|
16
18
|
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
17
19
|
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
18
20
|
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
19
21
|
}
|
|
20
22
|
const settings = await readSettings(pmRoot);
|
|
21
23
|
const author = resolveAuthor(options.author, settings.author_default);
|
|
22
|
-
const
|
|
24
|
+
const bodyInput = await stdinResolver.resolveValue(options.body, "--body");
|
|
25
|
+
const appended = (bodyInput ?? "").trim();
|
|
23
26
|
const result = await mutateItem({
|
|
24
27
|
pmRoot,
|
|
25
28
|
settings,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append.js","sourceRoot":"","sources":["../../../src/cli/commands/append.ts"],"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,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAe5D,SAAS,aAAa,CAAC,SAA6B,EAAE,aAAqB;IACzE,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,aAAa,CAAC;IACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,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,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,
|
|
1
|
+
{"version":3,"file":"append.js","sourceRoot":"","sources":["../../../src/cli/commands/append.ts"],"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,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;AAe5D,SAAS,aAAa,CAAC,SAA6B,EAAE,aAAqB;IACzE,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,aAAa,CAAC;IACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import type { ItemStatus, ItemType } from "../../types/index.js";
|
|
3
|
+
export declare const CALENDAR_VIEW_VALUES: readonly ["agenda", "day", "week", "month"];
|
|
4
|
+
export type CalendarView = (typeof CALENDAR_VIEW_VALUES)[number];
|
|
5
|
+
export declare const CALENDAR_OUTPUT_VALUES: readonly ["markdown", "toon", "json"];
|
|
6
|
+
export type CalendarOutputFormat = (typeof CALENDAR_OUTPUT_VALUES)[number];
|
|
7
|
+
export interface CalendarOptions {
|
|
8
|
+
view?: string;
|
|
9
|
+
date?: string;
|
|
10
|
+
from?: string;
|
|
11
|
+
to?: string;
|
|
12
|
+
past?: boolean;
|
|
13
|
+
fullPeriod?: boolean;
|
|
14
|
+
limit?: string;
|
|
15
|
+
type?: string;
|
|
16
|
+
tag?: string;
|
|
17
|
+
priority?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
assignee?: string;
|
|
20
|
+
assigneeFilter?: string;
|
|
21
|
+
sprint?: string;
|
|
22
|
+
release?: string;
|
|
23
|
+
include?: string;
|
|
24
|
+
recurrenceLookaheadDays?: string;
|
|
25
|
+
recurrenceLookbackDays?: string;
|
|
26
|
+
occurrenceLimit?: string;
|
|
27
|
+
format?: string;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
export interface CalendarRow {
|
|
31
|
+
at: string;
|
|
32
|
+
date: string;
|
|
33
|
+
kind: "deadline" | "reminder" | "event";
|
|
34
|
+
reminder_text: string | null;
|
|
35
|
+
event_title: string | null;
|
|
36
|
+
event_end: string | null;
|
|
37
|
+
event_location: string | null;
|
|
38
|
+
event_all_day: boolean | null;
|
|
39
|
+
event_timezone: string | null;
|
|
40
|
+
event_recurring: boolean | null;
|
|
41
|
+
event_recurrence_rule: string | null;
|
|
42
|
+
item_id: string;
|
|
43
|
+
item_title: string;
|
|
44
|
+
item_type: ItemType;
|
|
45
|
+
item_status: ItemStatus;
|
|
46
|
+
item_priority: number;
|
|
47
|
+
item_assignee: string | null;
|
|
48
|
+
item_deadline: string | null;
|
|
49
|
+
item_tags: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface CalendarDayBucket {
|
|
52
|
+
date: string;
|
|
53
|
+
count: number;
|
|
54
|
+
events: CalendarRow[];
|
|
55
|
+
}
|
|
56
|
+
export interface CalendarResult {
|
|
57
|
+
view: CalendarView;
|
|
58
|
+
output_default: "markdown";
|
|
59
|
+
now: string;
|
|
60
|
+
anchor: string;
|
|
61
|
+
range: {
|
|
62
|
+
start: string | null;
|
|
63
|
+
end: string | null;
|
|
64
|
+
period_start: string | null;
|
|
65
|
+
period_end: string | null;
|
|
66
|
+
full_period: boolean;
|
|
67
|
+
past: boolean;
|
|
68
|
+
from: string | null;
|
|
69
|
+
to: string | null;
|
|
70
|
+
};
|
|
71
|
+
filters: {
|
|
72
|
+
type: string | null;
|
|
73
|
+
tag: string | null;
|
|
74
|
+
priority: string | null;
|
|
75
|
+
status: string | null;
|
|
76
|
+
assignee: string | null;
|
|
77
|
+
assignee_filter: string | null;
|
|
78
|
+
sprint: string | null;
|
|
79
|
+
release: string | null;
|
|
80
|
+
runtime_filters?: Record<string, unknown>;
|
|
81
|
+
limit: string | null;
|
|
82
|
+
include: string | null;
|
|
83
|
+
full_period: string | null;
|
|
84
|
+
recurrence_lookahead_days: string | null;
|
|
85
|
+
recurrence_lookback_days: string | null;
|
|
86
|
+
occurrence_limit: string | null;
|
|
87
|
+
};
|
|
88
|
+
summary: {
|
|
89
|
+
events: number;
|
|
90
|
+
items: number;
|
|
91
|
+
deadlines: number;
|
|
92
|
+
reminders: number;
|
|
93
|
+
scheduled: number;
|
|
94
|
+
by_kind: {
|
|
95
|
+
deadline: number;
|
|
96
|
+
reminder: number;
|
|
97
|
+
event: number;
|
|
98
|
+
};
|
|
99
|
+
by_type: Record<string, number>;
|
|
100
|
+
by_status: Record<string, number>;
|
|
101
|
+
recurring_events: number;
|
|
102
|
+
};
|
|
103
|
+
events: CalendarRow[];
|
|
104
|
+
days: CalendarDayBucket[];
|
|
105
|
+
warnings?: string[];
|
|
106
|
+
}
|
|
107
|
+
export declare function resolveCalendarOutputFormat(options: CalendarOptions, global: GlobalOptions): CalendarOutputFormat;
|
|
108
|
+
export declare function renderCalendarMarkdown(result: CalendarResult): string;
|
|
109
|
+
export declare function runCalendar(options: CalendarOptions, global: GlobalOptions): Promise<CalendarResult>;
|