@planu/cli 0.98.0 → 1.0.0

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 (122) hide show
  1. package/dist/config/license-plans.json +4 -2
  2. package/dist/engine/agent-orchestrator/coordinator-prompt.d.ts +3 -0
  3. package/dist/engine/agent-orchestrator/coordinator-prompt.d.ts.map +1 -0
  4. package/dist/engine/agent-orchestrator/coordinator-prompt.js +38 -0
  5. package/dist/engine/agent-orchestrator/coordinator-prompt.js.map +1 -0
  6. package/dist/engine/agent-orchestrator/execution-guide.d.ts +3 -0
  7. package/dist/engine/agent-orchestrator/execution-guide.d.ts.map +1 -0
  8. package/dist/engine/agent-orchestrator/execution-guide.js +59 -0
  9. package/dist/engine/agent-orchestrator/execution-guide.js.map +1 -0
  10. package/dist/engine/agent-orchestrator/file-partitioner.d.ts +7 -0
  11. package/dist/engine/agent-orchestrator/file-partitioner.d.ts.map +1 -0
  12. package/dist/engine/agent-orchestrator/file-partitioner.js +19 -0
  13. package/dist/engine/agent-orchestrator/file-partitioner.js.map +1 -0
  14. package/dist/engine/agent-orchestrator/index.d.ts +12 -0
  15. package/dist/engine/agent-orchestrator/index.d.ts.map +1 -0
  16. package/dist/engine/agent-orchestrator/index.js +131 -0
  17. package/dist/engine/agent-orchestrator/index.js.map +1 -0
  18. package/dist/engine/agent-orchestrator/spec-reader.d.ts +6 -0
  19. package/dist/engine/agent-orchestrator/spec-reader.d.ts.map +1 -0
  20. package/dist/engine/agent-orchestrator/spec-reader.js +20 -0
  21. package/dist/engine/agent-orchestrator/spec-reader.js.map +1 -0
  22. package/dist/engine/agent-orchestrator/specialist-prompt.d.ts +3 -0
  23. package/dist/engine/agent-orchestrator/specialist-prompt.d.ts.map +1 -0
  24. package/dist/engine/agent-orchestrator/specialist-prompt.js +56 -0
  25. package/dist/engine/agent-orchestrator/specialist-prompt.js.map +1 -0
  26. package/dist/engine/agent-orchestrator/verifier-prompt.d.ts +3 -0
  27. package/dist/engine/agent-orchestrator/verifier-prompt.d.ts.map +1 -0
  28. package/dist/engine/agent-orchestrator/verifier-prompt.js +69 -0
  29. package/dist/engine/agent-orchestrator/verifier-prompt.js.map +1 -0
  30. package/dist/engine/dashboard/templates-kanban.d.ts.map +1 -1
  31. package/dist/engine/dashboard/templates-kanban.js.map +1 -1
  32. package/dist/engine/product-intelligence/index.d.ts +7 -0
  33. package/dist/engine/product-intelligence/index.d.ts.map +1 -0
  34. package/dist/engine/product-intelligence/index.js +211 -0
  35. package/dist/engine/product-intelligence/index.js.map +1 -0
  36. package/dist/engine/telemetry/error-reporter.d.ts +9 -2
  37. package/dist/engine/telemetry/error-reporter.d.ts.map +1 -1
  38. package/dist/engine/telemetry/error-reporter.js +31 -4
  39. package/dist/engine/telemetry/error-reporter.js.map +1 -1
  40. package/dist/engine/trial/index.d.ts +25 -0
  41. package/dist/engine/trial/index.d.ts.map +1 -0
  42. package/dist/engine/trial/index.js +125 -0
  43. package/dist/engine/trial/index.js.map +1 -0
  44. package/dist/engine/trial-engine.d.ts +2 -0
  45. package/dist/engine/trial-engine.d.ts.map +1 -0
  46. package/dist/engine/trial-engine.js +3 -0
  47. package/dist/engine/trial-engine.js.map +1 -0
  48. package/dist/engine/update-notifier.d.ts +2 -0
  49. package/dist/engine/update-notifier.d.ts.map +1 -1
  50. package/dist/engine/update-notifier.js +12 -0
  51. package/dist/engine/update-notifier.js.map +1 -1
  52. package/dist/index.js +6 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/storage/trial-store.d.ts +19 -0
  55. package/dist/storage/trial-store.d.ts.map +1 -0
  56. package/dist/storage/trial-store.js +50 -0
  57. package/dist/storage/trial-store.js.map +1 -0
  58. package/dist/tools/checkpoint-handler.d.ts.map +1 -1
  59. package/dist/tools/checkpoint-handler.js.map +1 -1
  60. package/dist/tools/init-project/handler.js +1 -1
  61. package/dist/tools/init-project/handler.js.map +1 -1
  62. package/dist/tools/init-project/result-builder.d.ts +1 -1
  63. package/dist/tools/init-project/result-builder.d.ts.map +1 -1
  64. package/dist/tools/init-project/result-builder.js +10 -2
  65. package/dist/tools/init-project/result-builder.js.map +1 -1
  66. package/dist/tools/license-status.d.ts.map +1 -1
  67. package/dist/tools/license-status.js +20 -2
  68. package/dist/tools/license-status.js.map +1 -1
  69. package/dist/tools/orchestrate-agents-handler.d.ts +4 -0
  70. package/dist/tools/orchestrate-agents-handler.d.ts.map +1 -0
  71. package/dist/tools/orchestrate-agents-handler.js +70 -0
  72. package/dist/tools/orchestrate-agents-handler.js.map +1 -0
  73. package/dist/tools/product-insights-handler.d.ts +11 -0
  74. package/dist/tools/product-insights-handler.d.ts.map +1 -0
  75. package/dist/tools/product-insights-handler.js +102 -0
  76. package/dist/tools/product-insights-handler.js.map +1 -0
  77. package/dist/tools/register-product-insights-tools.d.ts +3 -0
  78. package/dist/tools/register-product-insights-tools.d.ts.map +1 -0
  79. package/dist/tools/register-product-insights-tools.js +22 -0
  80. package/dist/tools/register-product-insights-tools.js.map +1 -0
  81. package/dist/tools/register-spec-331-tools.d.ts +3 -0
  82. package/dist/tools/register-spec-331-tools.d.ts.map +1 -0
  83. package/dist/tools/register-spec-331-tools.js +41 -0
  84. package/dist/tools/register-spec-331-tools.js.map +1 -0
  85. package/dist/tools/register-trial-tools.d.ts +3 -0
  86. package/dist/tools/register-trial-tools.d.ts.map +1 -0
  87. package/dist/tools/register-trial-tools.js +16 -0
  88. package/dist/tools/register-trial-tools.js.map +1 -0
  89. package/dist/tools/safe-handler.d.ts +3 -0
  90. package/dist/tools/safe-handler.d.ts.map +1 -1
  91. package/dist/tools/safe-handler.js +43 -3
  92. package/dist/tools/safe-handler.js.map +1 -1
  93. package/dist/tools/status-handler.d.ts.map +1 -1
  94. package/dist/tools/status-handler.js +9 -2
  95. package/dist/tools/status-handler.js.map +1 -1
  96. package/dist/tools/trial-handler.d.ts +5 -0
  97. package/dist/tools/trial-handler.d.ts.map +1 -0
  98. package/dist/tools/trial-handler.js +51 -0
  99. package/dist/tools/trial-handler.js.map +1 -0
  100. package/dist/tools/validate.d.ts.map +1 -1
  101. package/dist/tools/validate.js +3 -1
  102. package/dist/tools/validate.js.map +1 -1
  103. package/dist/types/agent-orchestration.d.ts +54 -0
  104. package/dist/types/agent-orchestration.d.ts.map +1 -0
  105. package/dist/types/agent-orchestration.js +3 -0
  106. package/dist/types/agent-orchestration.js.map +1 -0
  107. package/dist/types/index.d.ts +3 -0
  108. package/dist/types/index.d.ts.map +1 -1
  109. package/dist/types/index.js +3 -0
  110. package/dist/types/index.js.map +1 -1
  111. package/dist/types/product-intelligence.d.ts +60 -0
  112. package/dist/types/product-intelligence.d.ts.map +1 -0
  113. package/dist/types/product-intelligence.js +3 -0
  114. package/dist/types/product-intelligence.js.map +1 -0
  115. package/dist/types/telemetry.d.ts +1 -1
  116. package/dist/types/telemetry.d.ts.map +1 -1
  117. package/dist/types/trial.d.ts +41 -0
  118. package/dist/types/trial.d.ts.map +1 -0
  119. package/dist/types/trial.js +3 -0
  120. package/dist/types/trial.js.map +1 -0
  121. package/package.json +1 -1
  122. package/src/config/license-plans.json +4 -2
