@entelligentsia/forgecli 1.0.21 → 1.0.25
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 +88 -0
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
- package/dist/extensions/forgecli/forge-tools.js +73 -0
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
- package/dist/extensions/forgecli/lib/forge-root.js +14 -1
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +8 -3
- package/dist/forge-payload/.schemas/migrations.json +56 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +8 -3
- package/dist/forge-payload/schemas/structure-manifest.json +4 -2
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/node_modules/@mariozechner/clipboard/package.json +2 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
- package/package.json +2 -2
- package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
- package/dist/extensions/forgecli/add-pipeline.js +0 -143
- package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
- package/dist/extensions/forgecli/add-task.d.ts +0 -20
- package/dist/extensions/forgecli/add-task.js +0 -154
- package/dist/extensions/forgecli/add-task.js.map +0 -1
- package/dist/extensions/forgecli/approve.d.ts +0 -22
- package/dist/extensions/forgecli/approve.js +0 -152
- package/dist/extensions/forgecli/approve.js.map +0 -1
- package/dist/extensions/forgecli/banner.d.ts +0 -10
- package/dist/extensions/forgecli/banner.js +0 -36
- package/dist/extensions/forgecli/banner.js.map +0 -1
- package/dist/extensions/forgecli/calibrate.d.ts +0 -64
- package/dist/extensions/forgecli/calibrate.js +0 -481
- package/dist/extensions/forgecli/calibrate.js.map +0 -1
- package/dist/extensions/forgecli/collate.d.ts +0 -22
- package/dist/extensions/forgecli/collate.js +0 -134
- package/dist/extensions/forgecli/collate.js.map +0 -1
- package/dist/extensions/forgecli/commit.d.ts +0 -22
- package/dist/extensions/forgecli/commit.js +0 -152
- package/dist/extensions/forgecli/commit.js.map +0 -1
- package/dist/extensions/forgecli/config-command.d.ts +0 -8
- package/dist/extensions/forgecli/config-command.js +0 -67
- package/dist/extensions/forgecli/config-command.js.map +0 -1
- package/dist/extensions/forgecli/config-layer.d.ts +0 -53
- package/dist/extensions/forgecli/config-layer.js +0 -72
- package/dist/extensions/forgecli/config-layer.js.map +0 -1
- package/dist/extensions/forgecli/config-writer.d.ts +0 -16
- package/dist/extensions/forgecli/config-writer.js +0 -69
- package/dist/extensions/forgecli/config-writer.js.map +0 -1
- package/dist/extensions/forgecli/enhance.d.ts +0 -27
- package/dist/extensions/forgecli/enhance.js +0 -199
- package/dist/extensions/forgecli/enhance.js.map +0 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
- package/dist/extensions/forgecli/fix-bug.js +0 -1580
- package/dist/extensions/forgecli/fix-bug.js.map +0 -1
- package/dist/extensions/forgecli/forge-header.d.ts +0 -12
- package/dist/extensions/forgecli/forge-header.js +0 -114
- package/dist/extensions/forgecli/forge-header.js.map +0 -1
- package/dist/extensions/forgecli/forge-init.d.ts +0 -26
- package/dist/extensions/forgecli/forge-init.js +0 -514
- package/dist/extensions/forgecli/forge-init.js.map +0 -1
- package/dist/extensions/forgecli/forge-root.d.ts +0 -10
- package/dist/extensions/forgecli/forge-root.js +0 -62
- package/dist/extensions/forgecli/forge-root.js.map +0 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
- package/dist/extensions/forgecli/forge-update-command.js +0 -435
- package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
- package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
- package/dist/extensions/forgecli/friction-emit.js +0 -245
- package/dist/extensions/forgecli/friction-emit.js.map +0 -1
- package/dist/extensions/forgecli/implement.d.ts +0 -22
- package/dist/extensions/forgecli/implement.js +0 -170
- package/dist/extensions/forgecli/implement.js.map +0 -1
- package/dist/extensions/forgecli/init-context.d.ts +0 -99
- package/dist/extensions/forgecli/init-context.js +0 -178
- package/dist/extensions/forgecli/init-context.js.map +0 -1
- package/dist/extensions/forgecli/init-progress.d.ts +0 -39
- package/dist/extensions/forgecli/init-progress.js +0 -117
- package/dist/extensions/forgecli/init-progress.js.map +0 -1
- package/dist/extensions/forgecli/input-router.d.ts +0 -33
- package/dist/extensions/forgecli/input-router.js +0 -136
- package/dist/extensions/forgecli/input-router.js.map +0 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
- package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
- package/dist/extensions/forgecli/materialize.d.ts +0 -16
- package/dist/extensions/forgecli/materialize.js +0 -195
- package/dist/extensions/forgecli/materialize.js.map +0 -1
- package/dist/extensions/forgecli/migrate.d.ts +0 -22
- package/dist/extensions/forgecli/migrate.js +0 -260
- package/dist/extensions/forgecli/migrate.js.map +0 -1
- package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
- package/dist/extensions/forgecli/migration-engine.js +0 -563
- package/dist/extensions/forgecli/migration-engine.js.map +0 -1
- package/dist/extensions/forgecli/model-registry.d.ts +0 -61
- package/dist/extensions/forgecli/model-registry.js +0 -127
- package/dist/extensions/forgecli/model-registry.js.map +0 -1
- package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
- package/dist/extensions/forgecli/model-resolver.js +0 -65
- package/dist/extensions/forgecli/model-resolver.js.map +0 -1
- package/dist/extensions/forgecli/model-validator.d.ts +0 -29
- package/dist/extensions/forgecli/model-validator.js +0 -107
- package/dist/extensions/forgecli/model-validator.js.map +0 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
- package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
- package/dist/extensions/forgecli/plan.d.ts +0 -22
- package/dist/extensions/forgecli/plan.js +0 -167
- package/dist/extensions/forgecli/plan.js.map +0 -1
- package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
- package/dist/extensions/forgecli/quiz-agent.js +0 -98
- package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
- package/dist/extensions/forgecli/read-command.d.ts +0 -2
- package/dist/extensions/forgecli/read-command.js +0 -100
- package/dist/extensions/forgecli/read-command.js.map +0 -1
- package/dist/extensions/forgecli/regenerate.d.ts +0 -40
- package/dist/extensions/forgecli/regenerate.js +0 -438
- package/dist/extensions/forgecli/regenerate.js.map +0 -1
- package/dist/extensions/forgecli/remove-command.d.ts +0 -17
- package/dist/extensions/forgecli/remove-command.js +0 -124
- package/dist/extensions/forgecli/remove-command.js.map +0 -1
- package/dist/extensions/forgecli/report-bug.d.ts +0 -25
- package/dist/extensions/forgecli/report-bug.js +0 -159
- package/dist/extensions/forgecli/report-bug.js.map +0 -1
- package/dist/extensions/forgecli/retrospective.d.ts +0 -20
- package/dist/extensions/forgecli/retrospective.js +0 -126
- package/dist/extensions/forgecli/retrospective.js.map +0 -1
- package/dist/extensions/forgecli/review-code.d.ts +0 -35
- package/dist/extensions/forgecli/review-code.js +0 -196
- package/dist/extensions/forgecli/review-code.js.map +0 -1
- package/dist/extensions/forgecli/review-plan.d.ts +0 -35
- package/dist/extensions/forgecli/review-plan.js +0 -200
- package/dist/extensions/forgecli/review-plan.js.map +0 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
- package/dist/extensions/forgecli/run-sprint.js +0 -716
- package/dist/extensions/forgecli/run-sprint.js.map +0 -1
- package/dist/extensions/forgecli/run-task.d.ts +0 -204
- package/dist/extensions/forgecli/run-task.js +0 -1403
- package/dist/extensions/forgecli/run-task.js.map +0 -1
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
- package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
- package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
- package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
- package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
- package/dist/extensions/forgecli/skill-retriever.js +0 -246
- package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
- package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
- package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
- package/dist/extensions/forgecli/sprint-intake.js +0 -91
- package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
- package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
- package/dist/extensions/forgecli/sprint-plan.js +0 -122
- package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
- package/dist/extensions/forgecli/status-command.d.ts +0 -19
- package/dist/extensions/forgecli/status-command.js +0 -140
- package/dist/extensions/forgecli/status-command.js.map +0 -1
- package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
- package/dist/extensions/forgecli/store-error-remediation.js +0 -307
- package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
- package/dist/extensions/forgecli/store-query.d.ts +0 -22
- package/dist/extensions/forgecli/store-query.js +0 -107
- package/dist/extensions/forgecli/store-query.js.map +0 -1
- package/dist/extensions/forgecli/store-repair.d.ts +0 -17
- package/dist/extensions/forgecli/store-repair.js +0 -123
- package/dist/extensions/forgecli/store-repair.js.map +0 -1
- package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
- package/dist/extensions/forgecli/store-resolver.js +0 -263
- package/dist/extensions/forgecli/store-resolver.js.map +0 -1
- package/dist/extensions/forgecli/store-validator.d.ts +0 -16
- package/dist/extensions/forgecli/store-validator.js +0 -32
- package/dist/extensions/forgecli/store-validator.js.map +0 -1
- package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
- package/dist/extensions/forgecli/test-orchestrate.js +0 -182
- package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
- package/dist/extensions/forgecli/thread-switcher.js +0 -189
- package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
- package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
- package/dist/extensions/forgecli/transition-guard.js +0 -89
- package/dist/extensions/forgecli/transition-guard.js.map +0 -1
- package/dist/extensions/forgecli/update-check.d.ts +0 -37
- package/dist/extensions/forgecli/update-check.js +0 -185
- package/dist/extensions/forgecli/update-check.js.map +0 -1
- package/dist/extensions/forgecli/update-tools.d.ts +0 -23
- package/dist/extensions/forgecli/update-tools.js +0 -135
- package/dist/extensions/forgecli/update-tools.js.map +0 -1
- package/dist/extensions/forgecli/validate.d.ts +0 -22
- package/dist/extensions/forgecli/validate.js +0 -152
- package/dist/extensions/forgecli/validate.js.map +0 -1
- package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
- package/dist/extensions/forgecli/viewport-events.js +0 -243
- package/dist/extensions/forgecli/viewport-events.js.map +0 -1
- package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
- package/dist/extensions/forgecli/viewport-renderer.js +0 -233
- package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
- package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
- package/dist/extensions/forgecli/viewport-theme.js +0 -128
- package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
- package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
- package/dist/extensions/forgecli/whats-new-widget.js +0 -376
- package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
- package/dist/extensions/forgecli/whats-new.d.ts +0 -120
- package/dist/extensions/forgecli/whats-new.js +0 -470
- package/dist/extensions/forgecli/whats-new.js.map +0 -1
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
export type ComponentId = "pi" | "forge-plugin" | "forge-cli";
|
|
2
|
-
export interface SeenState {
|
|
3
|
-
pi: string | null;
|
|
4
|
-
forgePlugin: string | null;
|
|
5
|
-
forgeCli: string | null;
|
|
6
|
-
prevPi: string | null;
|
|
7
|
-
prevForgePlugin: string | null;
|
|
8
|
-
prevForgeCli: string | null;
|
|
9
|
-
lastShownFromPi: string | null;
|
|
10
|
-
lastShownFromForgePlugin: string | null;
|
|
11
|
-
lastShownFromForgeCli: string | null;
|
|
12
|
-
lastShownAt: number;
|
|
13
|
-
}
|
|
14
|
-
export interface ChangelogEntry {
|
|
15
|
-
version: string;
|
|
16
|
-
date: string | null;
|
|
17
|
-
sections: {
|
|
18
|
-
name: string;
|
|
19
|
-
bullets: string[];
|
|
20
|
-
}[];
|
|
21
|
-
rawBody: string;
|
|
22
|
-
}
|
|
23
|
-
export interface ChangeSummary {
|
|
24
|
-
component: ComponentId;
|
|
25
|
-
label: string;
|
|
26
|
-
fromVersion: string | null;
|
|
27
|
-
toVersion: string;
|
|
28
|
-
totalChanges: number;
|
|
29
|
-
byCategory: Map<string, number>;
|
|
30
|
-
entries: ChangelogEntry[];
|
|
31
|
-
}
|
|
32
|
-
declare function defaultCacheDir(): string;
|
|
33
|
-
declare function cachePath(cacheDir: string): string;
|
|
34
|
-
export declare function emptySeenState(): SeenState;
|
|
35
|
-
export declare function readSeenState(cacheDir: string): Promise<SeenState>;
|
|
36
|
-
export declare function writeSeenState(cacheDir: string, state: SeenState): Promise<void>;
|
|
37
|
-
export declare function semverGt(a: string, b: string): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Parse a Keep-a-Changelog–style markdown body into per-version entries.
|
|
40
|
-
* Tolerates pi's `### New Features` overview sections (which precede the
|
|
41
|
-
* standard `### Added`/`### Fixed` sections) and the `[Unreleased]` block.
|
|
42
|
-
*/
|
|
43
|
-
export declare function parseChangelog(markdown: string): ChangelogEntry[];
|
|
44
|
-
/**
|
|
45
|
-
* Reduce a list of changelog entries down to the ones strictly newer than
|
|
46
|
-
* `from`, up to and including `to`. When `from` is null, returns only the
|
|
47
|
-
* `to` entry (first-install case — don't dump the whole history).
|
|
48
|
-
*/
|
|
49
|
-
export declare function entriesBetween(entries: ChangelogEntry[], from: string | null, to: string): ChangelogEntry[];
|
|
50
|
-
declare function normalizeCategory(name: string): string;
|
|
51
|
-
export declare function summarizeEntries(entries: ChangelogEntry[]): {
|
|
52
|
-
total: number;
|
|
53
|
-
byCategory: Map<string, number>;
|
|
54
|
-
};
|
|
55
|
-
export interface ChangelogSources {
|
|
56
|
-
pi: string | null;
|
|
57
|
-
forgePlugin: string | null;
|
|
58
|
-
forgeCli: string | null;
|
|
59
|
-
}
|
|
60
|
-
export declare function resolveChangelogPaths(pkgRoot: string): ChangelogSources;
|
|
61
|
-
export interface CurrentVersions {
|
|
62
|
-
pi: string;
|
|
63
|
-
forgePlugin: string;
|
|
64
|
-
forgeCli: string;
|
|
65
|
-
}
|
|
66
|
-
export type Baseline = "seen" | "prev" | "lastShown";
|
|
67
|
-
export interface ComputeOptions {
|
|
68
|
-
sources: ChangelogSources;
|
|
69
|
-
current: CurrentVersions;
|
|
70
|
-
seen: SeenState;
|
|
71
|
-
/** Which baseline to diff `current` against:
|
|
72
|
-
* - "seen" (default): auto-dismiss check at session_start.
|
|
73
|
-
* - "prev": /whats-new replay after auto-dismiss.
|
|
74
|
-
* - "lastShown": /whats-new replay after explicit dismiss — uses the
|
|
75
|
-
* `from` versions frozen at the most recent panel-mount so the
|
|
76
|
-
* last-shown set remains viewable forever.
|
|
77
|
-
*/
|
|
78
|
-
baseline?: Baseline;
|
|
79
|
-
}
|
|
80
|
-
export declare function computeSummaries(opts: ComputeOptions): ChangeSummary[];
|
|
81
|
-
declare function formatVersionRange(from: string | null, to: string): string;
|
|
82
|
-
declare function formatCategoryBreakdown(byCategory: Map<string, number>): string;
|
|
83
|
-
export declare function renderSummaryPanel(summaries: ChangeSummary[]): string;
|
|
84
|
-
export declare function renderComponentDetail(summary: ChangeSummary): string;
|
|
85
|
-
export interface WhatsNewRuntime {
|
|
86
|
-
pkgRoot: string;
|
|
87
|
-
current: CurrentVersions;
|
|
88
|
-
cacheDir?: string;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Compute the startup summary and, when present, update the seen state
|
|
92
|
-
* so subsequent sessions don't replay. Returns the rendered string (or
|
|
93
|
-
* null when there's nothing to show).
|
|
94
|
-
*
|
|
95
|
-
* The `prev*` fields in the seen state preserve the prior baseline so
|
|
96
|
-
* /whats-new can re-render until the user explicitly dismisses.
|
|
97
|
-
*/
|
|
98
|
-
export declare function computeAndPersistStartupPanel(rt: WhatsNewRuntime): Promise<{
|
|
99
|
-
rendered: string;
|
|
100
|
-
summaries: ChangeSummary[];
|
|
101
|
-
} | null>;
|
|
102
|
-
/**
|
|
103
|
-
* Re-compute summaries against the `prev*` baseline (so users can replay
|
|
104
|
-
* the panel after auto-dismiss). When `componentArg` matches one of the
|
|
105
|
-
* three component IDs, returns that component's full detail view instead.
|
|
106
|
-
*/
|
|
107
|
-
export declare function computeWhatsNewView(rt: WhatsNewRuntime, componentArg: string | null): Promise<string>;
|
|
108
|
-
/**
|
|
109
|
-
* Clear the `prev*` baseline so /whats-new stops replaying past changes.
|
|
110
|
-
* Current `seen` values are left untouched.
|
|
111
|
-
*/
|
|
112
|
-
export declare function dismissWhatsNew(rt: WhatsNewRuntime): Promise<string>;
|
|
113
|
-
export declare const __test__: {
|
|
114
|
-
defaultCacheDir: typeof defaultCacheDir;
|
|
115
|
-
cachePath: typeof cachePath;
|
|
116
|
-
normalizeCategory: typeof normalizeCategory;
|
|
117
|
-
formatCategoryBreakdown: typeof formatCategoryBreakdown;
|
|
118
|
-
formatVersionRange: typeof formatVersionRange;
|
|
119
|
-
};
|
|
120
|
-
export {};
|
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
// What's-New startup panel.
|
|
2
|
-
//
|
|
3
|
-
// On `session_start`, compares the running versions of pi-coding-agent,
|
|
4
|
-
// the bundled forge plugin, and forge-cli itself against the last-seen
|
|
5
|
-
// versions in `~/.pi/forge-cli/cache/whats-new-seen.json` (resolved via
|
|
6
|
-
// the central path resolver; migrated from the pre-v0.10.0 location at
|
|
7
|
-
// `~/.cache/forgecli/whats-new-seen.json`). When any has advanced, emits
|
|
8
|
-
// a compact 3-line summary via `ctx.ui.notify`, then records the new
|
|
9
|
-
// versions so subsequent sessions stay quiet.
|
|
10
|
-
//
|
|
11
|
-
// `/whats-new` re-renders the summary from the same cache, and
|
|
12
|
-
// `/whats-new <component>` drills into one component's full changelog
|
|
13
|
-
// entries between the previous-seen and current versions.
|
|
14
|
-
//
|
|
15
|
-
// All disk I/O is fail-silent on the user surface; FORGE_DEBUG_WHATS_NEW=1
|
|
16
|
-
// prints diagnostic output to stderr.
|
|
17
|
-
import { existsSync, promises as fs, readFileSync } from "node:fs";
|
|
18
|
-
import * as path from "node:path";
|
|
19
|
-
import { getUserCacheDir } from "./paths/paths.js";
|
|
20
|
-
const COMPONENT_LABELS = {
|
|
21
|
-
pi: "pi",
|
|
22
|
-
"forge-plugin": "forge-plugin",
|
|
23
|
-
"forge-cli": "forge-cli",
|
|
24
|
-
};
|
|
25
|
-
const COMPONENT_ORDER = ["pi", "forge-plugin", "forge-cli"];
|
|
26
|
-
function defaultCacheDir() {
|
|
27
|
-
return getUserCacheDir();
|
|
28
|
-
}
|
|
29
|
-
function cachePath(cacheDir) {
|
|
30
|
-
return path.join(cacheDir, "whats-new-seen.json");
|
|
31
|
-
}
|
|
32
|
-
function debug(...args) {
|
|
33
|
-
if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
|
|
34
|
-
console.error("[forge-cli whats-new]", ...args);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export function emptySeenState() {
|
|
38
|
-
return {
|
|
39
|
-
pi: null,
|
|
40
|
-
forgePlugin: null,
|
|
41
|
-
forgeCli: null,
|
|
42
|
-
prevPi: null,
|
|
43
|
-
prevForgePlugin: null,
|
|
44
|
-
prevForgeCli: null,
|
|
45
|
-
lastShownFromPi: null,
|
|
46
|
-
lastShownFromForgePlugin: null,
|
|
47
|
-
lastShownFromForgeCli: null,
|
|
48
|
-
lastShownAt: 0,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
export async function readSeenState(cacheDir) {
|
|
52
|
-
try {
|
|
53
|
-
const raw = await fs.readFile(cachePath(cacheDir), "utf8");
|
|
54
|
-
const parsed = JSON.parse(raw);
|
|
55
|
-
const s = emptySeenState();
|
|
56
|
-
if (typeof parsed.pi === "string")
|
|
57
|
-
s.pi = parsed.pi;
|
|
58
|
-
if (typeof parsed.forgePlugin === "string")
|
|
59
|
-
s.forgePlugin = parsed.forgePlugin;
|
|
60
|
-
if (typeof parsed.forgeCli === "string")
|
|
61
|
-
s.forgeCli = parsed.forgeCli;
|
|
62
|
-
if (typeof parsed.prevPi === "string")
|
|
63
|
-
s.prevPi = parsed.prevPi;
|
|
64
|
-
if (typeof parsed.prevForgePlugin === "string")
|
|
65
|
-
s.prevForgePlugin = parsed.prevForgePlugin;
|
|
66
|
-
if (typeof parsed.prevForgeCli === "string")
|
|
67
|
-
s.prevForgeCli = parsed.prevForgeCli;
|
|
68
|
-
if (typeof parsed.lastShownFromPi === "string")
|
|
69
|
-
s.lastShownFromPi = parsed.lastShownFromPi;
|
|
70
|
-
if (typeof parsed.lastShownFromForgePlugin === "string")
|
|
71
|
-
s.lastShownFromForgePlugin = parsed.lastShownFromForgePlugin;
|
|
72
|
-
if (typeof parsed.lastShownFromForgeCli === "string")
|
|
73
|
-
s.lastShownFromForgeCli = parsed.lastShownFromForgeCli;
|
|
74
|
-
if (typeof parsed.lastShownAt === "number")
|
|
75
|
-
s.lastShownAt = parsed.lastShownAt;
|
|
76
|
-
return s;
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return emptySeenState();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
export async function writeSeenState(cacheDir, state) {
|
|
83
|
-
await fs.mkdir(cacheDir, { recursive: true });
|
|
84
|
-
const final = cachePath(cacheDir);
|
|
85
|
-
const tmp = `${final}.${process.pid}.${Date.now()}.tmp`;
|
|
86
|
-
await fs.writeFile(tmp, JSON.stringify(state, null, 2), "utf8");
|
|
87
|
-
await fs.rename(tmp, final);
|
|
88
|
-
}
|
|
89
|
-
// ── semver helpers ────────────────────────────────────────────────────────
|
|
90
|
-
function parseTriple(v) {
|
|
91
|
-
const cleaned = v.startsWith("v") ? v.slice(1) : v;
|
|
92
|
-
const parts = cleaned.split("-")[0].split(".");
|
|
93
|
-
if (parts.length !== 3)
|
|
94
|
-
return null;
|
|
95
|
-
const nums = [];
|
|
96
|
-
for (const p of parts) {
|
|
97
|
-
if (!/^\d+$/.test(p))
|
|
98
|
-
return null;
|
|
99
|
-
nums.push(Number.parseInt(p, 10));
|
|
100
|
-
}
|
|
101
|
-
return [nums[0], nums[1], nums[2]];
|
|
102
|
-
}
|
|
103
|
-
export function semverGt(a, b) {
|
|
104
|
-
const pa = parseTriple(a);
|
|
105
|
-
const pb = parseTriple(b);
|
|
106
|
-
if (!pa || !pb)
|
|
107
|
-
return false;
|
|
108
|
-
for (let i = 0; i < 3; i++) {
|
|
109
|
-
if (pa[i] > pb[i])
|
|
110
|
-
return true;
|
|
111
|
-
if (pa[i] < pb[i])
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
// ── changelog parsing ─────────────────────────────────────────────────────
|
|
117
|
-
const VERSION_HEADER = /^##\s+\[?([^\]\s]+)\]?(?:\s*[—–-]\s*(.+))?$/;
|
|
118
|
-
const SECTION_HEADER = /^###\s+(.+)$/;
|
|
119
|
-
/**
|
|
120
|
-
* Parse a Keep-a-Changelog–style markdown body into per-version entries.
|
|
121
|
-
* Tolerates pi's `### New Features` overview sections (which precede the
|
|
122
|
-
* standard `### Added`/`### Fixed` sections) and the `[Unreleased]` block.
|
|
123
|
-
*/
|
|
124
|
-
export function parseChangelog(markdown) {
|
|
125
|
-
const lines = markdown.split("\n");
|
|
126
|
-
const entries = [];
|
|
127
|
-
let current = null;
|
|
128
|
-
let currentSection = null;
|
|
129
|
-
const currentBodyLines = [];
|
|
130
|
-
const flushSection = () => {
|
|
131
|
-
if (current && currentSection && currentSection.bullets.length > 0) {
|
|
132
|
-
current.sections.push(currentSection);
|
|
133
|
-
}
|
|
134
|
-
currentSection = null;
|
|
135
|
-
};
|
|
136
|
-
const flushEntry = () => {
|
|
137
|
-
flushSection();
|
|
138
|
-
if (current) {
|
|
139
|
-
current.rawBody = currentBodyLines.join("\n").trim();
|
|
140
|
-
entries.push(current);
|
|
141
|
-
}
|
|
142
|
-
current = null;
|
|
143
|
-
currentBodyLines.length = 0;
|
|
144
|
-
};
|
|
145
|
-
for (const line of lines) {
|
|
146
|
-
const vMatch = line.match(VERSION_HEADER);
|
|
147
|
-
if (vMatch) {
|
|
148
|
-
flushEntry();
|
|
149
|
-
const version = vMatch[1].trim();
|
|
150
|
-
if (version.toLowerCase() === "unreleased") {
|
|
151
|
-
// Skip [Unreleased] blocks entirely.
|
|
152
|
-
current = null;
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
current = {
|
|
156
|
-
version,
|
|
157
|
-
date: vMatch[2]?.trim() ?? null,
|
|
158
|
-
sections: [],
|
|
159
|
-
rawBody: "",
|
|
160
|
-
};
|
|
161
|
-
currentBodyLines.length = 0;
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
if (!current)
|
|
165
|
-
continue;
|
|
166
|
-
currentBodyLines.push(line);
|
|
167
|
-
const sMatch = line.match(SECTION_HEADER);
|
|
168
|
-
if (sMatch) {
|
|
169
|
-
flushSection();
|
|
170
|
-
currentSection = { name: sMatch[1].trim(), bullets: [] };
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (currentSection && /^\s*[-*]\s+/.test(line)) {
|
|
174
|
-
currentSection.bullets.push(line.replace(/^\s*[-*]\s+/, "").trim());
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
flushEntry();
|
|
178
|
-
return entries;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Reduce a list of changelog entries down to the ones strictly newer than
|
|
182
|
-
* `from`, up to and including `to`. When `from` is null, returns only the
|
|
183
|
-
* `to` entry (first-install case — don't dump the whole history).
|
|
184
|
-
*/
|
|
185
|
-
export function entriesBetween(entries, from, to) {
|
|
186
|
-
const matchExact = entries.filter((e) => e.version === to);
|
|
187
|
-
if (from === null) {
|
|
188
|
-
return matchExact;
|
|
189
|
-
}
|
|
190
|
-
return entries.filter((e) => semverGt(e.version, from) && (e.version === to || !semverGt(e.version, to)));
|
|
191
|
-
}
|
|
192
|
-
const CATEGORY_ALIASES = {
|
|
193
|
-
"new features": "added",
|
|
194
|
-
added: "added",
|
|
195
|
-
changed: "changed",
|
|
196
|
-
fixed: "fixed",
|
|
197
|
-
deprecated: "deprecated",
|
|
198
|
-
removed: "removed",
|
|
199
|
-
security: "security",
|
|
200
|
-
tests: "tests",
|
|
201
|
-
docs: "docs",
|
|
202
|
-
};
|
|
203
|
-
function normalizeCategory(name) {
|
|
204
|
-
const key = name.toLowerCase().trim();
|
|
205
|
-
return CATEGORY_ALIASES[key] ?? key;
|
|
206
|
-
}
|
|
207
|
-
export function summarizeEntries(entries) {
|
|
208
|
-
const byCategory = new Map();
|
|
209
|
-
let total = 0;
|
|
210
|
-
for (const entry of entries) {
|
|
211
|
-
for (const section of entry.sections) {
|
|
212
|
-
const cat = normalizeCategory(section.name);
|
|
213
|
-
const n = section.bullets.length;
|
|
214
|
-
if (n === 0)
|
|
215
|
-
continue;
|
|
216
|
-
byCategory.set(cat, (byCategory.get(cat) ?? 0) + n);
|
|
217
|
-
total += n;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return { total, byCategory };
|
|
221
|
-
}
|
|
222
|
-
export function resolveChangelogPaths(pkgRoot) {
|
|
223
|
-
const candidates = {
|
|
224
|
-
pi: [
|
|
225
|
-
path.join(pkgRoot, "dist", "CHANGELOG-pi.md"),
|
|
226
|
-
path.join(pkgRoot, "node_modules", "@earendil-works", "pi-coding-agent", "CHANGELOG.md"),
|
|
227
|
-
],
|
|
228
|
-
forgePlugin: [
|
|
229
|
-
path.join(pkgRoot, "dist", "CHANGELOG-forge-plugin.md"),
|
|
230
|
-
path.join(pkgRoot, "..", "forge", "CHANGELOG.md"),
|
|
231
|
-
],
|
|
232
|
-
forgeCli: [path.join(pkgRoot, "CHANGELOG.md")],
|
|
233
|
-
};
|
|
234
|
-
const pick = (paths) => paths.find((p) => existsSync(p)) ?? null;
|
|
235
|
-
return {
|
|
236
|
-
pi: pick(candidates.pi),
|
|
237
|
-
forgePlugin: pick(candidates.forgePlugin),
|
|
238
|
-
forgeCli: pick(candidates.forgeCli),
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
function readChangelogSafe(p) {
|
|
242
|
-
if (!p)
|
|
243
|
-
return null;
|
|
244
|
-
try {
|
|
245
|
-
return readFileSync(p, "utf8");
|
|
246
|
-
}
|
|
247
|
-
catch (err) {
|
|
248
|
-
debug("read failed:", p, err);
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
export function computeSummaries(opts) {
|
|
253
|
-
const baseline = opts.baseline ?? "seen";
|
|
254
|
-
const pickFrom = (id) => {
|
|
255
|
-
const s = opts.seen;
|
|
256
|
-
switch (baseline) {
|
|
257
|
-
case "seen":
|
|
258
|
-
return id === "pi" ? s.pi : id === "forge-plugin" ? s.forgePlugin : s.forgeCli;
|
|
259
|
-
case "prev":
|
|
260
|
-
return id === "pi" ? s.prevPi : id === "forge-plugin" ? s.prevForgePlugin : s.prevForgeCli;
|
|
261
|
-
case "lastShown":
|
|
262
|
-
return id === "pi"
|
|
263
|
-
? s.lastShownFromPi
|
|
264
|
-
: id === "forge-plugin"
|
|
265
|
-
? s.lastShownFromForgePlugin
|
|
266
|
-
: s.lastShownFromForgeCli;
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
|
-
const pairs = [
|
|
270
|
-
{ id: "pi", current: opts.current.pi, src: opts.sources.pi },
|
|
271
|
-
{ id: "forge-plugin", current: opts.current.forgePlugin, src: opts.sources.forgePlugin },
|
|
272
|
-
{ id: "forge-cli", current: opts.current.forgeCli, src: opts.sources.forgeCli },
|
|
273
|
-
];
|
|
274
|
-
const out = [];
|
|
275
|
-
// For the lastShown baseline, presence of any panel-ever-shown is
|
|
276
|
-
// signalled by lastShownAt > 0. If no panel was ever shown, return
|
|
277
|
-
// no summaries so /whats-new prints "no recent updates" cleanly.
|
|
278
|
-
if (baseline === "lastShown" && opts.seen.lastShownAt === 0)
|
|
279
|
-
return out;
|
|
280
|
-
for (const p of pairs) {
|
|
281
|
-
if (!p.current)
|
|
282
|
-
continue;
|
|
283
|
-
const useFrom = pickFrom(p.id);
|
|
284
|
-
// For the prev baseline, null means we have no replay info for this
|
|
285
|
-
// component — skip it. (seen and lastShown null are both valid: seen
|
|
286
|
-
// null = first install; lastShown null with lastShownAt>0 = the most
|
|
287
|
-
// recent panel was a first-install panel.)
|
|
288
|
-
if (useFrom === null && baseline === "prev")
|
|
289
|
-
continue;
|
|
290
|
-
// When the component has not advanced (useFrom === current), fall back to
|
|
291
|
-
// null so entriesBetween returns the exact current-version entry. This
|
|
292
|
-
// ensures all three component tabs always appear in the strip.
|
|
293
|
-
const effectiveFrom = useFrom !== null && !semverGt(p.current, useFrom) ? null : useFrom;
|
|
294
|
-
const markdown = readChangelogSafe(p.src);
|
|
295
|
-
if (!markdown) {
|
|
296
|
-
debug("no changelog source for", p.id);
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
const parsed = parseChangelog(markdown);
|
|
300
|
-
const slice = entriesBetween(parsed, effectiveFrom, p.current);
|
|
301
|
-
if (slice.length === 0) {
|
|
302
|
-
debug("no matching entries for", p.id, "between", useFrom, "and", p.current);
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
const sum = summarizeEntries(slice);
|
|
306
|
-
out.push({
|
|
307
|
-
component: p.id,
|
|
308
|
-
label: COMPONENT_LABELS[p.id],
|
|
309
|
-
fromVersion: effectiveFrom,
|
|
310
|
-
toVersion: p.current,
|
|
311
|
-
totalChanges: sum.total,
|
|
312
|
-
byCategory: sum.byCategory,
|
|
313
|
-
entries: slice,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
return out;
|
|
317
|
-
}
|
|
318
|
-
// ── rendering ────────────────────────────────────────────────────────────
|
|
319
|
-
function formatVersionRange(from, to) {
|
|
320
|
-
return from ? `${from} → ${to}` : to;
|
|
321
|
-
}
|
|
322
|
-
function formatCategoryBreakdown(byCategory) {
|
|
323
|
-
const order = ["added", "changed", "fixed", "removed", "security", "deprecated", "tests", "docs"];
|
|
324
|
-
const parts = [];
|
|
325
|
-
for (const key of order) {
|
|
326
|
-
const n = byCategory.get(key);
|
|
327
|
-
if (n)
|
|
328
|
-
parts.push(`${n} ${key}`);
|
|
329
|
-
}
|
|
330
|
-
// Surface unknown categories at the end so we never silently drop counts.
|
|
331
|
-
for (const [key, n] of byCategory) {
|
|
332
|
-
if (!order.includes(key))
|
|
333
|
-
parts.push(`${n} ${key}`);
|
|
334
|
-
}
|
|
335
|
-
return parts.length > 0 ? `(${parts.join(" · ")})` : "";
|
|
336
|
-
}
|
|
337
|
-
function padRight(s, n) {
|
|
338
|
-
return s.length >= n ? s : s + " ".repeat(n - s.length);
|
|
339
|
-
}
|
|
340
|
-
export function renderSummaryPanel(summaries) {
|
|
341
|
-
if (summaries.length === 0)
|
|
342
|
-
return "What's New: no recent updates.";
|
|
343
|
-
const sorted = [...summaries].sort((a, b) => COMPONENT_ORDER.indexOf(a.component) - COMPONENT_ORDER.indexOf(b.component));
|
|
344
|
-
const labelWidth = Math.max(...sorted.map((s) => s.label.length), 12);
|
|
345
|
-
const rangeWidth = Math.max(...sorted.map((s) => formatVersionRange(s.fromVersion, s.toVersion).length), 14);
|
|
346
|
-
const lines = ["What's New since last login:"];
|
|
347
|
-
for (const s of sorted) {
|
|
348
|
-
const label = padRight(s.label, labelWidth);
|
|
349
|
-
const range = padRight(formatVersionRange(s.fromVersion, s.toVersion), rangeWidth);
|
|
350
|
-
const count = `${s.totalChanges} change${s.totalChanges === 1 ? "" : "s"}`;
|
|
351
|
-
const breakdown = formatCategoryBreakdown(s.byCategory);
|
|
352
|
-
lines.push(` ${label} ${range} ${padRight(count, 12)}${breakdown ? " " + breakdown : ""}`);
|
|
353
|
-
}
|
|
354
|
-
lines.push("");
|
|
355
|
-
lines.push("Run /whats-new pi | forge-plugin | forge-cli for details. /whats-new dismiss to clear.");
|
|
356
|
-
return lines.join("\n");
|
|
357
|
-
}
|
|
358
|
-
export function renderComponentDetail(summary) {
|
|
359
|
-
const heading = `What's New — ${summary.label} ${formatVersionRange(summary.fromVersion, summary.toVersion)}`;
|
|
360
|
-
const lines = [heading, ""];
|
|
361
|
-
for (const entry of summary.entries) {
|
|
362
|
-
lines.push(`## ${entry.version}${entry.date ? ` — ${entry.date}` : ""}`);
|
|
363
|
-
for (const section of entry.sections) {
|
|
364
|
-
lines.push("");
|
|
365
|
-
lines.push(`### ${section.name}`);
|
|
366
|
-
for (const bullet of section.bullets) {
|
|
367
|
-
lines.push(`- ${bullet}`);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
lines.push("");
|
|
371
|
-
}
|
|
372
|
-
return lines.join("\n").trim();
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Compute the startup summary and, when present, update the seen state
|
|
376
|
-
* so subsequent sessions don't replay. Returns the rendered string (or
|
|
377
|
-
* null when there's nothing to show).
|
|
378
|
-
*
|
|
379
|
-
* The `prev*` fields in the seen state preserve the prior baseline so
|
|
380
|
-
* /whats-new can re-render until the user explicitly dismisses.
|
|
381
|
-
*/
|
|
382
|
-
export async function computeAndPersistStartupPanel(rt) {
|
|
383
|
-
const cacheDir = rt.cacheDir ?? defaultCacheDir();
|
|
384
|
-
const seen = await readSeenState(cacheDir);
|
|
385
|
-
const sources = resolveChangelogPaths(rt.pkgRoot);
|
|
386
|
-
const summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "seen" });
|
|
387
|
-
if (summaries.length === 0)
|
|
388
|
-
return null;
|
|
389
|
-
const findFrom = (id) => summaries.find((s) => s.component === id)?.fromVersion ?? null;
|
|
390
|
-
const next = {
|
|
391
|
-
pi: rt.current.pi,
|
|
392
|
-
forgePlugin: rt.current.forgePlugin,
|
|
393
|
-
forgeCli: rt.current.forgeCli,
|
|
394
|
-
// Preserve old prev baseline if present; otherwise snapshot what was seen.
|
|
395
|
-
prevPi: seen.prevPi ?? seen.pi,
|
|
396
|
-
prevForgePlugin: seen.prevForgePlugin ?? seen.forgePlugin,
|
|
397
|
-
prevForgeCli: seen.prevForgeCli ?? seen.forgeCli,
|
|
398
|
-
// Freeze the just-shown `from` baseline so /whats-new can replay this
|
|
399
|
-
// exact set even after the user dismisses (which collapses prev).
|
|
400
|
-
lastShownFromPi: findFrom("pi") ?? seen.lastShownFromPi,
|
|
401
|
-
lastShownFromForgePlugin: findFrom("forge-plugin") ?? seen.lastShownFromForgePlugin,
|
|
402
|
-
lastShownFromForgeCli: findFrom("forge-cli") ?? seen.lastShownFromForgeCli,
|
|
403
|
-
lastShownAt: Date.now(),
|
|
404
|
-
};
|
|
405
|
-
try {
|
|
406
|
-
await writeSeenState(cacheDir, next);
|
|
407
|
-
}
|
|
408
|
-
catch (err) {
|
|
409
|
-
debug("writeSeenState failed:", err);
|
|
410
|
-
}
|
|
411
|
-
return { rendered: renderSummaryPanel(summaries), summaries };
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Re-compute summaries against the `prev*` baseline (so users can replay
|
|
415
|
-
* the panel after auto-dismiss). When `componentArg` matches one of the
|
|
416
|
-
* three component IDs, returns that component's full detail view instead.
|
|
417
|
-
*/
|
|
418
|
-
export async function computeWhatsNewView(rt, componentArg) {
|
|
419
|
-
const cacheDir = rt.cacheDir ?? defaultCacheDir();
|
|
420
|
-
const seen = await readSeenState(cacheDir);
|
|
421
|
-
const sources = resolveChangelogPaths(rt.pkgRoot);
|
|
422
|
-
// Prefer the prev baseline (post auto-dismiss, pre explicit dismiss); fall
|
|
423
|
-
// back to the lastShown frozen baseline so dismissed users can still
|
|
424
|
-
// re-read what was last shown to them.
|
|
425
|
-
let summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "prev" });
|
|
426
|
-
if (summaries.length === 0) {
|
|
427
|
-
summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "lastShown" });
|
|
428
|
-
}
|
|
429
|
-
if (componentArg && componentArg !== "summary") {
|
|
430
|
-
const wanted = componentArg.toLowerCase();
|
|
431
|
-
const match = summaries.find((s) => s.component === wanted || s.label === wanted);
|
|
432
|
-
if (!match) {
|
|
433
|
-
return `whats-new: no recent changes for "${componentArg}". Components: ${COMPONENT_ORDER.join(", ")}.`;
|
|
434
|
-
}
|
|
435
|
-
return renderComponentDetail(match);
|
|
436
|
-
}
|
|
437
|
-
return renderSummaryPanel(summaries);
|
|
438
|
-
}
|
|
439
|
-
/**
|
|
440
|
-
* Clear the `prev*` baseline so /whats-new stops replaying past changes.
|
|
441
|
-
* Current `seen` values are left untouched.
|
|
442
|
-
*/
|
|
443
|
-
export async function dismissWhatsNew(rt) {
|
|
444
|
-
const cacheDir = rt.cacheDir ?? defaultCacheDir();
|
|
445
|
-
const seen = await readSeenState(cacheDir);
|
|
446
|
-
const next = {
|
|
447
|
-
...seen,
|
|
448
|
-
prevPi: seen.pi,
|
|
449
|
-
prevForgePlugin: seen.forgePlugin,
|
|
450
|
-
prevForgeCli: seen.forgeCli,
|
|
451
|
-
};
|
|
452
|
-
try {
|
|
453
|
-
await writeSeenState(cacheDir, next);
|
|
454
|
-
}
|
|
455
|
-
catch (err) {
|
|
456
|
-
debug("writeSeenState (dismiss) failed:", err);
|
|
457
|
-
}
|
|
458
|
-
return "whats-new: dismissed.";
|
|
459
|
-
}
|
|
460
|
-
// Slash-command registration lives in whats-new-widget.ts (it owns the
|
|
461
|
-
// interactive surface). This module remains the pure parser + state +
|
|
462
|
-
// computer used by both the widget and the slash handler.
|
|
463
|
-
export const __test__ = {
|
|
464
|
-
defaultCacheDir,
|
|
465
|
-
cachePath,
|
|
466
|
-
normalizeCategory,
|
|
467
|
-
formatCategoryBreakdown,
|
|
468
|
-
formatVersionRange,
|
|
469
|
-
};
|
|
470
|
-
//# sourceMappingURL=whats-new.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"whats-new.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/whats-new.ts"],"names":[],"mappings":"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"}
|