jfl 0.9.6 → 0.9.7

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 (206) hide show
  1. package/dist/commands/agents.js +1 -1
  2. package/dist/commands/agents.js.map +1 -1
  3. package/dist/commands/context-hub.d.ts.map +1 -1
  4. package/dist/commands/context-hub.js +77 -18
  5. package/dist/commands/context-hub.js.map +1 -1
  6. package/dist/commands/deploy.js +1 -1
  7. package/dist/commands/deploy.js.map +1 -1
  8. package/dist/commands/feedback.js +1 -1
  9. package/dist/commands/feedback.js.map +1 -1
  10. package/dist/commands/hud.js +1 -1
  11. package/dist/commands/hud.js.map +1 -1
  12. package/dist/commands/init-from-service.js +1 -1
  13. package/dist/commands/init-from-service.js.map +1 -1
  14. package/dist/commands/init.js +1 -1
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/login.d.ts +2 -13
  17. package/dist/commands/login.d.ts.map +1 -1
  18. package/dist/commands/login.js +6 -44
  19. package/dist/commands/login.js.map +1 -1
  20. package/dist/commands/organize.d.ts +16 -0
  21. package/dist/commands/organize.d.ts.map +1 -0
  22. package/dist/commands/organize.js +334 -0
  23. package/dist/commands/organize.js.map +1 -0
  24. package/dist/commands/peter.d.ts.map +1 -1
  25. package/dist/commands/peter.js +273 -0
  26. package/dist/commands/peter.js.map +1 -1
  27. package/dist/commands/pi.d.ts.map +1 -1
  28. package/dist/commands/pi.js +8 -2
  29. package/dist/commands/pi.js.map +1 -1
  30. package/dist/commands/repair.js +1 -1
  31. package/dist/commands/repair.js.map +1 -1
  32. package/dist/commands/setup.d.ts.map +1 -1
  33. package/dist/commands/setup.js +113 -45
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/commands/status.d.ts.map +1 -1
  36. package/dist/commands/status.js +4 -4
  37. package/dist/commands/status.js.map +1 -1
  38. package/dist/index.d.ts +0 -6
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +60 -19
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/agent-config.d.ts.map +1 -1
  43. package/dist/lib/agent-config.js +24 -2
  44. package/dist/lib/agent-config.js.map +1 -1
  45. package/dist/lib/hub-health.d.ts.map +1 -1
  46. package/dist/lib/hub-health.js +14 -2
  47. package/dist/lib/hub-health.js.map +1 -1
  48. package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -1
  49. package/dist/lib/resource-optimizer-middleware.js +8 -2
  50. package/dist/lib/resource-optimizer-middleware.js.map +1 -1
  51. package/dist/lib/telemetry.d.ts.map +1 -1
  52. package/dist/lib/telemetry.js +13 -12
  53. package/dist/lib/telemetry.js.map +1 -1
  54. package/dist/utils/auth-status.d.ts +21 -0
  55. package/dist/utils/auth-status.d.ts.map +1 -0
  56. package/dist/utils/auth-status.js +53 -0
  57. package/dist/utils/auth-status.js.map +1 -0
  58. package/package.json +3 -2
  59. package/packages/pi/dist/agent-grid.d.ts +24 -0
  60. package/packages/pi/dist/agent-grid.d.ts.map +1 -0
  61. package/packages/pi/dist/agent-grid.js +162 -0
  62. package/packages/pi/dist/agent-grid.js.map +1 -0
  63. package/packages/pi/dist/agent-names.d.ts +43 -0
  64. package/packages/pi/dist/agent-names.d.ts.map +1 -0
  65. package/packages/pi/dist/agent-names.js +156 -0
  66. package/packages/pi/dist/agent-names.js.map +1 -0
  67. package/packages/pi/dist/autoresearch.d.ts +15 -0
  68. package/packages/pi/dist/autoresearch.d.ts.map +1 -0
  69. package/packages/pi/dist/autoresearch.js +372 -0
  70. package/packages/pi/dist/autoresearch.js.map +1 -0
  71. package/packages/pi/dist/bookmarks.d.ts +15 -0
  72. package/packages/pi/dist/bookmarks.d.ts.map +1 -0
  73. package/packages/pi/dist/bookmarks.js +77 -0
  74. package/packages/pi/dist/bookmarks.js.map +1 -0
  75. package/packages/pi/dist/context.d.ts +17 -0
  76. package/packages/pi/dist/context.d.ts.map +1 -0
  77. package/packages/pi/dist/context.js +152 -0
  78. package/packages/pi/dist/context.js.map +1 -0
  79. package/packages/pi/dist/crm-tool.d.ts +12 -0
  80. package/packages/pi/dist/crm-tool.d.ts.map +1 -0
  81. package/packages/pi/dist/crm-tool.js +58 -0
  82. package/packages/pi/dist/crm-tool.js.map +1 -0
  83. package/packages/pi/dist/eval-tool.d.ts +11 -0
  84. package/packages/pi/dist/eval-tool.d.ts.map +1 -0
  85. package/packages/pi/dist/eval-tool.js +188 -0
  86. package/packages/pi/dist/eval-tool.js.map +1 -0
  87. package/packages/pi/dist/eval.d.ts +12 -0
  88. package/packages/pi/dist/eval.d.ts.map +1 -0
  89. package/packages/pi/dist/eval.js +43 -0
  90. package/packages/pi/dist/eval.js.map +1 -0
  91. package/packages/pi/dist/footer.d.ts +20 -0
  92. package/packages/pi/dist/footer.d.ts.map +1 -0
  93. package/packages/pi/dist/footer.js +222 -0
  94. package/packages/pi/dist/footer.js.map +1 -0
  95. package/packages/pi/dist/header.d.ts +17 -0
  96. package/packages/pi/dist/header.d.ts.map +1 -0
  97. package/packages/pi/dist/header.js +156 -0
  98. package/packages/pi/dist/header.js.map +1 -0
  99. package/packages/pi/dist/hub-resolver.d.ts +11 -0
  100. package/packages/pi/dist/hub-resolver.d.ts.map +1 -0
  101. package/packages/pi/dist/hub-resolver.js +58 -0
  102. package/packages/pi/dist/hub-resolver.js.map +1 -0
  103. package/packages/pi/dist/hub-tools.d.ts +14 -0
  104. package/packages/pi/dist/hub-tools.d.ts.map +1 -0
  105. package/packages/pi/dist/hub-tools.js +266 -0
  106. package/packages/pi/dist/hub-tools.js.map +1 -0
  107. package/packages/pi/dist/hud-tool.d.ts +17 -0
  108. package/packages/pi/dist/hud-tool.d.ts.map +1 -0
  109. package/packages/pi/dist/hud-tool.js +297 -0
  110. package/packages/pi/dist/hud-tool.js.map +1 -0
  111. package/packages/pi/dist/index.d.ts +12 -0
  112. package/packages/pi/dist/index.d.ts.map +1 -0
  113. package/packages/pi/dist/index.js +436 -0
  114. package/packages/pi/dist/index.js.map +1 -0
  115. package/packages/pi/dist/jfl-resolve.d.ts +29 -0
  116. package/packages/pi/dist/jfl-resolve.d.ts.map +1 -0
  117. package/packages/pi/dist/jfl-resolve.js +89 -0
  118. package/packages/pi/dist/jfl-resolve.js.map +1 -0
  119. package/packages/pi/dist/journal.d.ts +23 -0
  120. package/packages/pi/dist/journal.d.ts.map +1 -0
  121. package/packages/pi/dist/journal.js +250 -0
  122. package/packages/pi/dist/journal.js.map +1 -0
  123. package/packages/pi/dist/map-bridge.d.ts +20 -0
  124. package/packages/pi/dist/map-bridge.d.ts.map +1 -0
  125. package/packages/pi/dist/map-bridge.js +181 -0
  126. package/packages/pi/dist/map-bridge.js.map +1 -0
  127. package/packages/pi/dist/memory-tool.d.ts +11 -0
  128. package/packages/pi/dist/memory-tool.d.ts.map +1 -0
  129. package/packages/pi/dist/memory-tool.js +148 -0
  130. package/packages/pi/dist/memory-tool.js.map +1 -0
  131. package/packages/pi/dist/notifications.d.ts +15 -0
  132. package/packages/pi/dist/notifications.d.ts.map +1 -0
  133. package/packages/pi/dist/notifications.js +65 -0
  134. package/packages/pi/dist/notifications.js.map +1 -0
  135. package/packages/pi/dist/onboarding-v1.d.ts +15 -0
  136. package/packages/pi/dist/onboarding-v1.d.ts.map +1 -0
  137. package/packages/pi/dist/onboarding-v1.js +417 -0
  138. package/packages/pi/dist/onboarding-v1.js.map +1 -0
  139. package/packages/pi/dist/onboarding-v2.d.ts +18 -0
  140. package/packages/pi/dist/onboarding-v2.d.ts.map +1 -0
  141. package/packages/pi/dist/onboarding-v2.js +402 -0
  142. package/packages/pi/dist/onboarding-v2.js.map +1 -0
  143. package/packages/pi/dist/onboarding-v3.d.ts +13 -0
  144. package/packages/pi/dist/onboarding-v3.d.ts.map +1 -0
  145. package/packages/pi/dist/onboarding-v3.js +581 -0
  146. package/packages/pi/dist/onboarding-v3.js.map +1 -0
  147. package/packages/pi/dist/peter-parker.d.ts +12 -0
  148. package/packages/pi/dist/peter-parker.d.ts.map +1 -0
  149. package/packages/pi/dist/peter-parker.js +162 -0
  150. package/packages/pi/dist/peter-parker.js.map +1 -0
  151. package/packages/pi/dist/pivot-tool.d.ts +11 -0
  152. package/packages/pi/dist/pivot-tool.d.ts.map +1 -0
  153. package/packages/pi/dist/pivot-tool.js +56 -0
  154. package/packages/pi/dist/pivot-tool.js.map +1 -0
  155. package/packages/pi/dist/policy-head-tool.d.ts +15 -0
  156. package/packages/pi/dist/policy-head-tool.d.ts.map +1 -0
  157. package/packages/pi/dist/policy-head-tool.js +220 -0
  158. package/packages/pi/dist/policy-head-tool.js.map +1 -0
  159. package/packages/pi/dist/portfolio-bridge.d.ts +12 -0
  160. package/packages/pi/dist/portfolio-bridge.d.ts.map +1 -0
  161. package/packages/pi/dist/portfolio-bridge.js +81 -0
  162. package/packages/pi/dist/portfolio-bridge.js.map +1 -0
  163. package/packages/pi/dist/service-skills.d.ts +15 -0
  164. package/packages/pi/dist/service-skills.d.ts.map +1 -0
  165. package/packages/pi/dist/service-skills.js +198 -0
  166. package/packages/pi/dist/service-skills.js.map +1 -0
  167. package/packages/pi/dist/session.d.ts +24 -0
  168. package/packages/pi/dist/session.d.ts.map +1 -0
  169. package/packages/pi/dist/session.js +394 -0
  170. package/packages/pi/dist/session.js.map +1 -0
  171. package/packages/pi/dist/shortcuts.d.ts +11 -0
  172. package/packages/pi/dist/shortcuts.d.ts.map +1 -0
  173. package/packages/pi/dist/shortcuts.js +231 -0
  174. package/packages/pi/dist/shortcuts.js.map +1 -0
  175. package/packages/pi/dist/startup-briefing.d.ts +13 -0
  176. package/packages/pi/dist/startup-briefing.d.ts.map +1 -0
  177. package/packages/pi/dist/startup-briefing.js +271 -0
  178. package/packages/pi/dist/startup-briefing.js.map +1 -0
  179. package/packages/pi/dist/stratus-bridge.d.ts +14 -0
  180. package/packages/pi/dist/stratus-bridge.d.ts.map +1 -0
  181. package/packages/pi/dist/stratus-bridge.js +104 -0
  182. package/packages/pi/dist/stratus-bridge.js.map +1 -0
  183. package/packages/pi/dist/subway-mesh.d.ts +88 -0
  184. package/packages/pi/dist/subway-mesh.d.ts.map +1 -0
  185. package/packages/pi/dist/subway-mesh.js +813 -0
  186. package/packages/pi/dist/subway-mesh.js.map +1 -0
  187. package/packages/pi/dist/synopsis-tool.d.ts +12 -0
  188. package/packages/pi/dist/synopsis-tool.d.ts.map +1 -0
  189. package/packages/pi/dist/synopsis-tool.js +84 -0
  190. package/packages/pi/dist/synopsis-tool.js.map +1 -0
  191. package/packages/pi/dist/tool-renderers.d.ts +55 -0
  192. package/packages/pi/dist/tool-renderers.d.ts.map +1 -0
  193. package/packages/pi/dist/tool-renderers.js +349 -0
  194. package/packages/pi/dist/tool-renderers.js.map +1 -0
  195. package/packages/pi/dist/training-buffer-tool.d.ts +16 -0
  196. package/packages/pi/dist/training-buffer-tool.d.ts.map +1 -0
  197. package/packages/pi/dist/training-buffer-tool.js +319 -0
  198. package/packages/pi/dist/training-buffer-tool.js.map +1 -0
  199. package/packages/pi/dist/types.d.ts +195 -0
  200. package/packages/pi/dist/types.d.ts.map +1 -0
  201. package/packages/pi/dist/types.js +11 -0
  202. package/packages/pi/dist/types.js.map +1 -0
  203. package/packages/pi/extensions/session.ts +115 -8
  204. package/packages/pi/extensions/training-buffer-tool.ts +15 -8
  205. package/packages/pi/extensions/types.ts +1 -0
  206. package/packages/pi/package.json +2 -3
