specsmd 0.1.1 → 0.1.2
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/lib/analytics/tracker.js +34 -12
- package/lib/installer.js +5 -5
- package/package.json +1 -1
package/lib/analytics/tracker.js
CHANGED
|
@@ -101,18 +101,34 @@ class AnalyticsTracker {
|
|
|
101
101
|
*
|
|
102
102
|
* @param {string} eventName - Name of the event
|
|
103
103
|
* @param {Object} properties - Additional event properties
|
|
104
|
+
* @param {boolean} waitForDelivery - Wait for event to be sent
|
|
105
|
+
* @returns {Promise<void>} Resolves when event is sent (if waitForDelivery is true)
|
|
104
106
|
*/
|
|
105
|
-
track(eventName, properties = {}) {
|
|
107
|
+
track(eventName, properties = {}, waitForDelivery = false) {
|
|
106
108
|
if (!this.enabled || !this.mixpanel) {
|
|
107
|
-
return;
|
|
109
|
+
return waitForDelivery ? Promise.resolve() : undefined;
|
|
108
110
|
}
|
|
109
111
|
|
|
110
|
-
|
|
111
|
-
this.
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
const eventData = {
|
|
113
|
+
...this.baseProperties,
|
|
114
|
+
...properties
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
if (waitForDelivery) {
|
|
118
|
+
return new Promise((resolve) => {
|
|
119
|
+
try {
|
|
120
|
+
this.mixpanel.track(eventName, eventData, (err) => {
|
|
121
|
+
// Resolve regardless of error - silent failure
|
|
122
|
+
resolve();
|
|
123
|
+
});
|
|
124
|
+
} catch {
|
|
125
|
+
resolve();
|
|
126
|
+
}
|
|
114
127
|
});
|
|
115
|
-
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
this.mixpanel.track(eventName, eventData);
|
|
116
132
|
} catch {
|
|
117
133
|
// Silent failure
|
|
118
134
|
}
|
|
@@ -121,9 +137,11 @@ class AnalyticsTracker {
|
|
|
121
137
|
/**
|
|
122
138
|
* Track installer_started event
|
|
123
139
|
* Called when the installer begins
|
|
140
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
124
141
|
*/
|
|
125
142
|
trackInstallerStarted() {
|
|
126
|
-
|
|
143
|
+
// Wait for delivery - critical funnel event
|
|
144
|
+
return this.track('installer_started', {}, true);
|
|
127
145
|
}
|
|
128
146
|
|
|
129
147
|
/**
|
|
@@ -131,12 +149,14 @@ class AnalyticsTracker {
|
|
|
131
149
|
* Called after user confirms IDE/tool selection
|
|
132
150
|
*
|
|
133
151
|
* @param {string[]} ides - Array of selected IDE keys (e.g., ['claude-code', 'cursor'])
|
|
152
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
134
153
|
*/
|
|
135
154
|
trackIdesConfirmed(ides) {
|
|
136
|
-
|
|
155
|
+
// Wait for delivery - critical funnel event
|
|
156
|
+
return this.track('ides_confirmed', {
|
|
137
157
|
ide_count: ides.length,
|
|
138
158
|
ides: ides
|
|
139
|
-
});
|
|
159
|
+
}, true);
|
|
140
160
|
}
|
|
141
161
|
|
|
142
162
|
/**
|
|
@@ -144,11 +164,13 @@ class AnalyticsTracker {
|
|
|
144
164
|
* Called after user selects an SDLC flow
|
|
145
165
|
*
|
|
146
166
|
* @param {string} flow - Flow key (e.g., 'aidlc', 'agile')
|
|
167
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
147
168
|
*/
|
|
148
169
|
trackFlowSelected(flow) {
|
|
149
|
-
|
|
170
|
+
// Wait for delivery - critical funnel event
|
|
171
|
+
return this.track('flow_selected', {
|
|
150
172
|
flow: flow
|
|
151
|
-
});
|
|
173
|
+
}, true);
|
|
152
174
|
}
|
|
153
175
|
|
|
154
176
|
/**
|
package/lib/installer.js
CHANGED
|
@@ -70,7 +70,7 @@ async function detectTools() {
|
|
|
70
70
|
async function install() {
|
|
71
71
|
// Initialize analytics (respects opt-out env vars)
|
|
72
72
|
analytics.init();
|
|
73
|
-
analytics.trackInstallerStarted();
|
|
73
|
+
await analytics.trackInstallerStarted();
|
|
74
74
|
|
|
75
75
|
const installStartTime = Date.now();
|
|
76
76
|
|
|
@@ -119,8 +119,8 @@ async function install() {
|
|
|
119
119
|
process.exit(1);
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
// Track IDE selection
|
|
123
|
-
analytics.trackIdesConfirmed(selectedToolKeys);
|
|
122
|
+
// Track IDE selection (await to ensure delivery before potential cancel)
|
|
123
|
+
await analytics.trackIdesConfirmed(selectedToolKeys);
|
|
124
124
|
|
|
125
125
|
// Step 3: Select Flow
|
|
126
126
|
console.log('');
|
|
@@ -143,8 +143,8 @@ async function install() {
|
|
|
143
143
|
process.exit(1);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
// Track flow selection
|
|
147
|
-
analytics.trackFlowSelected(selectedFlow);
|
|
146
|
+
// Track flow selection (await to ensure delivery before potential cancel)
|
|
147
|
+
await analytics.trackFlowSelected(selectedFlow);
|
|
148
148
|
|
|
149
149
|
// Step 4: Install flow files
|
|
150
150
|
console.log('');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specsmd",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Multi-agent orchestration system for AI-native software development. Delivers AI-DLC, Agile, and custom SDLC flows as markdown-based agent systems.",
|
|
5
5
|
"main": "lib/installer.js",
|
|
6
6
|
"bin": {
|