@proletariat/cli 0.3.85 → 0.3.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/validate-better-sqlite3.cjs +11 -0
- package/dist/commands/config/index.js +42 -0
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/session/cleanup.d.ts +2 -0
- package/dist/commands/session/cleanup.js +89 -42
- package/dist/commands/session/cleanup.js.map +1 -1
- package/dist/commands/session/index.js +4 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/commands/session/poke.d.ts +3 -7
- package/dist/commands/session/poke.js +5 -7
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/session/report.d.ts +27 -0
- package/dist/commands/session/report.js +217 -0
- package/dist/commands/session/report.js.map +1 -0
- package/dist/commands/telemetry/disable.js +1 -1
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +1 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/ticket/cancel.js +2 -0
- package/dist/commands/ticket/cancel.js.map +1 -1
- package/dist/commands/ticket/complete.js +2 -0
- package/dist/commands/ticket/complete.js.map +1 -1
- package/dist/commands/ticket/create.d.ts +3 -2
- package/dist/commands/ticket/create.js +6 -69
- package/dist/commands/ticket/create.js.map +1 -1
- package/dist/commands/ticket/delete.js +2 -0
- package/dist/commands/ticket/delete.js.map +1 -1
- package/dist/commands/ticket/edit.js +5 -0
- package/dist/commands/ticket/edit.js.map +1 -1
- package/dist/commands/ticket/move.js +2 -0
- package/dist/commands/ticket/move.js.map +1 -1
- package/dist/commands/ticket/project.js +2 -0
- package/dist/commands/ticket/project.js.map +1 -1
- package/dist/commands/ticket/reassign.js +2 -0
- package/dist/commands/ticket/reassign.js.map +1 -1
- package/dist/commands/ticket/resolve.js +2 -0
- package/dist/commands/ticket/resolve.js.map +1 -1
- package/dist/commands/ticket/update.js +5 -0
- package/dist/commands/ticket/update.js.map +1 -1
- package/dist/commands/work/complete.js +2 -0
- package/dist/commands/work/complete.js.map +1 -1
- package/dist/commands/work/groom.d.ts +15 -0
- package/dist/commands/work/groom.js +77 -0
- package/dist/commands/work/groom.js.map +1 -0
- package/dist/commands/work/implement.d.ts +16 -0
- package/dist/commands/work/implement.js +85 -0
- package/dist/commands/work/implement.js.map +1 -0
- package/dist/commands/work/index.js +38 -34
- package/dist/commands/work/index.js.map +1 -1
- package/dist/commands/work/peek.d.ts +18 -0
- package/dist/commands/work/peek.js +82 -0
- package/dist/commands/work/peek.js.map +1 -0
- package/dist/commands/work/poke.d.ts +18 -0
- package/dist/commands/work/poke.js +84 -0
- package/dist/commands/work/poke.js.map +1 -0
- package/dist/commands/work/ready.js +2 -0
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/review.d.ts +1 -31
- package/dist/commands/work/review.js +44 -368
- package/dist/commands/work/review.js.map +1 -1
- package/dist/commands/work/spawn.js +1 -1
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.d.ts +3 -0
- package/dist/commands/work/start.js +69 -20
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/stop.d.ts +14 -0
- package/dist/commands/work/stop.js +108 -0
- package/dist/commands/work/stop.js.map +1 -0
- package/dist/hooks/init.d.ts +1 -1
- package/dist/hooks/init.js +4 -1
- package/dist/hooks/init.js.map +1 -1
- package/dist/hooks/postrun.js +3 -0
- package/dist/hooks/postrun.js.map +1 -1
- package/dist/lib/database/drizzle-schema.d.ts +1 -1
- package/dist/lib/database/migrations/0011_add_review_gate.d.ts +8 -0
- package/dist/lib/database/migrations/0011_add_review_gate.js +21 -0
- package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -0
- package/dist/lib/database/migrations/index.js +2 -0
- package/dist/lib/database/migrations/index.js.map +1 -1
- package/dist/lib/execution/config.d.ts +17 -1
- package/dist/lib/execution/config.js +38 -0
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/devcontainer.js +0 -1
- package/dist/lib/execution/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/docker-management.js +20 -0
- package/dist/lib/execution/runners/docker-management.js.map +1 -1
- package/dist/lib/execution/runners/prompt-builder.js +50 -17
- package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
- package/dist/lib/execution/runners/shared.js +3 -1
- package/dist/lib/execution/runners/shared.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +3 -1
- package/dist/lib/execution/spawner.js +10 -4
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/storage.d.ts +4 -2
- package/dist/lib/execution/storage.js +10 -8
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/execution/types.d.ts +10 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/mcp/tools/action.js +34 -0
- package/dist/lib/mcp/tools/action.js.map +1 -1
- package/dist/lib/mcp/tools/tmux.d.ts +1 -1
- package/dist/lib/mcp/tools/tmux.js +1 -1
- package/dist/lib/mcp/tools/work.js +4 -35
- package/dist/lib/mcp/tools/work.js.map +1 -1
- package/dist/lib/pmo/schema.d.ts +2 -2
- package/dist/lib/pmo/schema.js +2 -0
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/actions.js +9 -3
- package/dist/lib/pmo/storage/actions.js.map +1 -1
- package/dist/lib/pmo/storage/base.js +59 -501
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/storage/index.d.ts +1 -0
- package/dist/lib/pmo/storage/index.js +3 -0
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/tickets.d.ts +7 -0
- package/dist/lib/pmo/storage/tickets.js +33 -2
- package/dist/lib/pmo/storage/tickets.js.map +1 -1
- package/dist/lib/pmo/storage/types.d.ts +1 -0
- package/dist/lib/pmo/types.d.ts +10 -0
- package/dist/lib/pmo/types.js.map +1 -1
- package/dist/lib/pmo/utils.d.ts +60 -0
- package/dist/lib/pmo/utils.js +92 -0
- package/dist/lib/pmo/utils.js.map +1 -1
- package/dist/lib/providers/event-emitting-provider.js +13 -2
- package/dist/lib/providers/event-emitting-provider.js.map +1 -1
- package/dist/lib/telemetry/analytics.d.ts +57 -13
- package/dist/lib/telemetry/analytics.js +87 -125
- package/dist/lib/telemetry/analytics.js.map +1 -1
- package/dist/lib/telemetry/feature-flags.d.ts +12 -37
- package/dist/lib/telemetry/feature-flags.js +15 -63
- package/dist/lib/telemetry/feature-flags.js.map +1 -1
- package/dist/lib/telemetry/telemetry-bridge.d.ts +35 -0
- package/dist/lib/telemetry/telemetry-bridge.js +139 -0
- package/dist/lib/telemetry/telemetry-bridge.js.map +1 -0
- package/dist/lib/work-lifecycle/post-execution.d.ts +5 -1
- package/dist/lib/work-lifecycle/post-execution.js +30 -18
- package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
- package/oclif.manifest.json +923 -661
- package/package.json +10 -11
- package/dist/commands/work/revise.d.ts +0 -20
- package/dist/commands/work/revise.js +0 -377
- package/dist/commands/work/revise.js.map +0 -1
package/dist/lib/pmo/utils.js
CHANGED
|
@@ -271,4 +271,96 @@ export function getPrioritySortIndex(db, value) {
|
|
|
271
271
|
const index = priorities.indexOf(value);
|
|
272
272
|
return index !== -1 ? index : Infinity;
|
|
273
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Valid review gate modes.
|
|
276
|
+
*/
|
|
277
|
+
export const REVIEW_GATE_MODES = ['required', 'auto', 'post'];
|
|
278
|
+
/**
|
|
279
|
+
* Default review gate mode for workspace.
|
|
280
|
+
*/
|
|
281
|
+
export const DEFAULT_REVIEW_GATE = 'required';
|
|
282
|
+
/**
|
|
283
|
+
* Settings key for workspace-level review gate default.
|
|
284
|
+
*/
|
|
285
|
+
const REVIEW_GATE_SETTING_KEY = 'review_gate';
|
|
286
|
+
/**
|
|
287
|
+
* Get the workspace review gate default from pmo_settings.
|
|
288
|
+
* Returns the configured mode, or 'required' if not set.
|
|
289
|
+
*
|
|
290
|
+
* @param db - Database instance
|
|
291
|
+
* @returns The configured review gate mode
|
|
292
|
+
*/
|
|
293
|
+
export function getReviewGateSetting(db) {
|
|
294
|
+
const row = db.prepare(`SELECT value FROM pmo_settings WHERE key = ?`).get(REVIEW_GATE_SETTING_KEY);
|
|
295
|
+
const value = row?.value;
|
|
296
|
+
if (value === 'required' || value === 'auto' || value === 'post') {
|
|
297
|
+
return value;
|
|
298
|
+
}
|
|
299
|
+
return DEFAULT_REVIEW_GATE;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Set the workspace review gate default in pmo_settings.
|
|
303
|
+
*
|
|
304
|
+
* @param db - Database instance
|
|
305
|
+
* @param mode - Review gate mode to set
|
|
306
|
+
*/
|
|
307
|
+
export function setReviewGateSetting(db, mode) {
|
|
308
|
+
db.prepare(`
|
|
309
|
+
INSERT INTO pmo_settings (key, value) VALUES (?, ?)
|
|
310
|
+
ON CONFLICT(key) DO UPDATE SET value = ?
|
|
311
|
+
`).run(REVIEW_GATE_SETTING_KEY, mode, mode);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Check if a value is a valid review gate mode.
|
|
315
|
+
*/
|
|
316
|
+
export function isValidReviewGateMode(value) {
|
|
317
|
+
return REVIEW_GATE_MODES.includes(value);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Resolve the effective review gate mode given the hierarchy of overrides.
|
|
321
|
+
* Most specific wins: per-spawn > per-action > workspace default.
|
|
322
|
+
*
|
|
323
|
+
* @param spawnOverride - Value from --review-gate flag on `prlt work start`
|
|
324
|
+
* @param actionOverride - Value from the action's review_gate column
|
|
325
|
+
* @param db - Database instance for workspace default lookup
|
|
326
|
+
* @returns The resolved review gate mode
|
|
327
|
+
*/
|
|
328
|
+
export function resolveReviewGate(spawnOverride, actionOverride, db) {
|
|
329
|
+
if (spawnOverride)
|
|
330
|
+
return spawnOverride;
|
|
331
|
+
if (actionOverride)
|
|
332
|
+
return actionOverride;
|
|
333
|
+
return getReviewGateSetting(db);
|
|
334
|
+
}
|
|
335
|
+
// =============================================================================
|
|
336
|
+
// External Metadata Helpers
|
|
337
|
+
// =============================================================================
|
|
338
|
+
/**
|
|
339
|
+
* Extract external issue metadata from a ticket's metadata field.
|
|
340
|
+
* Returns the external source, key (e.g. PRLT-1065), id, and url.
|
|
341
|
+
*/
|
|
342
|
+
export function getTicketExternalMetadata(ticket) {
|
|
343
|
+
const metadata = (typeof ticket === 'object'
|
|
344
|
+
&& ticket !== null
|
|
345
|
+
&& 'metadata' in ticket
|
|
346
|
+
&& typeof ticket.metadata === 'object'
|
|
347
|
+
&& ticket.metadata !== null
|
|
348
|
+
? ticket.metadata
|
|
349
|
+
: {});
|
|
350
|
+
return {
|
|
351
|
+
source: typeof metadata.external_source === 'string' ? metadata.external_source : undefined,
|
|
352
|
+
key: typeof metadata.external_key === 'string' ? metadata.external_key : undefined,
|
|
353
|
+
id: typeof metadata.external_id === 'string' ? metadata.external_id : undefined,
|
|
354
|
+
url: typeof metadata.external_url === 'string' ? metadata.external_url : undefined,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Resolve the display/branch ticket ID. When a ticket was imported from an
|
|
359
|
+
* external provider (e.g. Linear), the external key (PRLT-xxx) is preferred
|
|
360
|
+
* over the internal PMO ID (TKT-xxx).
|
|
361
|
+
*/
|
|
362
|
+
export function resolveExternalTicketId(ticket) {
|
|
363
|
+
const external = getTicketExternalMetadata(ticket);
|
|
364
|
+
return external.key || ticket.id;
|
|
365
|
+
}
|
|
274
366
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/pmo/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/pmo/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* Pattern: same decorator approach as EventEmittingRunner.
|
|
13
13
|
*/
|
|
14
14
|
import { getEventBus } from '../events/event-bus.js';
|
|
15
|
+
import { trackTicketOperation } from '../telemetry/analytics.js';
|
|
15
16
|
/**
|
|
16
17
|
* EventEmittingProvider wraps a TicketProvider and emits
|
|
17
18
|
* work-lifecycle domain events after successful operations.
|
|
@@ -39,7 +40,9 @@ export class EventEmittingProvider {
|
|
|
39
40
|
async moveTicket(ticketId, newState) {
|
|
40
41
|
// Capture previous status before the move
|
|
41
42
|
const previous = this.statusResolver?.getTicketStatus(ticketId) ?? null;
|
|
43
|
+
const startTime = Date.now();
|
|
42
44
|
const result = await this.inner.moveTicket(ticketId, newState);
|
|
45
|
+
trackTicketOperation({ operation: 'move', provider: this.name, durationMs: Date.now() - startTime, success: result.success });
|
|
43
46
|
if (result.success) {
|
|
44
47
|
// Resolve the new status
|
|
45
48
|
const newStatus = this.statusResolver?.resolveStatusByName(this.projectId, newState) ?? null;
|
|
@@ -97,10 +100,15 @@ export class EventEmittingProvider {
|
|
|
97
100
|
return this.inner.deleteTicket(ticketId);
|
|
98
101
|
}
|
|
99
102
|
async listTickets(projectId, filter) {
|
|
100
|
-
|
|
103
|
+
const startTime = Date.now();
|
|
104
|
+
const result = await this.inner.listTickets(projectId, filter);
|
|
105
|
+
trackTicketOperation({ operation: 'list', provider: this.name, durationMs: Date.now() - startTime, success: result.success });
|
|
106
|
+
return result;
|
|
101
107
|
}
|
|
102
108
|
async createTicket(projectId, input) {
|
|
109
|
+
const startTime = Date.now();
|
|
103
110
|
const result = await this.inner.createTicket(projectId, input);
|
|
111
|
+
trackTicketOperation({ operation: 'create', provider: this.name, durationMs: Date.now() - startTime, success: result.success });
|
|
104
112
|
// If a PR URL was included in the creation metadata, emit pr_created
|
|
105
113
|
if (result.success && result.ticket && input.metadata?.['pr_url']) {
|
|
106
114
|
const bus = getEventBus();
|
|
@@ -123,7 +131,10 @@ export class EventEmittingProvider {
|
|
|
123
131
|
return result;
|
|
124
132
|
}
|
|
125
133
|
async getTicket(ticketId) {
|
|
126
|
-
|
|
134
|
+
const startTime = Date.now();
|
|
135
|
+
const result = await this.inner.getTicket(ticketId);
|
|
136
|
+
trackTicketOperation({ operation: 'fetch', provider: this.name, durationMs: Date.now() - startTime, success: result.success });
|
|
137
|
+
return result;
|
|
127
138
|
}
|
|
128
139
|
}
|
|
129
140
|
//# sourceMappingURL=event-emitting-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitting-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/event-emitting-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"event-emitting-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/event-emitting-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAkChE;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IAItB;IACA;IACA;IALD,IAAI,CAAoB;IAEjC,YACU,KAAqB,EACrB,cAAqC,EACrC,SAAiB;QAFjB,UAAK,GAAL,KAAK,CAAgB;QACrB,mBAAc,GAAd,cAAc,CAAuB;QACrC,cAAS,GAAT,SAAS,CAAQ;QAEzB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,QAAgB;QACjD,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;QAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAC9D,oBAAoB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAE7H,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,yBAAyB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAA;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;YAExB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;YAEzB,4EAA4E;YAC5E,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBAChC,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;gBAC5C,kBAAkB,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI;gBAChD,sBAAsB,EAAE,QAAQ,EAAE,cAAc,IAAI,IAAI;gBACxD,WAAW,EAAE,SAAS,EAAE,EAAE,IAAI,QAAQ;gBACtC,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI,QAAQ;gBAC1C,iBAAiB,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI;gBAC9C,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAA;YAEF,sCAAsC;YACtC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI;gBAC5C,gBAAgB,EAAE,QAAQ,EAAE,cAAc,IAAI,IAAI;gBAClD,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,QAAQ;gBACtC,WAAW,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI;gBACxC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAA;YAEF,yDAAyD;YACzD,IACE,SAAS,EAAE,QAAQ,KAAK,SAAS;gBACjC,QAAQ,EAAE,cAAc,KAAK,SAAS,EACtC,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;oBACvB,UAAU,EAAE,QAAQ;oBACpB,MAAM;oBACN,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,MAAM,EAAE,SAAS,CAAC,IAAI;oBACtB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC,CAAA;YACJ,CAAC;YAED,6DAA6D;YAC7D,IACE,SAAS,EAAE,QAAQ,KAAK,WAAW;gBACnC,QAAQ,EAAE,cAAc,KAAK,WAAW,EACxC,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;oBACzB,UAAU,EAAE,QAAQ;oBACpB,MAAM;oBACN,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,MAAM,EAAE,SAAS,CAAC,IAAI;oBACtB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAkB,EAAE,MAAqB;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC9D,oBAAoB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7H,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,KAAwB;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC9D,oBAAoB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAE/H,qEAAqE;QACrE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;YAEzB,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;gBAC1B,SAAS;gBACT,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC/B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI;gBAC3C,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;gBAC5B,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,SAAS;gBACT,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC/B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI;gBAC3C,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACnD,oBAAoB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9H,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Product Analytics (
|
|
2
|
+
* Product Analytics (PostHog) & Event Tracking
|
|
3
3
|
*
|
|
4
|
-
* Provides anonymous usage analytics for the CLI using
|
|
4
|
+
* Provides anonymous usage analytics for the CLI using PostHog.
|
|
5
5
|
* All data is anonymous — identified by a machine UUID only, no PII is ever sent.
|
|
6
6
|
*
|
|
7
7
|
* Telemetry can be disabled via:
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* Write-ahead log:
|
|
18
18
|
* - trackEvent() writes events to ~/.proletariat/telemetry-queue.json synchronously
|
|
19
|
-
* - On the next command run, queued events are flushed to
|
|
19
|
+
* - On the next command run, queued events are flushed to PostHog and the queue is cleared
|
|
20
20
|
* - Events are delayed by at most one command invocation — acceptable for analytics
|
|
21
21
|
* - This adds zero latency and ensures no events are lost regardless of backend init timing
|
|
22
22
|
* - Shutdown never flushes the queue — events persist until the next run confirms delivery
|
|
@@ -47,23 +47,22 @@ export declare function getTelemetryStatus(): {
|
|
|
47
47
|
*/
|
|
48
48
|
export declare function getMachineId(): string;
|
|
49
49
|
/**
|
|
50
|
-
* Flush queued events to
|
|
50
|
+
* Flush queued events to PostHog. Requires an initialized PostHog client.
|
|
51
51
|
* Called during shutdown or at the start of the next command run.
|
|
52
52
|
*/
|
|
53
53
|
export declare function flushQueuedEvents(): void;
|
|
54
54
|
/**
|
|
55
|
-
* Initialize
|
|
56
|
-
* Called from the init hook. The
|
|
55
|
+
* Initialize PostHog and flush any queued events from previous runs.
|
|
56
|
+
* Called from the init hook. The PostHog init is fire-and-forget — event
|
|
57
57
|
* tracking does not depend on it (events go to the disk queue instead).
|
|
58
|
-
* Statsig is still needed for feature flags.
|
|
59
58
|
*
|
|
60
59
|
* No-op if telemetry is disabled.
|
|
61
60
|
*/
|
|
62
61
|
export declare function initAnalytics(version: string): void;
|
|
63
62
|
/**
|
|
64
63
|
* Track an analytics event. Writes to a local disk queue synchronously —
|
|
65
|
-
* never blocks on network I/O. Events are flushed to
|
|
66
|
-
* command run (or during this run's shutdown if
|
|
64
|
+
* never blocks on network I/O. Events are flushed to PostHog on the next
|
|
65
|
+
* command run (or during this run's shutdown if PostHog initialized in time).
|
|
67
66
|
*
|
|
68
67
|
* @param eventName - Event name (e.g., 'command_run')
|
|
69
68
|
* @param value - Optional numeric or string value
|
|
@@ -81,12 +80,15 @@ export declare function trackCommandRun(options: {
|
|
|
81
80
|
}): void;
|
|
82
81
|
/**
|
|
83
82
|
* Track an agent being spawned.
|
|
83
|
+
*
|
|
84
|
+
* Privacy: No ticket IDs, branch names, or usernames.
|
|
84
85
|
*/
|
|
85
86
|
export declare function trackAgentSpawned(options: {
|
|
86
87
|
executor: string;
|
|
87
88
|
environment: string;
|
|
88
89
|
action: string;
|
|
89
90
|
ephemeral: boolean;
|
|
91
|
+
provider?: string;
|
|
90
92
|
}): void;
|
|
91
93
|
/**
|
|
92
94
|
* Track an orchestrator being started.
|
|
@@ -117,11 +119,53 @@ export declare function trackMCPToolCalled(options: {
|
|
|
117
119
|
success: boolean;
|
|
118
120
|
}): void;
|
|
119
121
|
/**
|
|
120
|
-
*
|
|
122
|
+
* Track a work primitive completing (groom, resolve, implement, review, peek, poke, stop).
|
|
123
|
+
*
|
|
124
|
+
* Privacy: No ticket IDs, descriptions, file paths, or code content.
|
|
125
|
+
*/
|
|
126
|
+
export declare function trackPrimitiveExecuted(options: {
|
|
127
|
+
primitive: string;
|
|
128
|
+
durationMs: number;
|
|
129
|
+
success: boolean;
|
|
130
|
+
errorType?: string;
|
|
131
|
+
}): void;
|
|
132
|
+
/**
|
|
133
|
+
* Track an agent completing successfully.
|
|
134
|
+
*
|
|
135
|
+
* Privacy: No ticket IDs, branch names, or usernames.
|
|
136
|
+
*/
|
|
137
|
+
export declare function trackAgentCompleted(options: {
|
|
138
|
+
action: string;
|
|
139
|
+
durationMs: number;
|
|
140
|
+
exitReason: 'completed' | 'errored' | 'stopped' | 'orphaned';
|
|
141
|
+
prCreated: boolean;
|
|
142
|
+
}): void;
|
|
143
|
+
/**
|
|
144
|
+
* Track an agent encountering an error.
|
|
145
|
+
*
|
|
146
|
+
* Privacy: No ticket IDs, error messages (may contain PII), or stack traces.
|
|
147
|
+
*/
|
|
148
|
+
export declare function trackAgentErrored(options: {
|
|
149
|
+
action: string;
|
|
150
|
+
durationMs: number;
|
|
151
|
+
exitReason: 'errored';
|
|
152
|
+
errorType?: string;
|
|
153
|
+
}): void;
|
|
154
|
+
/**
|
|
155
|
+
* Track a ticket operation (fetch, move, update, comment, create, list).
|
|
156
|
+
*
|
|
157
|
+
* Privacy: No ticket IDs, descriptions, or ticket content.
|
|
158
|
+
*/
|
|
159
|
+
export declare function trackTicketOperation(options: {
|
|
160
|
+
operation: 'fetch' | 'move' | 'update' | 'comment' | 'create' | 'list';
|
|
161
|
+
provider: string;
|
|
162
|
+
durationMs: number;
|
|
163
|
+
success: boolean;
|
|
164
|
+
}): void;
|
|
165
|
+
/**
|
|
166
|
+
* Wait for PostHog init to complete (so queued events get flushed), then
|
|
121
167
|
* shut down the client. Uses a timeout to avoid blocking CLI exit if
|
|
122
|
-
*
|
|
123
|
-
* successful init, Statsig caches its config locally so subsequent
|
|
124
|
-
* initializations resolve in < 100 ms.
|
|
168
|
+
* PostHog is slow.
|
|
125
169
|
*
|
|
126
170
|
* Events written during this command run (e.g., by trackCommandRun in
|
|
127
171
|
* postrun) will be on disk and flushed on the next run — this is by
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Product Analytics (
|
|
2
|
+
* Product Analytics (PostHog) & Event Tracking
|
|
3
3
|
*
|
|
4
|
-
* Provides anonymous usage analytics for the CLI using
|
|
4
|
+
* Provides anonymous usage analytics for the CLI using PostHog.
|
|
5
5
|
* All data is anonymous — identified by a machine UUID only, no PII is ever sent.
|
|
6
6
|
*
|
|
7
7
|
* Telemetry can be disabled via:
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* Write-ahead log:
|
|
18
18
|
* - trackEvent() writes events to ~/.proletariat/telemetry-queue.json synchronously
|
|
19
|
-
* - On the next command run, queued events are flushed to
|
|
19
|
+
* - On the next command run, queued events are flushed to PostHog and the queue is cleared
|
|
20
20
|
* - Events are delayed by at most one command invocation — acceptable for analytics
|
|
21
21
|
* - This adds zero latency and ensures no events are lost regardless of backend init timing
|
|
22
22
|
* - Shutdown never flushes the queue — events persist until the next run confirms delivery
|
|
@@ -25,14 +25,11 @@ import * as fs from 'node:fs';
|
|
|
25
25
|
import * as path from 'node:path';
|
|
26
26
|
import * as crypto from 'node:crypto';
|
|
27
27
|
import { getMachineConfigDir, ensureMachineConfigDir } from '../machine-config.js';
|
|
28
|
-
// Statsig server secret key (private — this repo is private, will be replaced before merge)
|
|
29
|
-
const STATSIG_SERVER_KEY = 'secret-placeholder';
|
|
30
28
|
// PostHog API key (public — PostHog client keys are meant to be public)
|
|
31
29
|
const POSTHOG_API_KEY = 'phc_ihCp4i3ZWlk2KQxFbcE6odylZGtISEaCNKAVklMwAkV';
|
|
32
30
|
// Cap the queue size to prevent unbounded growth if events never flush
|
|
33
31
|
const MAX_QUEUE_SIZE = 1000;
|
|
34
32
|
// Module-level state
|
|
35
|
-
let statsigClient = null;
|
|
36
33
|
let posthogClient = null;
|
|
37
34
|
let telemetryConfig = null;
|
|
38
35
|
let cliVersion = null;
|
|
@@ -234,49 +231,36 @@ function readAndClearQueue() {
|
|
|
234
231
|
}
|
|
235
232
|
}
|
|
236
233
|
/**
|
|
237
|
-
* Flush queued events to
|
|
234
|
+
* Flush queued events to PostHog. Requires an initialized PostHog client.
|
|
238
235
|
* Called during shutdown or at the start of the next command run.
|
|
239
236
|
*/
|
|
240
237
|
export function flushQueuedEvents() {
|
|
241
|
-
if (!
|
|
238
|
+
if (!posthogClient)
|
|
242
239
|
return;
|
|
243
240
|
const events = readAndClearQueue();
|
|
244
241
|
const machineId = getMachineId();
|
|
245
242
|
for (const event of events) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
243
|
+
try {
|
|
244
|
+
posthogClient.capture({
|
|
245
|
+
distinctId: machineId,
|
|
246
|
+
event: event.name,
|
|
247
|
+
properties: {
|
|
248
|
+
...event.metadata,
|
|
249
|
+
...(event.value != null ? { value: event.value } : {}),
|
|
250
|
+
timestamp: event.timestamp,
|
|
251
|
+
},
|
|
252
|
+
});
|
|
254
253
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
try {
|
|
258
|
-
posthogClient.capture({
|
|
259
|
-
distinctId: machineId,
|
|
260
|
-
event: event.name,
|
|
261
|
-
properties: {
|
|
262
|
-
...event.metadata,
|
|
263
|
-
...(event.value != null ? { value: event.value } : {}),
|
|
264
|
-
timestamp: event.timestamp,
|
|
265
|
-
},
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
// Drop individual events silently
|
|
270
|
-
}
|
|
254
|
+
catch {
|
|
255
|
+
// Drop individual events silently
|
|
271
256
|
}
|
|
272
257
|
}
|
|
273
258
|
}
|
|
274
|
-
// ───
|
|
259
|
+
// ─── PostHog Client ──────────────────────────────────────────────────────────
|
|
275
260
|
/**
|
|
276
|
-
* Initialize
|
|
277
|
-
* Called from the init hook. The
|
|
261
|
+
* Initialize PostHog and flush any queued events from previous runs.
|
|
262
|
+
* Called from the init hook. The PostHog init is fire-and-forget — event
|
|
278
263
|
* tracking does not depend on it (events go to the disk queue instead).
|
|
279
|
-
* Statsig is still needed for feature flags.
|
|
280
264
|
*
|
|
281
265
|
* No-op if telemetry is disabled.
|
|
282
266
|
*/
|
|
@@ -285,10 +269,9 @@ export function initAnalytics(version) {
|
|
|
285
269
|
if (!isTelemetryEnabled())
|
|
286
270
|
return;
|
|
287
271
|
showTelemetryNotice();
|
|
288
|
-
// Start
|
|
289
|
-
// but
|
|
272
|
+
// Start PostHog init in background — not needed for event logging,
|
|
273
|
+
// but allows queue flush if init completes in time
|
|
290
274
|
initPromise = (async () => {
|
|
291
|
-
// Initialize PostHog (fire-and-forget, independent of Statsig)
|
|
292
275
|
try {
|
|
293
276
|
const { PostHog } = await import('posthog-node');
|
|
294
277
|
const ph = new PostHog(POSTHOG_API_KEY, {
|
|
@@ -309,61 +292,17 @@ export function initAnalytics(version) {
|
|
|
309
292
|
// If PostHog can't initialize, fail silently
|
|
310
293
|
posthogClient = null;
|
|
311
294
|
}
|
|
312
|
-
//
|
|
313
|
-
|
|
314
|
-
const { Statsig } = await import('statsig-node');
|
|
315
|
-
await Statsig.initialize(STATSIG_SERVER_KEY, {
|
|
316
|
-
environment: { tier: 'production' },
|
|
317
|
-
});
|
|
318
|
-
// If shutdown already ran while we were initializing, don't set state
|
|
319
|
-
// or flush — just clean up and bail out
|
|
320
|
-
if (analyticsShutdown) {
|
|
321
|
-
try {
|
|
322
|
-
Statsig.shutdown();
|
|
323
|
-
}
|
|
324
|
-
catch { /* ignore */ }
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
// Wrap the static Statsig API to match our StatsigClientInstance interface,
|
|
328
|
-
// binding the user for all calls so feature-flags.ts doesn't need to change
|
|
329
|
-
const user = { userID: getMachineId(), custom: { cli_version: version } };
|
|
330
|
-
const client = {
|
|
331
|
-
initializeAsync: () => Promise.resolve(),
|
|
332
|
-
logEvent(eventName, value, metadata) {
|
|
333
|
-
Statsig.logEvent(user, eventName, value, metadata);
|
|
334
|
-
},
|
|
335
|
-
checkGate(gateName) {
|
|
336
|
-
return Statsig.checkGate(user, gateName);
|
|
337
|
-
},
|
|
338
|
-
getDynamicConfig(configName) {
|
|
339
|
-
return Statsig.getConfig(user, configName);
|
|
340
|
-
},
|
|
341
|
-
shutdown() {
|
|
342
|
-
Statsig.shutdown();
|
|
343
|
-
},
|
|
344
|
-
};
|
|
345
|
-
statsigClient = client;
|
|
346
|
-
// Share Statsig client with feature-flags for synchronous gate checks
|
|
347
|
-
const { setStatsigClient } = await import('./feature-flags.js');
|
|
348
|
-
setStatsigClient(client);
|
|
349
|
-
// Backends are ready — flush any events queued from previous runs
|
|
295
|
+
// Backend is ready — flush any events queued from previous runs
|
|
296
|
+
if (posthogClient && !analyticsShutdown) {
|
|
350
297
|
flushQueuedEvents();
|
|
351
298
|
}
|
|
352
|
-
catch {
|
|
353
|
-
// If Statsig can't initialize, fail silently — analytics should never break the CLI
|
|
354
|
-
statsigClient = null;
|
|
355
|
-
// Even if Statsig failed, PostHog may be ready — try flushing
|
|
356
|
-
if (posthogClient && !analyticsShutdown) {
|
|
357
|
-
flushQueuedEvents();
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
299
|
})();
|
|
361
300
|
}
|
|
362
301
|
// ─── Event Tracking ──────────────────────────────────────────────────────────
|
|
363
302
|
/**
|
|
364
303
|
* Track an analytics event. Writes to a local disk queue synchronously —
|
|
365
|
-
* never blocks on network I/O. Events are flushed to
|
|
366
|
-
* command run (or during this run's shutdown if
|
|
304
|
+
* never blocks on network I/O. Events are flushed to PostHog on the next
|
|
305
|
+
* command run (or during this run's shutdown if PostHog initialized in time).
|
|
367
306
|
*
|
|
368
307
|
* @param eventName - Event name (e.g., 'command_run')
|
|
369
308
|
* @param value - Optional numeric or string value
|
|
@@ -402,6 +341,8 @@ export function trackCommandRun(options) {
|
|
|
402
341
|
}
|
|
403
342
|
/**
|
|
404
343
|
* Track an agent being spawned.
|
|
344
|
+
*
|
|
345
|
+
* Privacy: No ticket IDs, branch names, or usernames.
|
|
405
346
|
*/
|
|
406
347
|
export function trackAgentSpawned(options) {
|
|
407
348
|
trackEvent('agent_spawned', null, {
|
|
@@ -409,6 +350,7 @@ export function trackAgentSpawned(options) {
|
|
|
409
350
|
environment: options.environment,
|
|
410
351
|
action: options.action,
|
|
411
352
|
ephemeral: String(options.ephemeral),
|
|
353
|
+
...(options.provider ? { provider: options.provider } : {}),
|
|
412
354
|
});
|
|
413
355
|
}
|
|
414
356
|
/**
|
|
@@ -446,25 +388,68 @@ export function trackMCPToolCalled(options) {
|
|
|
446
388
|
success: String(options.success),
|
|
447
389
|
});
|
|
448
390
|
}
|
|
391
|
+
// ─── Granular Telemetry Events ────────────────────────────────────────────────
|
|
392
|
+
/**
|
|
393
|
+
* Track a work primitive completing (groom, resolve, implement, review, peek, poke, stop).
|
|
394
|
+
*
|
|
395
|
+
* Privacy: No ticket IDs, descriptions, file paths, or code content.
|
|
396
|
+
*/
|
|
397
|
+
export function trackPrimitiveExecuted(options) {
|
|
398
|
+
trackEvent('primitive_executed', options.durationMs, {
|
|
399
|
+
primitive: options.primitive,
|
|
400
|
+
success: options.success,
|
|
401
|
+
...(options.errorType ? { error_type: options.errorType } : {}),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Track an agent completing successfully.
|
|
406
|
+
*
|
|
407
|
+
* Privacy: No ticket IDs, branch names, or usernames.
|
|
408
|
+
*/
|
|
409
|
+
export function trackAgentCompleted(options) {
|
|
410
|
+
trackEvent('agent_completed', options.durationMs, {
|
|
411
|
+
action: options.action,
|
|
412
|
+
exit_reason: options.exitReason,
|
|
413
|
+
pr_created: options.prCreated,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Track an agent encountering an error.
|
|
418
|
+
*
|
|
419
|
+
* Privacy: No ticket IDs, error messages (may contain PII), or stack traces.
|
|
420
|
+
*/
|
|
421
|
+
export function trackAgentErrored(options) {
|
|
422
|
+
trackEvent('agent_errored', options.durationMs, {
|
|
423
|
+
action: options.action,
|
|
424
|
+
exit_reason: options.exitReason,
|
|
425
|
+
...(options.errorType ? { error_type: options.errorType } : {}),
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Track a ticket operation (fetch, move, update, comment, create, list).
|
|
430
|
+
*
|
|
431
|
+
* Privacy: No ticket IDs, descriptions, or ticket content.
|
|
432
|
+
*/
|
|
433
|
+
export function trackTicketOperation(options) {
|
|
434
|
+
trackEvent('ticket_operation', options.durationMs, {
|
|
435
|
+
operation: options.operation,
|
|
436
|
+
provider: options.provider,
|
|
437
|
+
success: options.success,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
449
440
|
// ─── Shutdown ────────────────────────────────────────────────────────────────
|
|
450
|
-
/** Maximum time (ms) to wait for
|
|
441
|
+
/** Maximum time (ms) to wait for PostHog init before giving up during shutdown. */
|
|
451
442
|
const SHUTDOWN_INIT_TIMEOUT_MS = 3000;
|
|
452
443
|
/**
|
|
453
|
-
* Wait for
|
|
444
|
+
* Wait for PostHog init to complete (so queued events get flushed), then
|
|
454
445
|
* shut down the client. Uses a timeout to avoid blocking CLI exit if
|
|
455
|
-
*
|
|
456
|
-
* successful init, Statsig caches its config locally so subsequent
|
|
457
|
-
* initializations resolve in < 100 ms.
|
|
446
|
+
* PostHog is slow.
|
|
458
447
|
*
|
|
459
448
|
* Events written during this command run (e.g., by trackCommandRun in
|
|
460
449
|
* postrun) will be on disk and flushed on the next run — this is by
|
|
461
450
|
* design (WAL guarantee: one-command delay for current-run events).
|
|
462
451
|
*/
|
|
463
452
|
export async function shutdownAnalytics() {
|
|
464
|
-
// Await the in-progress Statsig init so it can flush queued events from
|
|
465
|
-
// previous runs. Without this, the init promise sees analyticsShutdown=true
|
|
466
|
-
// and bails before calling flushQueuedEvents(), causing the queue to grow
|
|
467
|
-
// indefinitely (see PRLT-1013).
|
|
468
453
|
if (initPromise) {
|
|
469
454
|
try {
|
|
470
455
|
await Promise.race([
|
|
@@ -476,45 +461,22 @@ export async function shutdownAnalytics() {
|
|
|
476
461
|
// Ignore init errors — events are safely on disk
|
|
477
462
|
}
|
|
478
463
|
}
|
|
479
|
-
// Now mark as shut down so any late-resolving init promise (after timeout)
|
|
480
|
-
// won't set statsigClient or flush the queue
|
|
481
464
|
analyticsShutdown = true;
|
|
482
465
|
initPromise = null;
|
|
483
|
-
if (
|
|
466
|
+
if (posthogClient) {
|
|
484
467
|
try {
|
|
485
|
-
// Flush events written during this run that arrived after the init
|
|
486
|
-
// promise's own flush (e.g., the command_run event from postrun).
|
|
487
|
-
// statsigClient.logEvent() buffers in memory; shutdown() sends them.
|
|
488
468
|
flushQueuedEvents();
|
|
489
469
|
}
|
|
490
470
|
catch {
|
|
491
471
|
// Never let flush errors affect the CLI
|
|
492
472
|
}
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
statsigClient.shutdown();
|
|
496
|
-
}
|
|
497
|
-
catch {
|
|
498
|
-
// Never let shutdown errors affect the CLI
|
|
499
|
-
}
|
|
500
|
-
statsigClient = null;
|
|
501
|
-
try {
|
|
502
|
-
const { setStatsigClient } = await import('./feature-flags.js');
|
|
503
|
-
setStatsigClient(null);
|
|
504
|
-
}
|
|
505
|
-
catch {
|
|
506
|
-
// Ignore
|
|
507
|
-
}
|
|
473
|
+
try {
|
|
474
|
+
posthogClient.shutdown();
|
|
508
475
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
posthogClient.shutdown();
|
|
512
|
-
}
|
|
513
|
-
catch {
|
|
514
|
-
// Never let shutdown errors affect the CLI
|
|
515
|
-
}
|
|
516
|
-
posthogClient = null;
|
|
476
|
+
catch {
|
|
477
|
+
// Never let shutdown errors affect the CLI
|
|
517
478
|
}
|
|
479
|
+
posthogClient = null;
|
|
518
480
|
}
|
|
519
481
|
}
|
|
520
482
|
//# sourceMappingURL=analytics.js.map
|