@@ -0,0 +1,436 @@
1
+ /**
2
+ * JFL Pi Extension — Master Entry (Factory Function)
3
+ *
4
+ * Pi loads this as a factory: export default async function(pi: ExtensionAPI).
5
+ * We construct a PiContext shim exposing full Pi TUI capabilities to all
6
+ * JFL sub-extensions: overlays, custom footer, shortcuts, tool rendering,
7
+ * interactive dialogs, notifications, state persistence, and more.
8
+ *
9
+ * @purpose Master entry point for @jfl/pi — full TUI-powered extension
10
+ */
11
+ import { readFileSync, existsSync } from "fs";
12
+ import { join } from "path";
13
+ import { execSync } from "child_process";
14
+ import { setupSession, onShutdown, getSessionBranch } from "./session.js";
15
+ import { setupContext, injectContext } from "./context.js";
16
+ import { setupJournal, checkJournalBeforeCompact, onJournalAgentEnd, onToolExecutionEnd, checkPurposeHeader, hasJournalEntryForSession } from "./journal.js";
17
+ import { setupMapBridge, onMapBridgeShutdown, onMapToolEnd } from "./map-bridge.js";
18
+ import { setupEval, onAgentEnd as onEvalEnd } from "./eval.js";
19
+ import { setupHudTool, updateHudWidget } from "./hud-tool.js";
20
+ import { setupCrmTool } from "./crm-tool.js";
21
+ import { setupMemoryTool } from "./memory-tool.js";
22
+ import { setupSynopsisTool } from "./synopsis-tool.js";
23
+ import { setupPivotTool } from "./pivot-tool.js";
24
+ import { initStratusBridge, onAgentStart as onStratusStart, onAgentEnd as onStratusEnd } from "./stratus-bridge.js";
25
+ import { setupPeterParker } from "./peter-parker.js";
26
+ import { setupPortfolioBridge, onPortfolioShutdown } from "./portfolio-bridge.js";
27
+ import { setupAgentGrid } from "./agent-grid.js";
28
+ import { initAgentNames } from "./agent-names.js";
29
+ import { setupEvalTool } from "./eval-tool.js";
30
+ import { setupPolicyHeadTool } from "./policy-head-tool.js";
31
+ import { setupTrainingBufferTool, onTrainingAgentEnd } from "./training-buffer-tool.js";
32
+ import { setupAutoresearch } from "./autoresearch.js";
33
+ import { setupServiceSkills } from "./service-skills.js";
34
+ import { setupHubTools } from "./hub-tools.js";
35
+ import { setupFooter } from "./footer.js";
36
+ import { setupShortcuts } from "./shortcuts.js";
37
+ import { setupNotifications } from "./notifications.js";
38
+ import { setupBookmarks } from "./bookmarks.js";
39
+ import { setupSubwayMesh, injectMeshContext, onMeshShutdown } from "./subway-mesh.js";
40
+ import { fireStartupBriefing } from "./startup-briefing.js";
41
+ import { setupHeader } from "./header.js";
42
+ import { setupOnboarding as setupOnboardingV1 } from "./onboarding-v1.js";
43
+ import { setupOnboarding as setupOnboardingV2 } from "./onboarding-v2.js";
44
+ import { setupOnboarding as setupOnboardingV3 } from "./onboarding-v3.js";
45
+ function selectOnboarding(config) {
46
+ const variant = process.env.JFL_ONBOARDING_VARIANT ?? config.pi?.onboarding_variant ?? "v2";
47
+ switch (variant) {
48
+ case "v1": return setupOnboardingV1;
49
+ case "v3": return setupOnboardingV3;
50
+ case "v2":
51
+ default: return setupOnboardingV2;
52
+ }
53
+ }
54
+ function readJflConfig(projectRoot) {
55
+ const configPath = join(projectRoot, ".jfl", "config.json");
56
+ if (!existsSync(configPath))
57
+ return {};
58
+ try {
59
+ return JSON.parse(readFileSync(configPath, "utf-8"));
60
+ }
61
+ catch {
62
+ return {};
63
+ }
64
+ }
65
+ function getProjectName(projectRoot, config) {
66
+ if (config.name)
67
+ return config.name;
68
+ const visionPath = join(projectRoot, "knowledge", "VISION.md");
69
+ if (existsSync(visionPath)) {
70
+ const content = readFileSync(visionPath, "utf-8");
71
+ const match = content.match(/^#\s+(.+)/m);
72
+ if (match)
73
+ return match[1].trim();
74
+ }
75
+ return projectRoot.split("/").pop() ?? "JFL Project";
76
+ }
77
+ function getCurrentBranch(root) {
78
+ try {
79
+ return execSync("git branch --show-current", { cwd: root, stdio: ["pipe", "pipe", "ignore"] })
80
+ .toString().trim() || "main";
81
+ }
82
+ catch {
83
+ return "main";
84
+ }
85
+ }
86
+ // ─── Dedup guard ─────────────────────────────────────────────────────────────
87
+ // When developing jfl-cli locally, Pi discovers the extension from BOTH the
88
+ // local packages/pi/ AND the global npm-installed jfl package. Both run as
89
+ // separate factory calls in the same process. This guard ensures only the
90
+ // first one initializes — which is the local dev version (Pi loads project-
91
+ // local extensions before global packages).
92
+ const JFL_LOADED = Symbol.for("jfl-pi-extension-loaded");
93
+ // ─── Pi extension factory function ───────────────────────────────────────────
94
+ export default async function jflExtension(pi) {
95
+ // Skip if already loaded from another source (dedup)
96
+ if (globalThis[JFL_LOADED]) {
97
+ return;
98
+ }
99
+ globalThis[JFL_LOADED] = true;
100
+ let projectCwd = process.cwd();
101
+ let latestPiCtx = null;
102
+ const internalHandlers = new Map();
103
+ function jflOn(event, handler) {
104
+ const list = internalHandlers.get(event) ?? [];
105
+ list.push(handler);
106
+ internalHandlers.set(event, list);
107
+ }
108
+ function jflEmit(event, data) {
109
+ const list = internalHandlers.get(event) ?? [];
110
+ list.forEach(h => Promise.resolve(h(data)).catch(() => { }));
111
+ }
112
+ // ─── Theme helper ───────────────────────────────────────────────────────────
113
+ function getTheme() {
114
+ if (latestPiCtx?.ui?.theme)
115
+ return latestPiCtx.ui.theme;
116
+ return {
117
+ fg: (_color, text) => text,
118
+ bg: (_color, text) => text,
119
+ bold: (text) => text,
120
+ };
121
+ }
122
+ // ─── PiContext shim — full TUI capabilities ─────────────────────────────────
123
+ const ctx = {
124
+ get session() {
125
+ return {
126
+ projectRoot: projectCwd,
127
+ id: pi.getSessionName?.() ?? "jfl",
128
+ branch: getSessionBranch() || getCurrentBranch(projectCwd),
129
+ };
130
+ },
131
+ log: (msg, level) => {
132
+ // Only show debug messages if JFL_DEBUG is set
133
+ if (level === "debug" && !process.env.JFL_DEBUG)
134
+ return;
135
+ const prefix = level === "debug" ? "[JFL debug]" : "[JFL]";
136
+ console.log(`${prefix} ${msg}`);
137
+ },
138
+ emit: jflEmit,
139
+ on: jflOn,
140
+ registerTool: (tool) => {
141
+ pi.registerTool({
142
+ name: tool.name,
143
+ label: tool.label ?? tool.name,
144
+ description: tool.description,
145
+ promptSnippet: tool.promptSnippet,
146
+ promptGuidelines: tool.promptGuidelines,
147
+ parameters: tool.inputSchema,
148
+ async execute(_id, params) {
149
+ try {
150
+ const result = await tool.handler(params);
151
+ return {
152
+ content: [{ type: "text", text: result }],
153
+ details: { raw: result, toolName: tool.name },
154
+ };
155
+ }
156
+ catch (err) {
157
+ throw new Error(`${err}`);
158
+ }
159
+ },
160
+ renderCall: tool.renderCall
161
+ ? (args, theme) => tool.renderCall(args, theme)
162
+ : undefined,
163
+ renderResult: tool.renderResult
164
+ ? (result, options, theme) => tool.renderResult(result, options, theme)
165
+ : undefined,
166
+ });
167
+ },
168
+ registerCommand: (cmd) => {
169
+ pi.registerCommand(cmd.name, {
170
+ description: cmd.description,
171
+ handler: async (args, piCtx) => {
172
+ latestPiCtx = piCtx;
173
+ await cmd.handler(args, ctx);
174
+ },
175
+ });
176
+ },
177
+ registerShortcut: (key, opts) => {
178
+ pi.registerShortcut(key, {
179
+ description: opts.description,
180
+ handler: async (piCtx) => {
181
+ latestPiCtx = piCtx;
182
+ await opts.handler();
183
+ },
184
+ });
185
+ },
186
+ ui: {
187
+ notify: (msg, opts) => {
188
+ const type = opts?.level ?? "info";
189
+ if (latestPiCtx?.ui?.notify) {
190
+ latestPiCtx.ui.notify(msg, type);
191
+ }
192
+ else {
193
+ console.log(`[JFL ${type}] ${msg}`);
194
+ }
195
+ },
196
+ input: async (title, placeholder) => {
197
+ if (latestPiCtx?.ui?.input)
198
+ return latestPiCtx.ui.input(title, placeholder);
199
+ return undefined;
200
+ },
201
+ confirm: async (title, message) => {
202
+ if (latestPiCtx?.ui?.confirm)
203
+ return latestPiCtx.ui.confirm(title, message);
204
+ return false;
205
+ },
206
+ select: async (title, items) => {
207
+ if (latestPiCtx?.ui?.select)
208
+ return latestPiCtx.ui.select(title, items);
209
+ return null;
210
+ },
211
+ editor: async (title, content) => {
212
+ if (latestPiCtx?.ui?.editor)
213
+ return latestPiCtx.ui.editor(title, content);
214
+ return undefined;
215
+ },
216
+ custom: async (factory, opts) => {
217
+ if (latestPiCtx?.ui?.custom)
218
+ return latestPiCtx.ui.custom(factory, opts);
219
+ return undefined;
220
+ },
221
+ setWidget: (id, content, opts) => {
222
+ if (!latestPiCtx?.ui?.setWidget)
223
+ return;
224
+ if (content === undefined) {
225
+ latestPiCtx.ui.setWidget(id, undefined);
226
+ }
227
+ else if (typeof content === "function") {
228
+ latestPiCtx.ui.setWidget(id, content, opts);
229
+ }
230
+ else {
231
+ latestPiCtx.ui.setWidget(id, content, opts);
232
+ }
233
+ },
234
+ setStatus: (key, text) => {
235
+ if (latestPiCtx?.ui?.setStatus)
236
+ latestPiCtx.ui.setStatus(key, text);
237
+ },
238
+ setFooter: (factory) => {
239
+ if (latestPiCtx?.ui?.setFooter)
240
+ latestPiCtx.ui.setFooter(factory);
241
+ },
242
+ setHeader: (factory) => {
243
+ if (latestPiCtx?.ui?.setHeader)
244
+ latestPiCtx.ui.setHeader(factory);
245
+ },
246
+ setEditorText: (text) => {
247
+ if (latestPiCtx?.ui?.setEditorText)
248
+ latestPiCtx.ui.setEditorText(text);
249
+ },
250
+ get theme() {
251
+ return getTheme();
252
+ },
253
+ get hasUI() {
254
+ return latestPiCtx?.hasUI ?? false;
255
+ },
256
+ },
257
+ pi: {
258
+ setSessionName: (name) => pi.setSessionName(name),
259
+ appendEntry: (type, data) => {
260
+ if (pi.appendEntry)
261
+ pi.appendEntry(type, data);
262
+ },
263
+ setLabel: (entryId, label) => {
264
+ if (pi.setLabel)
265
+ pi.setLabel(entryId, label);
266
+ },
267
+ sendMessage: (msg, opts) => {
268
+ if (pi.sendMessage)
269
+ pi.sendMessage(msg, opts);
270
+ },
271
+ events: {
272
+ on: (event, handler) => {
273
+ if (pi.events?.on)
274
+ pi.events.on(event, handler);
275
+ },
276
+ emit: (event, data) => {
277
+ if (pi.events?.emit)
278
+ pi.events.emit(event, data);
279
+ },
280
+ },
281
+ getActiveTools: () => pi.getActiveTools?.() ?? [],
282
+ getAllTools: () => pi.getAllTools?.() ?? [],
283
+ exec: async (command, args, opts) => {
284
+ if (pi.exec)
285
+ return pi.exec(command, args, opts);
286
+ return { stdout: "", stderr: "exec unavailable", code: 1 };
287
+ },
288
+ get sessionManager() { return latestPiCtx?.sessionManager; },
289
+ get model() { return latestPiCtx?.model; },
290
+ },
291
+ cancel: () => ({ cancel: true }),
292
+ };
293
+ // ─── Session tracking state ────────────────────────────────────────────────
294
+ let turnCount = 0;
295
+ let sessionStartTime = Date.now();
296
+ let currentModel = "";
297
+ // ─── Lifecycle handlers ────────────────────────────────────────────────────
298
+ pi.on("session_start", async (_event, piCtx) => {
299
+ latestPiCtx = piCtx;
300
+ projectCwd = piCtx.cwd;
301
+ turnCount = 0;
302
+ sessionStartTime = Date.now();
303
+ currentModel = piCtx.model?.id ?? "";
304
+ const config = readJflConfig(projectCwd);
305
+ const projectName = getProjectName(projectCwd, config);
306
+ pi.setSessionName(`JFL: ${projectName}`);
307
+ // ─── Header first — replace Pi's default before anything renders ──
308
+ setupHeader(ctx, config);
309
+ // ─── Hub first, then animation + tools in parallel ─────────────
310
+ // Hub must be up before onboarding probes fire.
311
+ // setupContext starts hub + registers jfl_context tool.
312
+ await setupContext(ctx, config);
313
+ // Now hub is up — run animation + remaining setup in parallel
314
+ const doSetup = async () => {
315
+ await setupMapBridge(ctx, config);
316
+ await setupSession(ctx, config);
317
+ await setupJournal(ctx, config);
318
+ await setupEval(ctx, config);
319
+ setupHudTool(ctx);
320
+ setupCrmTool(ctx);
321
+ setupMemoryTool(ctx);
322
+ setupSynopsisTool(ctx);
323
+ setupPivotTool(ctx);
324
+ await setupEvalTool(ctx, config);
325
+ await setupPolicyHeadTool(ctx, config);
326
+ await setupTrainingBufferTool(ctx, config);
327
+ await setupAutoresearch(ctx, config);
328
+ await setupServiceSkills(ctx, config);
329
+ await setupHubTools(ctx, config);
330
+ await setupSubwayMesh(ctx, config);
331
+ initStratusBridge(projectCwd);
332
+ initAgentNames(projectCwd);
333
+ await setupPeterParker(ctx, config);
334
+ await setupPortfolioBridge(ctx, config);
335
+ setupAgentGrid(ctx);
336
+ setupFooter(ctx, config, { turnCount: () => turnCount, sessionStart: () => sessionStartTime, model: () => currentModel });
337
+ if (!config.pi?.disable_shortcuts)
338
+ setupShortcuts(ctx, config);
339
+ if (!config.pi?.disable_notifications)
340
+ setupNotifications(ctx, config);
341
+ setupBookmarks(ctx);
342
+ };
343
+ const onboard = config.pi?.disable_onboarding ? null : selectOnboarding(config);
344
+ await Promise.all([
345
+ onboard ? onboard(ctx, config).catch(() => { }) : Promise.resolve(),
346
+ doSetup(),
347
+ ]);
348
+ ctx.log(`JFL: ${projectName} — session ready`);
349
+ // Fire startup briefing — gathers synopsis, PRs, team activity, next actions
350
+ // and steers the model to produce a concise "here's where things stand" greeting
351
+ if (config.pi?.auto_start !== false) {
352
+ await fireStartupBriefing(ctx, config);
353
+ }
354
+ });
355
+ pi.on("session_shutdown", async (_event, piCtx) => {
356
+ latestPiCtx = piCtx;
357
+ onMeshShutdown();
358
+ await onPortfolioShutdown(ctx);
359
+ await onShutdown(ctx);
360
+ await onMapBridgeShutdown(ctx);
361
+ });
362
+ pi.on("session_before_compact", async (_event, piCtx) => {
363
+ latestPiCtx = piCtx;
364
+ return checkJournalBeforeCompact(ctx);
365
+ });
366
+ pi.on("before_agent_start", async (event, _piCtx) => {
367
+ const result = await injectContext(ctx, event);
368
+ const meshState = injectMeshContext();
369
+ const additions = [
370
+ result?.systemPromptAddition,
371
+ meshState,
372
+ ].filter(Boolean).join("\n\n");
373
+ if (additions) {
374
+ const current = event.systemPrompt ?? "";
375
+ return {
376
+ systemPrompt: current
377
+ ? `${current}\n\n${additions}`
378
+ : additions,
379
+ };
380
+ }
381
+ });
382
+ pi.on("agent_start", async (event, piCtx) => {
383
+ latestPiCtx = piCtx;
384
+ await onStratusStart(ctx, event);
385
+ jflEmit("agent:start", event);
386
+ });
387
+ pi.on("agent_end", async (event, piCtx) => {
388
+ latestPiCtx = piCtx;
389
+ await onStratusEnd(ctx, event);
390
+ await onEvalEnd(ctx, event);
391
+ await onTrainingAgentEnd(ctx, event);
392
+ await updateHudWidget(ctx);
393
+ await onJournalAgentEnd(ctx, event);
394
+ jflEmit("agent:end", event);
395
+ });
396
+ pi.on("turn_start", async (event, piCtx) => {
397
+ latestPiCtx = piCtx;
398
+ turnCount++;
399
+ jflEmit("turn:start", { ...event, turnCount });
400
+ });
401
+ pi.on("turn_end", async (event, piCtx) => {
402
+ latestPiCtx = piCtx;
403
+ jflEmit("turn:end", { ...event, turnCount });
404
+ });
405
+ // UserPromptSubmit equivalent — detect approval/done patterns in user input
406
+ pi.on("input", async (event, _piCtx) => {
407
+ const text = (event.text ?? "").trim();
408
+ if (!text)
409
+ return { action: "continue" };
410
+ const approvalPatterns = /\b(done|approved|ship it|looks good|lgtm|merge it|go ahead|good to go)\b/i;
411
+ if (approvalPatterns.test(text)) {
412
+ const branch = getCurrentBranch(ctx.session.projectRoot);
413
+ const hasJournal = hasJournalEntryForSession(ctx.session.projectRoot, branch);
414
+ if (!hasJournal) {
415
+ // Transform: append journal reminder to the user's message
416
+ return {
417
+ action: "transform",
418
+ text: `${event.text}\n\n[System: The user just approved/completed something. Write a journal entry NOW before proceeding — capture what was approved, decisions made, and next steps. Use the journal format from CLAUDE.md.]`,
419
+ };
420
+ }
421
+ }
422
+ return { action: "continue" };
423
+ });
424
+ pi.on("tool_execution_end", async (event, piCtx) => {
425
+ latestPiCtx = piCtx;
426
+ await onToolExecutionEnd(ctx, event); // git commit → journal nudge
427
+ checkPurposeHeader(ctx, event); // Write/Edit → @purpose check
428
+ await onMapToolEnd(ctx, event); // hub event bus
429
+ });
430
+ pi.on("model_select", async (event, piCtx) => {
431
+ latestPiCtx = piCtx;
432
+ currentModel = event.model?.id ?? "";
433
+ jflEmit("model:changed", event);
434
+ });
435
+ }
436
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../extensions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolve jfl-cli library modules at runtime.
3
+ *
4
+ * Extensions can't use relative imports like ../../src/lib/foo.js because
5
+ * the path only works when running from the jfl-cli source tree. When Pi
6
+ * loads us as a package, we need to find jfl's actual install location.
7
+ *
8
+ * Resolution order:
9
+ * 1. JFL_CLI_DIR env var (explicit override)
10
+ * 2. `which jfl` → follow symlink → dist/index.js → repo root
11
+ * 3. npm global: /opt/homebrew/lib/node_modules/jfl/
12
+ * 4. Fallback: ../../ (source tree — dev only)
13
+ *
14
+ * @purpose Resolve jfl-cli library paths for Pi extension imports
15
+ */
16
+ /**
17
+ * Import a jfl-cli library module by name.
18
+ *
19
+ * Usage:
20
+ * const { PolicyHeadInference } = await jflImport("policy-head")
21
+ * const { TrainingBuffer } = await jflImport("training-buffer")
22
+ * const { phoneHomeToPortfolio } = await jflImport("service-gtm")
23
+ */
24
+ export declare function jflImport(moduleName: string): Promise<any>;
25
+ /**
26
+ * Get the jfl-cli root directory.
27
+ */
28
+ export declare function getJflRoot(): string;
29
+ //# sourceMappingURL=jfl-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jfl-resolve.d.ts","sourceRoot":"","sources":["../extensions/jfl-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA2DH;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAShE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Resolve jfl-cli library modules at runtime.
3
+ *
4
+ * Extensions can't use relative imports like ../../src/lib/foo.js because
5
+ * the path only works when running from the jfl-cli source tree. When Pi
6
+ * loads us as a package, we need to find jfl's actual install location.
7
+ *
8
+ * Resolution order:
9
+ * 1. JFL_CLI_DIR env var (explicit override)
10
+ * 2. `which jfl` → follow symlink → dist/index.js → repo root
11
+ * 3. npm global: /opt/homebrew/lib/node_modules/jfl/
12
+ * 4. Fallback: ../../ (source tree — dev only)
13
+ *
14
+ * @purpose Resolve jfl-cli library paths for Pi extension imports
15
+ */
16
+ import { existsSync, realpathSync } from "fs";
17
+ import { join, dirname, resolve } from "path";
18
+ import { execSync } from "child_process";
19
+ let jflRoot = null;
20
+ function findJflRoot() {
21
+ if (jflRoot)
22
+ return jflRoot;
23
+ // 1. Explicit env
24
+ if (process.env.JFL_CLI_DIR) {
25
+ const dir = process.env.JFL_CLI_DIR;
26
+ if (existsSync(join(dir, "dist", "lib"))) {
27
+ jflRoot = dir;
28
+ return dir;
29
+ }
30
+ }
31
+ // 2. Follow `which jfl` symlink
32
+ try {
33
+ const jflBin = execSync("which jfl", { encoding: "utf-8", stdio: ["pipe", "pipe", "ignore"] }).trim();
34
+ if (jflBin) {
35
+ const realPath = realpathSync(jflBin);
36
+ // realPath is like /path/to/jfl-cli/dist/index.js
37
+ const distDir = dirname(realPath);
38
+ const root = dirname(distDir);
39
+ if (existsSync(join(root, "dist", "lib"))) {
40
+ jflRoot = root;
41
+ return root;
42
+ }
43
+ }
44
+ }
45
+ catch { }
46
+ // 3. npm global locations
47
+ const npmGlobalPaths = [
48
+ "/opt/homebrew/lib/node_modules/jfl",
49
+ "/usr/local/lib/node_modules/jfl",
50
+ ];
51
+ for (const p of npmGlobalPaths) {
52
+ if (existsSync(join(p, "dist", "lib"))) {
53
+ jflRoot = p;
54
+ return p;
55
+ }
56
+ }
57
+ // 4. Fallback: source tree (dev only)
58
+ const devRoot = resolve(dirname(new URL(import.meta.url).pathname), "..", "..");
59
+ if (existsSync(join(devRoot, "dist", "lib"))) {
60
+ jflRoot = devRoot;
61
+ return devRoot;
62
+ }
63
+ // Last resort
64
+ jflRoot = devRoot;
65
+ return devRoot;
66
+ }
67
+ /**
68
+ * Import a jfl-cli library module by name.
69
+ *
70
+ * Usage:
71
+ * const { PolicyHeadInference } = await jflImport("policy-head")
72
+ * const { TrainingBuffer } = await jflImport("training-buffer")
73
+ * const { phoneHomeToPortfolio } = await jflImport("service-gtm")
74
+ */
75
+ export async function jflImport(moduleName) {
76
+ const root = findJflRoot();
77
+ const modulePath = join(root, "dist", "lib", `${moduleName}.js`);
78
+ if (!existsSync(modulePath)) {
79
+ throw new Error(`jfl module not found: ${moduleName} (looked in ${modulePath})`);
80
+ }
81
+ return import(modulePath);
82
+ }
83
+ /**
84
+ * Get the jfl-cli root directory.
85
+ */
86
+ export function getJflRoot() {
87
+ return findJflRoot();
88
+ }
89
+ //# sourceMappingURL=jfl-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jfl-resolve.js","sourceRoot":"","sources":["../extensions/jfl-resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Journal Extension
3
+ *
4
+ * Detects git commits via tool_execution_end, prompts for journal entries,
5
+ * registers the /journal command with interactive type selection,
6
+ * shows themed journal stream in below-editor widget.
7
+ *
8
+ * @purpose Auto-journal detection + interactive /journal command + themed widget
9
+ */
10
+ import type { PiContext, JflConfig, AgentEndEvent, ToolExecutionEvent } from "./types.js";
11
+ export declare function hasJournalEntryForSession(root: string, sessionBranch: string): boolean;
12
+ export declare function setupJournal(ctx: PiContext, _config: JflConfig): Promise<void>;
13
+ export declare function onToolExecutionEnd(ctx: PiContext, event: ToolExecutionEvent): Promise<void>;
14
+ export declare function onJournalAgentEnd(_ctx: PiContext, _event: AgentEndEvent): Promise<void>;
15
+ /**
16
+ * Check @purpose header on Write/Edit to code files.
17
+ * Equivalent to Claude Code's PostToolUse(Write|Edit) hook.
18
+ */
19
+ export declare function checkPurposeHeader(ctx: PiContext, event: ToolExecutionEvent): void;
20
+ export declare function checkJournalBeforeCompact(ctx: PiContext): Promise<{
21
+ cancel: true;
22
+ } | void>;
23
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../extensions/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAW,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAgDlG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAKtF;AA0BD,wBAAsB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EpF;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,kBAAkB,GACxB,IAAI,CAyBN;AAiCD,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,SAAS,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBlC"}