@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,128 +0,0 @@
1
- // viewport-theme.ts
2
- //
3
- // Paints subagent-tail lines using pi's Theme. The tail buffer (see
4
- // viewport-renderer.ts) stores plain strings so transcripts and audit logs
5
- // stay ANSI-clean; this module is the single place that maps line categories
6
- // to theme colors at render time.
7
- //
8
- // Why parse at render time rather than colour at emit time:
9
- // 1. Theme may change after a line is emitted (user toggles theme).
10
- // 2. The tail buffer doubles as a fall-back trace; ANSI escapes there would
11
- // bleed into any plaintext consumer (clipboard, transcript debugging).
12
- // 3. Run-task.ts has no direct theme access — it runs as a command handler;
13
- // Theme lives in the TUI widget callback. Painting at render keeps the
14
- // emit path theme-agnostic and testable in isolation.
15
- //
16
- // Mapping (single source of truth for line category → ThemeColor):
17
- //
18
- // prefix `[role HH:MM:SS …]` → dim
19
- // `$ bash …` → bashMode (glyph) + text (rest)
20
- // `⌕ read/grep/glob …` → accent (glyph)
21
- // `✎ write/edit …` → warning (glyph) -- mutation
22
- // `⚙ store-cli …` → toolTitle (glyph)
23
- // `→ …` fallback → muted (glyph)
24
- // `← tool ok 247L` → success (glyph + "ok N L")
25
- // `⚠ tool failed: …` → error
26
- // `🔒 …` → error bold (glyph)
27
- // `✱ thinking line` → thinkingText italic
28
- // `» "preview"` → muted italic
29
- // `⇉ batched N` → dim
30
- // `▣ summary` → accent bold
31
- // `─── phase X/Y …` → accent bold
32
- import { visibleWidth } from "@earendil-works/pi-tui";
33
- /**
34
- * Parse one tail line into prefix + body, then colour both halves.
35
- * Returns the line unchanged if no theme is available.
36
- */
37
- export function paintTailLine(line, theme) {
38
- if (!theme)
39
- return line;
40
- // Prefix: `[role HH:MM:SS t<turn> ↑X↓Y]` — everything up to the first `]`.
41
- const closeIdx = line.indexOf("]");
42
- if (closeIdx === -1) {
43
- // No structured prefix — phase begin lines like `─── phase … ───`
44
- // still get themed via body matcher.
45
- return paintBody(line, theme);
46
- }
47
- const prefix = line.slice(0, closeIdx + 1);
48
- const body = line.slice(closeIdx + 1);
49
- const paintedPrefix = theme.fg("dim", prefix);
50
- const paintedBody = paintBody(body, theme);
51
- return `${paintedPrefix}${paintedBody}`;
52
- }
53
- /**
54
- * Build the sticky token-meter footer. Right-aligned to the viewport width,
55
- * preceded by a thin separator line so it visually anchors to the prompt.
56
- */
57
- export function paintFooterLine(text, width, theme) {
58
- const w = Math.max(visibleWidth(text), 0);
59
- const padLen = Math.max(0, width - w);
60
- const pad = " ".repeat(padLen);
61
- if (!theme)
62
- return `${pad}${text}`;
63
- return `${pad}${theme.bold(theme.fg("accent", text))}`;
64
- }
65
- function paintBody(body, theme) {
66
- const trimmed = body.replace(/^\s+/, "");
67
- if (trimmed.length === 0)
68
- return body;
69
- const leadingWs = body.slice(0, body.length - trimmed.length);
70
- // Tree connector at the start (`╭`/`│`/`╰`/`─`): paint dim then recurse so
71
- // the inner glyph still gets its category colour. `─` only when followed by
72
- // whitespace and NOT another `─` — that disambiguates a single-line-turn
73
- // connector from a phase-boundary line (`─── phase X/Y …`).
74
- const conn = trimmed.match(/^([╭│╰]|─(?=\s))\s+(.*)$/);
75
- if (conn) {
76
- const connector = conn[1];
77
- const rest = conn[2];
78
- return `${leadingWs}${theme.fg("dim", connector)} ${paintInner(rest, theme)}`;
79
- }
80
- return `${leadingWs}${paintInner(trimmed, theme)}`;
81
- }
82
- function paintInner(trimmed, theme) {
83
- if (trimmed.length === 0)
84
- return trimmed;
85
- // Use codePointAt so non-BMP emoji like 🔒 (U+1F512, surrogate pair in
86
- // UTF-16) match correctly. `trimmed[0]` returns only the high surrogate.
87
- const cp = trimmed.codePointAt(0);
88
- const first = cp !== undefined ? String.fromCodePoint(cp) : "";
89
- switch (first) {
90
- case "$": // bash
91
- return `${theme.fg("bashMode", "$")}${trimmed.slice(1)}`;
92
- case "⌕": // read/grep/glob
93
- return `${theme.fg("accent", "⌕")}${trimmed.slice(1)}`;
94
- case "✎": // write/edit
95
- return `${theme.fg("warning", "✎")}${trimmed.slice(1)}`;
96
- case "⚙": // store-cli
97
- return `${theme.fg("toolTitle", "⚙")}${trimmed.slice(1)}`;
98
- case "→": // fallback tool
99
- return `${theme.fg("muted", "→")}${trimmed.slice(1)}`;
100
- case "←": // tool result OK
101
- return theme.fg("success", trimmed);
102
- case "⚠": // tool failed
103
- return theme.fg("error", trimmed);
104
- case "🔒": // risky bash
105
- return theme.bold(theme.fg("error", trimmed));
106
- case "✱": // thinking
107
- return theme.italic(theme.fg("thinkingText", trimmed));
108
- case "»": // model preview text
109
- return theme.italic(theme.fg("muted", trimmed));
110
- case "⇉": // batched
111
- return theme.fg("dim", trimmed);
112
- case "▣": // phase summary
113
- return theme.bold(theme.fg("accent", trimmed));
114
- case "─": // phase boundary line `─── phase X/Y begin · taskId ───`
115
- return theme.bold(theme.fg("accent", trimmed));
116
- case "↻": // auto retry
117
- return theme.fg("warning", trimmed);
118
- case "◌": // compaction
119
- return theme.fg("muted", trimmed);
120
- case "⊘": // cancelled
121
- return theme.fg("muted", trimmed);
122
- case "⏳": // cancelling
123
- return theme.fg("warning", trimmed);
124
- default:
125
- return trimmed;
126
- }
127
- }
128
- //# sourceMappingURL=viewport-theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"viewport-theme.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/viewport-theme.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
- import { type ChangeSummary, type WhatsNewRuntime } from "./whats-new.js";
3
- /**
4
- * Compute startup summaries and, if any, emit a one-line passive notify
5
- * pointing the user at `/changelog`. Marks versions as seen via the
6
- * standard cache so subsequent sessions won't re-notify unless a new bump
7
- * occurs. Returns true when a notify was emitted.
8
- *
9
- * Pre-FORGE-BUG-001 this mounted the interactive strip directly; that was
10
- * removed because the strip captured the ↓ key for the whole session and
11
- * the auto-mount happened before the user had any chance to opt in.
12
- */
13
- export declare function mountWhatsNewWidgetOnStartup(_pi: ExtensionAPI, ctx: ExtensionContext, rt: WhatsNewRuntime): Promise<boolean>;
14
- /**
15
- * Mount the strip with a pre-computed summary list. Idempotent — a second
16
- * call unregisters the prior handler and replaces the widget surface.
17
- * Only `/changelog` calls this; startup notify does not.
18
- */
19
- export declare function mountStripWithSummaries(_pi: ExtensionAPI, ctx: ExtensionContext, rt: WhatsNewRuntime, summaries: ChangeSummary[]): void;
20
- /**
21
- * Register the /changelog slash command (overrides pi's built-in): re-mounts
22
- * the interactive strip widget covering pi + forge-plugin + forge-cli changelogs.
23
- * `/changelog dismiss` clears the replay baseline. Headless / non-TTY callers
24
- * fall through to a text notify so the command is still usable.
25
- */
26
- export declare function registerChangelogCommand(pi: ExtensionAPI, rt: WhatsNewRuntime): void;
@@ -1,376 +0,0 @@
1
- // What's-New strip + detail widget.
2
- //
3
- // Startup behavior (post-FORGE-BUG-001 refactor): on session_start we emit
4
- // a one-line passive notify pointing the user at `/changelog` — we do NOT
5
- // auto-mount the interactive strip and we do NOT hook the input router.
6
- // The strip used to live below the editor for the entire session and steal
7
- // every ↓ key; users hated it.
8
- //
9
- // The interactive strip is now ONLY mounted in response to `/changelog`.
10
- // UX once mounted:
11
- //
12
- // INACTIVE (default): "what's new ─ pi 30 · forge-plugin 8 · forge-cli 2 ↓ to view"
13
- // ACTIVE (↓): "what's new ─ ▸● pi 30 ○ forge-plugin 8 ○ forge-cli 2 ←→ · enter · esc hide · d forget"
14
- //
15
- // Enter on a chip → setOutputSource(WhatsNewDetailComponent).
16
- // Esc → soft hide for this session (unmounts widget, drops input handler;
17
- // /changelog cache is untouched, so /changelog still replays).
18
- // d → permanent forget (collapses prev baseline so /changelog returns
19
- // "no recent updates" until the next version bump).
20
- //
21
- // Activation key (↓) requires an empty editor (no text at all), not just
22
- // "no newlines" — single-line text used to be enough and that was too
23
- // eager.
24
- //
25
- // Mount is idempotent: a second /changelog while the strip is already
26
- // mounted unregisters the prior input-router handler before re-registering,
27
- // so handlers don't stack.
28
- import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
29
- import { getInputRouter } from "./input-router.js";
30
- import { getUserCacheDir } from "./paths/paths.js";
31
- import { computeAndPersistStartupPanel, computeSummaries, computeWhatsNewView, dismissWhatsNew, readSeenState, renderComponentDetail, renderSummaryPanel, resolveChangelogPaths, } from "./whats-new.js";
32
- const WIDGET_KEY = "forge:whats-new";
33
- // ── Detail-view component: rendered into chat viewport on Enter ──────────
34
- class WhatsNewDetailComponent {
35
- lines;
36
- invalidationCb;
37
- constructor(lines) {
38
- this.lines = lines;
39
- }
40
- render(width) {
41
- return this.lines.map((l) => (visibleWidth(l) <= width ? l : truncateToWidth(l, width)));
42
- }
43
- invalidate() {
44
- // Static content — re-render only when caller updates `lines`.
45
- }
46
- setInvalidationCallback(cb) {
47
- this.invalidationCb = cb;
48
- }
49
- updateLines(lines) {
50
- this.lines = lines;
51
- this.invalidationCb?.();
52
- }
53
- dispose = () => { };
54
- }
55
- // ── Strip component: single row below the editor ─────────────────────────
56
- class WhatsNewStripComponent {
57
- summaries;
58
- theme;
59
- cursorIdx = 0;
60
- stripActive = false;
61
- /** Component currently focused into the chat viewport. */
62
- focusedComponent = null;
63
- invalidationCb;
64
- constructor(summaries, theme) {
65
- this.summaries = summaries;
66
- this.theme = theme;
67
- }
68
- setInvalidationCallback(cb) {
69
- this.invalidationCb = cb;
70
- }
71
- invalidate() {
72
- // Re-render driven by caller via invalidationCb → tui.requestRender().
73
- }
74
- hasContent() {
75
- return this.summaries.length > 0;
76
- }
77
- getStripActive() {
78
- return this.stripActive;
79
- }
80
- cursorSummary() {
81
- return this.summaries[this.cursorIdx];
82
- }
83
- setStripActive(active) {
84
- if (this.stripActive === active)
85
- return;
86
- this.stripActive = active;
87
- this.invalidationCb?.();
88
- }
89
- moveCursor(delta) {
90
- if (this.summaries.length === 0)
91
- return;
92
- this.cursorIdx = Math.max(0, Math.min(this.summaries.length - 1, this.cursorIdx + delta));
93
- this.invalidationCb?.();
94
- }
95
- setFocused(id) {
96
- this.focusedComponent = id;
97
- this.invalidationCb?.();
98
- }
99
- clearSummaries() {
100
- this.summaries = [];
101
- this.focusedComponent = null;
102
- this.invalidationCb?.();
103
- }
104
- render(width) {
105
- if (!this.hasContent())
106
- return [];
107
- const dim = (s) => this.theme.fg("dim", s);
108
- const accent = (s) => this.theme.fg("accent", s);
109
- const bold = (s) => this.theme.bold(s);
110
- const prefix = this.stripActive ? accent("what's new ─ ") : dim("what's new ─ ");
111
- const hint = this.stripActive ? dim(" ←→ · enter · esc hide · d forget") : dim(" ↓ to view (empty editor)");
112
- const parts = this.summaries.map((s, i) => {
113
- const focusedGlyph = this.focusedComponent === s.component ? "●" : "○";
114
- const inner = `${focusedGlyph} ${s.label} ${s.totalChanges}`;
115
- if (this.stripActive && i === this.cursorIdx)
116
- return accent(bold(`▸${inner}`));
117
- return dim(inner);
118
- });
119
- const chips = parts.join(" ");
120
- let line = `${prefix}${chips}${hint}`;
121
- if (visibleWidth(line) > width)
122
- line = truncateToWidth(line, width);
123
- return [line];
124
- }
125
- dispose = () => { };
126
- }
127
- // ── Key recognition (mirrors thread-switcher.ts) ─────────────────────────
128
- function isLeftArrow(d) {
129
- return d === "\x1b[D";
130
- }
131
- function isRightArrow(d) {
132
- return d === "\x1b[C";
133
- }
134
- function isDownArrow(d) {
135
- return d === "\x1b[B" || d === "\x1bOB";
136
- }
137
- function isUpArrow(d) {
138
- return d === "\x1b[A" || d === "\x1bOA";
139
- }
140
- function isEnter(d) {
141
- return d === "\r" || d === "\n";
142
- }
143
- function isEsc(d) {
144
- return d === "\x1b";
145
- }
146
- // ── Mount ────────────────────────────────────────────────────────────────
147
- /**
148
- * Compute startup summaries and, if any, emit a one-line passive notify
149
- * pointing the user at `/changelog`. Marks versions as seen via the
150
- * standard cache so subsequent sessions won't re-notify unless a new bump
151
- * occurs. Returns true when a notify was emitted.
152
- *
153
- * Pre-FORGE-BUG-001 this mounted the interactive strip directly; that was
154
- * removed because the strip captured the ↓ key for the whole session and
155
- * the auto-mount happened before the user had any chance to opt in.
156
- */
157
- export async function mountWhatsNewWidgetOnStartup(_pi, ctx, rt) {
158
- const result = await computeAndPersistStartupPanel(rt);
159
- if (!result || result.summaries.length === 0)
160
- return false;
161
- const parts = result.summaries.map((s) => `${s.label} ${s.totalChanges}`).join(" · ");
162
- try {
163
- ctx.ui.notify(`forge: what's new — ${parts}. Type /changelog to view.`, "info");
164
- }
165
- catch {
166
- /* stale ctx — non-fatal */
167
- }
168
- return true;
169
- }
170
- /**
171
- * Module-level mount state — used to make `mountStripWithSummaries`
172
- * idempotent. Calling /changelog twice used to stack input-router
173
- * handlers; we now tear down the previous mount first.
174
- */
175
- let currentUnregister = null;
176
- /**
177
- * Mount the strip with a pre-computed summary list. Idempotent — a second
178
- * call unregisters the prior handler and replaces the widget surface.
179
- * Only `/changelog` calls this; startup notify does not.
180
- */
181
- export function mountStripWithSummaries(_pi, ctx, rt, summaries) {
182
- let stripRef;
183
- let tuiRef;
184
- let detailRef;
185
- // FORGE-BUG-001: the captured ExtensionContext goes stale after pi's
186
- // session replacement events. Touching ctx.ui after that throws.
187
- const safeUi = (fn) => {
188
- try {
189
- return fn();
190
- }
191
- catch {
192
- return undefined;
193
- }
194
- };
195
- // Idempotency: drop any prior input-router handler before re-registering.
196
- if (currentUnregister) {
197
- try {
198
- currentUnregister();
199
- }
200
- catch {
201
- /* ignore */
202
- }
203
- currentUnregister = null;
204
- }
205
- try {
206
- ctx.ui.setWidget(WIDGET_KEY, (tui, theme) => {
207
- tuiRef = tui;
208
- const strip = new WhatsNewStripComponent(summaries, theme);
209
- strip.setInvalidationCallback(() => tui.requestRender());
210
- stripRef = strip;
211
- return strip;
212
- }, { placement: "belowEditor" });
213
- }
214
- catch (err) {
215
- if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
216
- console.error("[forge-cli whats-new] setWidget failed:", err);
217
- }
218
- return;
219
- }
220
- const setFocusToMain = () => {
221
- stripRef?.setFocused(null);
222
- detailRef?.dispose?.();
223
- detailRef = undefined;
224
- safeUi(() => ctx.ui.setOutputSource(null));
225
- };
226
- const commitFocus = () => {
227
- if (!stripRef)
228
- return;
229
- const summary = stripRef.cursorSummary();
230
- if (!summary)
231
- return;
232
- stripRef.setFocused(summary.component);
233
- const lines = renderComponentDetail(summary).split("\n");
234
- if (detailRef) {
235
- detailRef.updateLines(lines);
236
- }
237
- else {
238
- detailRef = new WhatsNewDetailComponent(lines);
239
- if (tuiRef)
240
- detailRef.setInvalidationCallback(() => tuiRef?.requestRender());
241
- }
242
- if (detailRef)
243
- safeUi(() => ctx.ui.setOutputSource(detailRef));
244
- };
245
- // Tear down the entire mount — used by Esc (hide for this session) and
246
- // by `d` (permanent forget). Both unmount the widget surface and drop
247
- // the input-router handler so ↓ stops being captured. The difference is
248
- // whether dismissWhatsNew() is invoked to collapse the prev baseline.
249
- const tearDown = () => {
250
- setFocusToMain();
251
- safeUi(() => ctx.ui.setWidget(WIDGET_KEY, undefined));
252
- stripRef?.clearSummaries();
253
- stripRef = undefined;
254
- if (currentUnregister) {
255
- try {
256
- currentUnregister();
257
- }
258
- catch {
259
- /* ignore */
260
- }
261
- currentUnregister = null;
262
- }
263
- };
264
- const unregister = getInputRouter().register((data) => {
265
- if (!stripRef || !stripRef.hasContent())
266
- return undefined;
267
- if (!stripRef.getStripActive()) {
268
- if (!isDownArrow(data))
269
- return undefined;
270
- const editorText = safeUi(() => ctx.ui.getEditorText());
271
- if (editorText === undefined)
272
- return undefined; // stale ctx
273
- // Stricter than the legacy "no newlines" check — only an
274
- // empty editor activates the strip. Any in-progress text
275
- // (single-line included) means ↓ belongs to the editor.
276
- if (editorText !== "")
277
- return undefined;
278
- stripRef.setStripActive(true);
279
- return { consume: true };
280
- }
281
- if (isLeftArrow(data)) {
282
- stripRef.moveCursor(-1);
283
- return { consume: true };
284
- }
285
- if (isRightArrow(data)) {
286
- stripRef.moveCursor(1);
287
- return { consume: true };
288
- }
289
- if (isUpArrow(data)) {
290
- stripRef.setStripActive(false);
291
- return { consume: true };
292
- }
293
- if (isEnter(data)) {
294
- commitFocus();
295
- return { consume: true };
296
- }
297
- if (isEsc(data)) {
298
- // Soft hide for this session — strip disappears, ↓ is
299
- // released, but the cache is untouched so /changelog can
300
- // re-summon the same set.
301
- tearDown();
302
- return { consume: true };
303
- }
304
- if (isForgetKey(data)) {
305
- // Permanent forget — collapse prev baseline so /changelog
306
- // returns "no recent updates" until the next version bump.
307
- void dismissWhatsNew(rt).catch(() => undefined);
308
- tearDown();
309
- return { consume: true };
310
- }
311
- return undefined;
312
- }, { name: "whats-new-strip", skipWhenOverlayActive: true });
313
- currentUnregister = unregister;
314
- }
315
- function isForgetKey(d) {
316
- return d === "d" || d === "D";
317
- }
318
- /**
319
- * Compute the summaries that should populate the strip when /whats-new is
320
- * invoked: prev baseline first (post auto-dismiss), then lastShown frozen
321
- * baseline (post explicit dismiss). Returns empty when neither yields a
322
- * set — caller falls back to a notify message.
323
- */
324
- async function computeReplaySummaries(rt) {
325
- const cacheDir = rt.cacheDir ?? getUserCacheDir();
326
- const seen = await readSeenState(cacheDir);
327
- const sources = resolveChangelogPaths(rt.pkgRoot);
328
- let s = computeSummaries({ sources, current: rt.current, seen, baseline: "prev" });
329
- if (s.length === 0)
330
- s = computeSummaries({ sources, current: rt.current, seen, baseline: "lastShown" });
331
- return s;
332
- }
333
- /**
334
- * Register the /changelog slash command (overrides pi's built-in): re-mounts
335
- * the interactive strip widget covering pi + forge-plugin + forge-cli changelogs.
336
- * `/changelog dismiss` clears the replay baseline. Headless / non-TTY callers
337
- * fall through to a text notify so the command is still usable.
338
- */
339
- export function registerChangelogCommand(pi, rt) {
340
- pi.registerCommand("changelog", {
341
- description: "Show What's New across pi, forge-plugin, and forge-cli (or /changelog dismiss to clear)",
342
- async handler(args, ctx) {
343
- const arg = args.trim().toLowerCase();
344
- try {
345
- if (arg === "dismiss" || arg === "--dismiss") {
346
- await dismissWhatsNew(rt);
347
- ctx.ui.notify("changelog: dismissed.", "info");
348
- return;
349
- }
350
- const summaries = await computeReplaySummaries(rt);
351
- if (summaries.length === 0) {
352
- ctx.ui.notify("changelog: no recent updates.", "info");
353
- return;
354
- }
355
- if (!ctx.hasUI) {
356
- // Headless / RPC mode — widget surface unavailable; dump text.
357
- const view = await computeWhatsNewView(rt, arg.length > 0 ? arg : null);
358
- ctx.ui.notify(view, "info");
359
- return;
360
- }
361
- // Echo the overall summary into the main chat container so
362
- // users have a record of the change counts, then mount the
363
- // strip below the editor for arrow-key drill-down.
364
- ctx.ui.notify(`${renderSummaryPanel(summaries)}\n\n(Strip is below the editor — ↓ on an empty prompt to activate, ←→ to navigate, Enter to expand, Esc to hide, d to forget.)`, "info");
365
- mountStripWithSummaries(pi, ctx, rt, summaries);
366
- }
367
- catch (err) {
368
- if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
369
- console.error("[forge-cli changelog] handler failed:", err);
370
- }
371
- ctx.ui.notify("changelog: failed to render — set FORGE_DEBUG_WHATS_NEW=1 for details.", "warning");
372
- }
373
- },
374
- });
375
- }
376
- //# sourceMappingURL=whats-new-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"whats-new-widget.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/whats-new-widget.ts"],"names":[],"mappings":"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"}