@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.
Files changed (232) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/CHANGELOG-forge-plugin.md +118 -0
  3. package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
  4. package/dist/extensions/forgecli/forge-tools.js +73 -0
  5. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  6. package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
  7. package/dist/extensions/forgecli/lib/forge-root.js +14 -1
  8. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  9. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
  10. package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
  11. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  12. package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
  13. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  14. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  15. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  16. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  17. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  18. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  19. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  20. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  21. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  22. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  23. package/dist/forge-payload/.schemas/migrations.json +56 -0
  24. package/dist/forge-payload/integrity.json +3 -3
  25. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  26. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  27. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  28. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  29. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  30. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  31. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  32. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  33. package/dist/forge-payload/schemas/event.schema.json +8 -3
  34. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  35. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  36. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  37. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  38. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  39. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  40. package/package.json +2 -2
  41. package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
  42. package/dist/extensions/forgecli/add-pipeline.js +0 -143
  43. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  44. package/dist/extensions/forgecli/add-task.d.ts +0 -20
  45. package/dist/extensions/forgecli/add-task.js +0 -154
  46. package/dist/extensions/forgecli/add-task.js.map +0 -1
  47. package/dist/extensions/forgecli/approve.d.ts +0 -22
  48. package/dist/extensions/forgecli/approve.js +0 -152
  49. package/dist/extensions/forgecli/approve.js.map +0 -1
  50. package/dist/extensions/forgecli/banner.d.ts +0 -10
  51. package/dist/extensions/forgecli/banner.js +0 -36
  52. package/dist/extensions/forgecli/banner.js.map +0 -1
  53. package/dist/extensions/forgecli/calibrate.d.ts +0 -64
  54. package/dist/extensions/forgecli/calibrate.js +0 -481
  55. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  56. package/dist/extensions/forgecli/collate.d.ts +0 -22
  57. package/dist/extensions/forgecli/collate.js +0 -134
  58. package/dist/extensions/forgecli/collate.js.map +0 -1
  59. package/dist/extensions/forgecli/commit.d.ts +0 -22
  60. package/dist/extensions/forgecli/commit.js +0 -152
  61. package/dist/extensions/forgecli/commit.js.map +0 -1
  62. package/dist/extensions/forgecli/config-command.d.ts +0 -8
  63. package/dist/extensions/forgecli/config-command.js +0 -67
  64. package/dist/extensions/forgecli/config-command.js.map +0 -1
  65. package/dist/extensions/forgecli/config-layer.d.ts +0 -53
  66. package/dist/extensions/forgecli/config-layer.js +0 -72
  67. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  68. package/dist/extensions/forgecli/config-writer.d.ts +0 -16
  69. package/dist/extensions/forgecli/config-writer.js +0 -69
  70. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  71. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  72. package/dist/extensions/forgecli/enhance.js +0 -199
  73. package/dist/extensions/forgecli/enhance.js.map +0 -1
  74. package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
  75. package/dist/extensions/forgecli/fix-bug.js +0 -1580
  76. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  77. package/dist/extensions/forgecli/forge-header.d.ts +0 -12
  78. package/dist/extensions/forgecli/forge-header.js +0 -114
  79. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  80. package/dist/extensions/forgecli/forge-init.d.ts +0 -26
  81. package/dist/extensions/forgecli/forge-init.js +0 -514
  82. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  83. package/dist/extensions/forgecli/forge-root.d.ts +0 -10
  84. package/dist/extensions/forgecli/forge-root.js +0 -62
  85. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  86. package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
  87. package/dist/extensions/forgecli/forge-update-command.js +0 -435
  88. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  89. package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
  90. package/dist/extensions/forgecli/friction-emit.js +0 -245
  91. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  92. package/dist/extensions/forgecli/implement.d.ts +0 -22
  93. package/dist/extensions/forgecli/implement.js +0 -170
  94. package/dist/extensions/forgecli/implement.js.map +0 -1
  95. package/dist/extensions/forgecli/init-context.d.ts +0 -99
  96. package/dist/extensions/forgecli/init-context.js +0 -178
  97. package/dist/extensions/forgecli/init-context.js.map +0 -1
  98. package/dist/extensions/forgecli/init-progress.d.ts +0 -39
  99. package/dist/extensions/forgecli/init-progress.js +0 -117
  100. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  101. package/dist/extensions/forgecli/input-router.d.ts +0 -33
  102. package/dist/extensions/forgecli/input-router.js +0 -136
  103. package/dist/extensions/forgecli/input-router.js.map +0 -1
  104. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
  105. package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
  106. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  107. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
  108. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
  109. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  110. package/dist/extensions/forgecli/materialize.d.ts +0 -16
  111. package/dist/extensions/forgecli/materialize.js +0 -195
  112. package/dist/extensions/forgecli/materialize.js.map +0 -1
  113. package/dist/extensions/forgecli/migrate.d.ts +0 -22
  114. package/dist/extensions/forgecli/migrate.js +0 -260
  115. package/dist/extensions/forgecli/migrate.js.map +0 -1
  116. package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
  117. package/dist/extensions/forgecli/migration-engine.js +0 -563
  118. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  119. package/dist/extensions/forgecli/model-registry.d.ts +0 -61
  120. package/dist/extensions/forgecli/model-registry.js +0 -127
  121. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  122. package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
  123. package/dist/extensions/forgecli/model-resolver.js +0 -65
  124. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  125. package/dist/extensions/forgecli/model-validator.d.ts +0 -29
  126. package/dist/extensions/forgecli/model-validator.js +0 -107
  127. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  128. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
  129. package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
  130. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  131. package/dist/extensions/forgecli/plan.d.ts +0 -22
  132. package/dist/extensions/forgecli/plan.js +0 -167
  133. package/dist/extensions/forgecli/plan.js.map +0 -1
  134. package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
  135. package/dist/extensions/forgecli/quiz-agent.js +0 -98
  136. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  137. package/dist/extensions/forgecli/read-command.d.ts +0 -2
  138. package/dist/extensions/forgecli/read-command.js +0 -100
  139. package/dist/extensions/forgecli/read-command.js.map +0 -1
  140. package/dist/extensions/forgecli/regenerate.d.ts +0 -40
  141. package/dist/extensions/forgecli/regenerate.js +0 -438
  142. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  143. package/dist/extensions/forgecli/remove-command.d.ts +0 -17
  144. package/dist/extensions/forgecli/remove-command.js +0 -124
  145. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  146. package/dist/extensions/forgecli/report-bug.d.ts +0 -25
  147. package/dist/extensions/forgecli/report-bug.js +0 -159
  148. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  149. package/dist/extensions/forgecli/retrospective.d.ts +0 -20
  150. package/dist/extensions/forgecli/retrospective.js +0 -126
  151. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  152. package/dist/extensions/forgecli/review-code.d.ts +0 -35
  153. package/dist/extensions/forgecli/review-code.js +0 -196
  154. package/dist/extensions/forgecli/review-code.js.map +0 -1
  155. package/dist/extensions/forgecli/review-plan.d.ts +0 -35
  156. package/dist/extensions/forgecli/review-plan.js +0 -200
  157. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  158. package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
  159. package/dist/extensions/forgecli/run-sprint.js +0 -716
  160. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  161. package/dist/extensions/forgecli/run-task.d.ts +0 -204
  162. package/dist/extensions/forgecli/run-task.js +0 -1403
  163. package/dist/extensions/forgecli/run-task.js.map +0 -1
  164. package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
  165. package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
  166. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  167. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
  168. package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
  169. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  170. package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
  171. package/dist/extensions/forgecli/skill-retriever.js +0 -246
  172. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  173. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
  174. package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
  175. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  176. package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
  177. package/dist/extensions/forgecli/sprint-intake.js +0 -91
  178. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  179. package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
  180. package/dist/extensions/forgecli/sprint-plan.js +0 -122
  181. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  182. package/dist/extensions/forgecli/status-command.d.ts +0 -19
  183. package/dist/extensions/forgecli/status-command.js +0 -140
  184. package/dist/extensions/forgecli/status-command.js.map +0 -1
  185. package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
  186. package/dist/extensions/forgecli/store-error-remediation.js +0 -307
  187. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  188. package/dist/extensions/forgecli/store-query.d.ts +0 -22
  189. package/dist/extensions/forgecli/store-query.js +0 -107
  190. package/dist/extensions/forgecli/store-query.js.map +0 -1
  191. package/dist/extensions/forgecli/store-repair.d.ts +0 -17
  192. package/dist/extensions/forgecli/store-repair.js +0 -123
  193. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  194. package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
  195. package/dist/extensions/forgecli/store-resolver.js +0 -263
  196. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  197. package/dist/extensions/forgecli/store-validator.d.ts +0 -16
  198. package/dist/extensions/forgecli/store-validator.js +0 -32
  199. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  200. package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
  201. package/dist/extensions/forgecli/test-orchestrate.js +0 -182
  202. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  203. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  204. package/dist/extensions/forgecli/thread-switcher.js +0 -189
  205. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  206. package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
  207. package/dist/extensions/forgecli/transition-guard.js +0 -89
  208. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  209. package/dist/extensions/forgecli/update-check.d.ts +0 -37
  210. package/dist/extensions/forgecli/update-check.js +0 -185
  211. package/dist/extensions/forgecli/update-check.js.map +0 -1
  212. package/dist/extensions/forgecli/update-tools.d.ts +0 -23
  213. package/dist/extensions/forgecli/update-tools.js +0 -135
  214. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  215. package/dist/extensions/forgecli/validate.d.ts +0 -22
  216. package/dist/extensions/forgecli/validate.js +0 -152
  217. package/dist/extensions/forgecli/validate.js.map +0 -1
  218. package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
  219. package/dist/extensions/forgecli/viewport-events.js +0 -243
  220. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  221. package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
  222. package/dist/extensions/forgecli/viewport-renderer.js +0 -233
  223. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  224. package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
  225. package/dist/extensions/forgecli/viewport-theme.js +0 -128
  226. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  227. package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
  228. package/dist/extensions/forgecli/whats-new-widget.js +0 -376
  229. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  230. package/dist/extensions/forgecli/whats-new.d.ts +0 -120
  231. package/dist/extensions/forgecli/whats-new.js +0 -470
  232. 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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"}