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.
@@ -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
- try {
111
- this.mixpanel.track(eventName, {
112
- ...this.baseProperties,
113
- ...properties
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
- // No await - fire and forget
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
- this.track('installer_started');
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
- this.track('ides_confirmed', {
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
- this.track('flow_selected', {
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.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": {