@@ -0,0 +1,211 @@
1
+ // engine/product-intelligence/index.ts — SPEC-328: Product Intelligence Layer engine.
2
+ // Queries Supabase telemetry_events to generate product insights reports.
3
+ // Uses the same auth pattern as telemetry-client.ts (fire-and-forget-friendly).
4
+ import { PLANU_VERSION } from '../../config/version.js';
5
+ const SUPABASE_URL = process.env.PLANU_SUPABASE_URL ?? 'https://canusqigtzldstnjddio.supabase.co';
6
+ const SUPABASE_KEY = process.env.PLANU_SUPABASE_KEY ??
7
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImNhbnVzcWlndHpsZHN0bmpkZGlvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzI3NTk2MjgsImV4cCI6MjA4ODMzNTYyOH0.Thw1Xgf9_iabOD75J00u35d2k5NsIpUBU9PrqOShxMU';
8
+ const TELEMETRY_TABLE = `${SUPABASE_URL}/rest/v1/telemetry_events`;
9
+ /** Core tools expected to be active — used for dead-tool detection. */
10
+ const KNOWN_CORE_TOOLS = [
11
+ 'create_spec',
12
+ 'list_specs',
13
+ 'update_status',
14
+ 'validate',
15
+ 'estimate',
16
+ 'init_project',
17
+ 'suggest_stack',
18
+ 'generate_tests',
19
+ 'generate_docs',
20
+ 'challenge_spec',
21
+ 'check_readiness',
22
+ 'decompose_spec',
23
+ 'scan_project',
24
+ 'manage_git',
25
+ 'product_insights',
26
+ ];
27
+ function strProp(props, key) {
28
+ const val = props[key];
29
+ return typeof val === 'string' ? val : '';
30
+ }
31
+ async function fetchEvents(sinceIso) {
32
+ const url = new URL(TELEMETRY_TABLE);
33
+ url.searchParams.set('created_at', `gte.${sinceIso}`);
34
+ url.searchParams.set('select', 'event_name,properties,installation_id,created_at');
35
+ url.searchParams.set('limit', '50000');
36
+ const res = await fetch(url.toString(), {
37
+ headers: {
38
+ apikey: SUPABASE_KEY,
39
+ Authorization: `Bearer ${SUPABASE_KEY}`,
40
+ Accept: 'application/json',
41
+ },
42
+ signal: AbortSignal.timeout(15_000),
43
+ });
44
+ if (!res.ok) {
45
+ throw new Error(`Supabase query failed: ${res.status} ${res.statusText}`);
46
+ }
47
+ return (await res.json());
48
+ }
49
+ function buildAdoption(rows, sinceIso) {
50
+ const map = new Map();
51
+ for (const row of rows) {
52
+ const tool = strProp(row.properties, 'tool');
53
+ if (!tool) {
54
+ continue;
55
+ }
56
+ const event = row.event_name;
57
+ if (!['tool_used', 'tool_error', 'tool_blocked'].includes(event)) {
58
+ continue;
59
+ }
60
+ let stats = map.get(tool);
61
+ if (stats === undefined) {
62
+ stats = { total: 0, installs: new Set(), errors: 0, blocked: 0, lastSeen: sinceIso };
63
+ map.set(tool, stats);
64
+ }
65
+ stats.total += 1;
66
+ stats.installs.add(row.installation_id);
67
+ if (event === 'tool_error') {
68
+ stats.errors += 1;
69
+ }
70
+ if (event === 'tool_blocked') {
71
+ stats.blocked += 1;
72
+ }
73
+ if (row.created_at > stats.lastSeen) {
74
+ stats.lastSeen = row.created_at;
75
+ }
76
+ }
77
+ return Array.from(map.entries()).map(([tool, s]) => ({
78
+ tool,
79
+ totalCalls: s.total,
80
+ uniqueInstalls: s.installs.size,
81
+ errorRate: s.total > 0 ? s.errors / s.total : 0,
82
+ blockedRate: s.total > 0 ? s.blocked / s.total : 0,
83
+ lastSeenAt: s.lastSeen,
84
+ trend: s.total === 1 ? 'new' : 'stable',
85
+ }));
86
+ }
87
+ function buildFriction(rows) {
88
+ const map = new Map();
89
+ for (const row of rows) {
90
+ const tool = strProp(row.properties, 'tool');
91
+ if (!tool) {
92
+ continue;
93
+ }
94
+ if (!['tool_used', 'tool_blocked'].includes(row.event_name)) {
95
+ continue;
96
+ }
97
+ let s = map.get(tool);
98
+ if (s === undefined) {
99
+ s = { blocked: 0, total: 0, messages: [] };
100
+ map.set(tool, s);
101
+ }
102
+ s.total += 1;
103
+ if (row.event_name === 'tool_blocked') {
104
+ s.blocked += 1;
105
+ const msg = strProp(row.properties, 'message');
106
+ if (msg) {
107
+ s.messages.push(msg);
108
+ }
109
+ }
110
+ }
111
+ return Array.from(map.entries())
112
+ .filter(([, s]) => s.blocked > 0)
113
+ .map(([tool, s]) => {
114
+ const msgCounts = new Map();
115
+ for (const m of s.messages) {
116
+ msgCounts.set(m, (msgCounts.get(m) ?? 0) + 1);
117
+ }
118
+ let topMessage = null;
119
+ let maxCount = 0;
120
+ for (const [m, c] of msgCounts.entries()) {
121
+ if (c > maxCount) {
122
+ maxCount = c;
123
+ topMessage = m;
124
+ }
125
+ }
126
+ return {
127
+ tool,
128
+ blockedCount: s.blocked,
129
+ totalCalls: s.total,
130
+ blockedRate: s.total > 0 ? s.blocked / s.total : 0,
131
+ topMessage,
132
+ };
133
+ })
134
+ .sort((a, b) => b.blockedRate - a.blockedRate);
135
+ }
136
+ function buildVersionAdoption(rows) {
137
+ const map = new Map();
138
+ for (const row of rows) {
139
+ const ver = strProp(row.properties, 'planVersion');
140
+ if (!ver) {
141
+ continue;
142
+ }
143
+ let installs = map.get(ver);
144
+ if (installs === undefined) {
145
+ installs = new Set();
146
+ map.set(ver, installs);
147
+ }
148
+ installs.add(row.installation_id);
149
+ }
150
+ const total = Array.from(map.values()).reduce((sum, s) => sum + s.size, 0);
151
+ return Array.from(map.entries())
152
+ .map(([planVersion, installs]) => ({
153
+ planVersion,
154
+ userCount: installs.size,
155
+ pct: total > 0 ? installs.size / total : 0,
156
+ isLatest: planVersion === PLANU_VERSION,
157
+ }))
158
+ .sort((a, b) => b.userCount - a.userCount);
159
+ }
160
+ function buildDeadTools(adoption, sinceIso) {
161
+ const recentlyActive = new Set(adoption.filter((r) => r.lastSeenAt >= sinceIso).map((r) => r.tool));
162
+ return KNOWN_CORE_TOOLS.filter((t) => !recentlyActive.has(t));
163
+ }
164
+ function buildSummary(report) {
165
+ const topTool = report.adoption[0];
166
+ const topFriction = report.frictionPoints[0];
167
+ const lines = [
168
+ `Period: ${report.periodDays}d | Events: ${report.totalEvents} | Installs: ${report.uniqueInstalls}`,
169
+ ];
170
+ if (topTool !== undefined) {
171
+ lines.push(`Most used: ${topTool.tool} (${topTool.totalCalls} calls)`);
172
+ }
173
+ if (topFriction !== undefined) {
174
+ lines.push(`Top friction: ${topFriction.tool} (${(topFriction.blockedRate * 100).toFixed(1)}% blocked)`);
175
+ }
176
+ if (report.deadTools.length > 0) {
177
+ lines.push(`Dead tools: ${report.deadTools.join(', ')}`);
178
+ }
179
+ return lines.join(' | ');
180
+ }
181
+ /**
182
+ * Generates a product insights report by querying Supabase telemetry_events.
183
+ * Throws if the HTTP request fails — caller should handle and return isError.
184
+ */
185
+ export async function generateProductInsights(report, periodDays = 30) {
186
+ const since = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
187
+ const sinceIso = since.toISOString();
188
+ const rows = await fetchEvents(sinceIso);
189
+ const uniqueInstalls = new Set(rows.map((r) => r.installation_id)).size;
190
+ const adoption = report === 'friction' ? [] : buildAdoption(rows, sinceIso);
191
+ const frictionPoints = report === 'versions' || report === 'dead_tools' ? [] : buildFriction(rows);
192
+ const versionAdoption = report === 'adoption' || report === 'friction' || report === 'dead_tools'
193
+ ? []
194
+ : buildVersionAdoption(rows);
195
+ const baseAdoption = adoption.length > 0 ? adoption : buildAdoption(rows, sinceIso);
196
+ const deadTools = report === 'adoption' || report === 'friction' || report === 'versions'
197
+ ? []
198
+ : buildDeadTools(baseAdoption, sinceIso);
199
+ const partial = {
200
+ generatedAt: new Date().toISOString(),
201
+ periodDays,
202
+ totalEvents: rows.length,
203
+ uniqueInstalls,
204
+ adoption,
205
+ frictionPoints,
206
+ versionAdoption,
207
+ deadTools,
208
+ };
209
+ return { ...partial, summary: buildSummary(partial) };
210
+ }
211
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/product-intelligence/index.ts"],"names":[],"mappings":"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"}
@@ -8,14 +8,21 @@ export declare function isErrorReportingEnabled(): boolean;
8
8
  * so no user-specific data is transmitted.
9
9
  */
10
10
  export declare function sanitizeErrorMessage(message: string): string;
11
+ /**
12
+ * Classifies a telemetry event as tool_blocked or tool_error.
13
+ * Gate blocks (DoD, validate score, spec locked, invalid transition) → tool_blocked.
14
+ * Unhandled exceptions → tool_error.
15
+ */
16
+ export declare function classifyToolEvent(errorMessage: string, errorType?: string): 'tool_error' | 'tool_blocked';
11
17
  /**
12
18
  * Sends a tool_error event to Supabase. Fire-and-forget — never throws.
13
19
  * Call this from safe-handler catch blocks after returning isError:true to the user.
14
20
  */
15
21
  export declare function reportToolError(toolName: string, error: unknown): void;
16
22
  /**
17
- * Sends a tool_error event for business-logic validation failures (isError:true responses).
18
- * These are expected errors (missing params, not-found, etc.) but still valuable for monitoring.
23
+ * Sends a tool_error or tool_blocked event for business-logic validation failures.
24
+ * Gate/policy blocks (DoD, spec locked, invalid transitions) emit tool_blocked.
25
+ * Other expected errors (missing params, not-found, etc.) emit tool_error.
19
26
  * Fire-and-forget — never throws.
20
27
  */
21
28
  export declare function reportToolValidationError(toolName: string, message: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"error-reporter.d.ts","sourceRoot":"","sources":["../../../src/engine/telemetry/error-reporter.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAmBtE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBjF"}
1
+ {"version":3,"file":"error-reporter.d.ts","sourceRoot":"","sources":["../../../src/engine/telemetry/error-reporter.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM5D;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,GAAG,cAAc,CAQ/B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAmBtE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBjF"}
@@ -1,4 +1,5 @@
1
1
  // engine/telemetry/error-reporter.ts — SPEC-276: Remote error reporting for tool failures.
2
+ // SPEC-327: Distinguishes tool_blocked (gate/validation blocks) from tool_error (exceptions).
2
3
  // Fire-and-forget. Sends sanitized error info to Supabase on unhandled tool exceptions.
3
4
  // Opt-out: set PLANU_TELEMETRY=off to disable remote reporting.
4
5
  // No PII: only tool name, sanitized error message, version, and Node version are sent.
@@ -22,6 +23,29 @@ export function sanitizeErrorMessage(message) {
22
23
  .replace(/C:\\Users\\[^\s\\]+/g, 'C:\\[user]')
23
24
  .slice(0, 300);
24
25
  }
26
+ /** Patterns in error messages that indicate a gate/policy block (not an exception). */
27
+ const BLOCKED_PATTERNS = [
28
+ 'Blocked:',
29
+ 'is locked',
30
+ 'is already',
31
+ 'Invalid transition',
32
+ 'actuals_required',
33
+ 'does not meet',
34
+ ];
35
+ /**
36
+ * Classifies a telemetry event as tool_blocked or tool_error.
37
+ * Gate blocks (DoD, validate score, spec locked, invalid transition) → tool_blocked.
38
+ * Unhandled exceptions → tool_error.
39
+ */
40
+ export function classifyToolEvent(errorMessage, errorType) {
41
+ if (errorType === 'validation' || errorType === 'gate') {
42
+ return 'tool_blocked';
43
+ }
44
+ if (BLOCKED_PATTERNS.some((pattern) => errorMessage.includes(pattern))) {
45
+ return 'tool_blocked';
46
+ }
47
+ return 'tool_error';
48
+ }
25
49
  /**
26
50
  * Sends a tool_error event to Supabase. Fire-and-forget — never throws.
27
51
  * Call this from safe-handler catch blocks after returning isError:true to the user.
@@ -45,19 +69,22 @@ export function reportToolError(toolName, error) {
45
69
  });
46
70
  }
47
71
  /**
48
- * Sends a tool_error event for business-logic validation failures (isError:true responses).
49
- * These are expected errors (missing params, not-found, etc.) but still valuable for monitoring.
72
+ * Sends a tool_error or tool_blocked event for business-logic validation failures.
73
+ * Gate/policy blocks (DoD, spec locked, invalid transitions) emit tool_blocked.
74
+ * Other expected errors (missing params, not-found, etc.) emit tool_error.
50
75
  * Fire-and-forget — never throws.
51
76
  */
52
77
  export function reportToolValidationError(toolName, message) {
53
78
  if (!isErrorReportingEnabled()) {
54
79
  return;
55
80
  }
81
+ const sanitized = sanitizeErrorMessage(message);
82
+ const event = classifyToolEvent(sanitized, 'validation');
56
83
  sendTelemetryEvent({
57
- event: 'tool_error',
84
+ event,
58
85
  properties: {
59
86
  tool: toolName,
60
- message: sanitizeErrorMessage(message),
87
+ message: sanitized,
61
88
  errorType: 'validation',
62
89
  planVersion: PLANU_VERSION,
63
90
  nodeVersion: process.version,
@@ -1 +1 @@
1
- {"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../../../src/engine/telemetry/error-reporter.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,wFAAwF;AACxF,gEAAgE;AAChE,uFAAuF;AAEvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,KAAK,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO;SACX,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC;SACvC,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC;SACtC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAc;IAC9D,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEjD,kBAAkB,CAAC;QACjB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,OAAe;IACzE,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,kBAAkB,CAAC;QACjB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC;YACtC,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../../../src/engine/telemetry/error-reporter.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,8FAA8F;AAC9F,wFAAwF;AACxF,gEAAgE;AAChE,uFAAuF;AAEvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,KAAK,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO;SACX,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC;SACvC,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC;SACtC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,uFAAuF;AACvF,MAAM,gBAAgB,GAAG;IACvB,UAAU;IACV,WAAW;IACX,YAAY;IACZ,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;CACP,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,SAAkB;IAElB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAc;IAC9D,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEjD,kBAAkB,CAAC;QACjB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,OAAe;IACzE,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEzD,kBAAkB,CAAC;QACjB,KAAK;QACL,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { TrialStatus, RequestTrialResult } from '../../types/index.js';
2
+ import { isTrialActive as storeIsTrialActive } from '../../storage/trial-store.js';
3
+ /**
4
+ * Generates a deterministic, anonymous installation ID from machine attributes.
5
+ * Uses SHA-256(hostname + platform + arch) — no personal data.
6
+ */
7
+ export declare function getInstallationId(): string;
8
+ /**
9
+ * Sends a trial activation request to the Planu trial API.
10
+ * On success the server inserts a row in the `trials` table and returns
11
+ * a UUID trialKey + expiry date.
12
+ */
13
+ export declare function requestTrial(email: string): Promise<RequestTrialResult>;
14
+ /**
15
+ * Returns the current trial status. Fast local read — no network call.
16
+ */
17
+ export declare function getTrialStatus(): Promise<TrialStatus>;
18
+ export { storeIsTrialActive as isTrialActive };
19
+ /**
20
+ * Validates the trial key against the server. If the server says the key is
21
+ * invalid or revoked, marks the trial as expired locally by clearing trialKey.
22
+ * Fire-and-forget — never awaited by callers.
23
+ */
24
+ export declare function validateTrialBackground(): Promise<void>;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/trial/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAGL,aAAa,IAAI,kBAAkB,EAEpC,MAAM,8BAA8B,CAAC;AActC;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAMD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwC7E;AAMD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAe3D;AAMD,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,CAAC;AAM/C;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B7D"}
@@ -0,0 +1,125 @@
1
+ // engine/trial/index.ts — Server-backed 30-day trial business logic
2
+ // Handles installation ID generation, API communication, and local trial state.
3
+ import { createHash } from 'node:crypto';
4
+ import { hostname } from 'node:os';
5
+ import { saveTrialRecord, getTrialRecord, isTrialActive as storeIsTrialActive, getDaysRemaining, } from '../../storage/trial-store.js';
6
+ import { PLANU_VERSION } from '../../config/version.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ const TRIAL_API = 'https://canusqigtzldstnjddio.supabase.co/functions/v1/trial-api';
11
+ const TRIAL_API_TIMEOUT_MS = 10_000;
12
+ // ---------------------------------------------------------------------------
13
+ // Installation ID
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Generates a deterministic, anonymous installation ID from machine attributes.
17
+ * Uses SHA-256(hostname + platform + arch) — no personal data.
18
+ */
19
+ export function getInstallationId() {
20
+ const raw = `${hostname()}|${process.platform}|${process.arch}`;
21
+ return createHash('sha256').update(raw).digest('hex').slice(0, 32);
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Trial API communication
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Sends a trial activation request to the Planu trial API.
28
+ * On success the server inserts a row in the `trials` table and returns
29
+ * a UUID trialKey + expiry date.
30
+ */
31
+ export async function requestTrial(email) {
32
+ const controller = new AbortController();
33
+ const timer = setTimeout(() => {
34
+ controller.abort();
35
+ }, TRIAL_API_TIMEOUT_MS);
36
+ try {
37
+ const response = await fetch(TRIAL_API, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify({ email, installationId: getInstallationId(), version: PLANU_VERSION }),
41
+ signal: controller.signal,
42
+ });
43
+ const body = (await response.json());
44
+ if (!response.ok) {
45
+ const errorMsg = typeof body.error === 'string' ? body.error : 'Trial request failed';
46
+ return { ok: false, error: errorMsg };
47
+ }
48
+ const trialKey = typeof body.trialKey === 'string' ? body.trialKey : '';
49
+ const trialEndsAt = typeof body.trialEndsAt === 'string' ? body.trialEndsAt : '';
50
+ if (!trialKey || !trialEndsAt) {
51
+ return { ok: false, error: 'Invalid response from trial server' };
52
+ }
53
+ return { ok: true, trialKey, trialEndsAt };
54
+ }
55
+ catch (err) {
56
+ const isAbort = err instanceof Error && err.name === 'AbortError';
57
+ return {
58
+ ok: false,
59
+ error: isAbort
60
+ ? 'Trial server request timed out. Try again later.'
61
+ : 'Network error — check your connection and try again.',
62
+ };
63
+ }
64
+ finally {
65
+ clearTimeout(timer);
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Trial status
70
+ // ---------------------------------------------------------------------------
71
+ /**
72
+ * Returns the current trial status. Fast local read — no network call.
73
+ */
74
+ export async function getTrialStatus() {
75
+ const record = await getTrialRecord();
76
+ if (record === null) {
77
+ return { active: false, daysRemaining: 0, endsAt: null, email: null };
78
+ }
79
+ const active = Boolean(record.trialKey) && new Date(record.trialEndsAt).getTime() > Date.now();
80
+ const daysRemaining = await getDaysRemaining();
81
+ return {
82
+ active,
83
+ daysRemaining,
84
+ endsAt: record.trialEndsAt,
85
+ email: record.email,
86
+ };
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Active check (fast local read)
90
+ // ---------------------------------------------------------------------------
91
+ export { storeIsTrialActive as isTrialActive };
92
+ // ---------------------------------------------------------------------------
93
+ // Background re-validation (fire-and-forget, every 7 days)
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Validates the trial key against the server. If the server says the key is
97
+ * invalid or revoked, marks the trial as expired locally by clearing trialKey.
98
+ * Fire-and-forget — never awaited by callers.
99
+ */
100
+ export async function validateTrialBackground() {
101
+ /* v8 ignore start */
102
+ const record = await getTrialRecord();
103
+ if (!record?.trialKey) {
104
+ return;
105
+ }
106
+ try {
107
+ const controller = new AbortController();
108
+ const timer = setTimeout(() => {
109
+ controller.abort();
110
+ }, TRIAL_API_TIMEOUT_MS);
111
+ const response = await fetch(`${TRIAL_API}/validate?key=${encodeURIComponent(record.trialKey)}`, {
112
+ signal: controller.signal,
113
+ });
114
+ clearTimeout(timer);
115
+ if (!response.ok) {
116
+ // Server says key is invalid/revoked — expire locally
117
+ await saveTrialRecord({ ...record, trialEndsAt: new Date(0).toISOString() });
118
+ }
119
+ }
120
+ catch {
121
+ // Network error — keep local state, retry next time
122
+ }
123
+ /* v8 ignore stop */
124
+ }
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/trial/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { getInstallationId, getTrialStatus, isTrialActive, requestTrial, validateTrialBackground, } from './trial/index.js';
2
+ //# sourceMappingURL=trial-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial-engine.d.ts","sourceRoot":"","sources":["../../src/engine/trial-engine.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,uBAAuB,GACxB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // engine/trial-engine.ts — Re-export from engine/trial/ subdirectory
2
+ export { getInstallationId, getTrialStatus, isTrialActive, requestTrial, validateTrialBackground, } from './trial/index.js';
3
+ //# sourceMappingURL=trial-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial-engine.js","sourceRoot":"","sources":["../../src/engine/trial-engine.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,uBAAuB,GACxB,MAAM,kBAAkB,CAAC"}
@@ -1,3 +1,5 @@
1
+ /** Returns and clears the pending update banner (call once per tool response). */
2
+ export declare function consumeUpdateBanner(): string | null;
1
3
  /**
2
4
  * Checks npm registry for a newer version of @planu/cli.
3
5
  * Uses a 24h cache. Fire-and-forget — never throws or blocks startup.
@@ -1 +1 @@
1
- {"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/engine/update-notifier.ts"],"names":[],"mappings":"AAoHA;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrE"}
1
+ {"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/engine/update-notifier.ts"],"names":[],"mappings":"AAkBA,kFAAkF;AAClF,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAInD;AA4GD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrE"}
@@ -6,6 +6,16 @@ import { join } from 'node:path';
6
6
  import { PLANU_VERSION } from '../config/version.js';
7
7
  const NPM_REGISTRY_URL = 'https://registry.npmjs.org/@planu%2Fcli/latest';
8
8
  const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h
9
+ // ---------------------------------------------------------------------------
10
+ // In-process banner cache — consumed once per tool response
11
+ // ---------------------------------------------------------------------------
12
+ let pendingUpdateBanner = null;
13
+ /** Returns and clears the pending update banner (call once per tool response). */
14
+ export function consumeUpdateBanner() {
15
+ const banner = pendingUpdateBanner;
16
+ pendingUpdateBanner = null;
17
+ return banner;
18
+ }
9
19
  function getCachePath(dataDir) {
10
20
  return join(dataDir, 'global', 'update-check.json');
11
21
  }
@@ -99,6 +109,8 @@ function emitUpdateHint(latest) {
99
109
  `[Planu] O ejecuta sin instalar: npx @planu/cli@latest`,
100
110
  ].join('\n');
101
111
  process.stderr.write(msg + '\n');
112
+ // Also set in-process banner so MCP tool responses can surface it
113
+ pendingUpdateBanner = `⚠️ Update available: v${PLANU_VERSION} → v${latest}. Run: npm install -g @planu/cli@latest`;
102
114
  }
103
115
  /**
104
116
  * Checks npm registry for a newer version of @planu/cli.
@@ -1 +1 @@
1
- {"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../../src/engine/update-notifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../../src/engine/update-notifier.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -148,6 +148,9 @@ import { registerComplianceTools } from './tools/register-spec-319.js';
148
148
  import { registerSpecMarketplaceTools } from './tools/register-spec-320.js';
149
149
  import { registerApiContractValidationTools } from './tools/register-spec-322-tools.js';
150
150
  import { registerSpec323Tools } from './tools/register-spec-323-tools.js';
151
+ import { registerProductInsightsTools } from './tools/register-product-insights-tools.js';
152
+ import { registerSpec331Tools } from './tools/register-spec-331-tools.js';
153
+ import { registerTrialTools } from './tools/register-trial-tools.js';
151
154
  // Server setup
152
155
  const SERVER_INSTRUCTIONS = [
153
156
  'CONTEXT — Why structured specs matter:',
@@ -365,6 +368,9 @@ function registerExtendedTools(s) {
365
368
  registerSpecMarketplaceTools(s);
366
369
  registerApiContractValidationTools(s);
367
370
  registerSpec323Tools(s);
371
+ registerProductInsightsTools(s);
372
+ registerSpec331Tools(s);
373
+ registerTrialTools(s);
368
374
  registerPrompts(s);
369
375
  }
370
376
  function createMcpServer() {