prompt-lock 0.2.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 (80) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +21 -0
  3. package/README.md +351 -0
  4. package/dist/assertions/builtin.d.ts +5 -0
  5. package/dist/assertions/builtin.d.ts.map +1 -0
  6. package/dist/assertions/builtin.js +172 -0
  7. package/dist/assertions/builtin.js.map +1 -0
  8. package/dist/assertions/custom.d.ts +3 -0
  9. package/dist/assertions/custom.d.ts.map +1 -0
  10. package/dist/assertions/custom.js +26 -0
  11. package/dist/assertions/custom.js.map +1 -0
  12. package/dist/assertions/index.d.ts +3 -0
  13. package/dist/assertions/index.d.ts.map +1 -0
  14. package/dist/assertions/index.js +32 -0
  15. package/dist/assertions/index.js.map +1 -0
  16. package/dist/assertions/json-schema.d.ts +3 -0
  17. package/dist/assertions/json-schema.d.ts.map +1 -0
  18. package/dist/assertions/json-schema.js +35 -0
  19. package/dist/assertions/json-schema.js.map +1 -0
  20. package/dist/cache.d.ts +14 -0
  21. package/dist/cache.d.ts.map +1 -0
  22. package/dist/cache.js +114 -0
  23. package/dist/cache.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +434 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/config-validation.d.ts +6 -0
  29. package/dist/config-validation.d.ts.map +1 -0
  30. package/dist/config-validation.js +133 -0
  31. package/dist/config-validation.js.map +1 -0
  32. package/dist/github.d.ts +11 -0
  33. package/dist/github.d.ts.map +1 -0
  34. package/dist/github.js +138 -0
  35. package/dist/github.js.map +1 -0
  36. package/dist/index.d.ts +40 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +119 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/providers/anthropic.d.ts +3 -0
  41. package/dist/providers/anthropic.d.ts.map +1 -0
  42. package/dist/providers/anthropic.js +46 -0
  43. package/dist/providers/anthropic.js.map +1 -0
  44. package/dist/providers/custom.d.ts +3 -0
  45. package/dist/providers/custom.d.ts.map +1 -0
  46. package/dist/providers/custom.js +178 -0
  47. package/dist/providers/custom.js.map +1 -0
  48. package/dist/providers/index.d.ts +3 -0
  49. package/dist/providers/index.d.ts.map +1 -0
  50. package/dist/providers/index.js +34 -0
  51. package/dist/providers/index.js.map +1 -0
  52. package/dist/providers/openai.d.ts +3 -0
  53. package/dist/providers/openai.d.ts.map +1 -0
  54. package/dist/providers/openai.js +45 -0
  55. package/dist/providers/openai.js.map +1 -0
  56. package/dist/reporter.d.ts +6 -0
  57. package/dist/reporter.d.ts.map +1 -0
  58. package/dist/reporter.js +251 -0
  59. package/dist/reporter.js.map +1 -0
  60. package/dist/retry.d.ts +8 -0
  61. package/dist/retry.d.ts.map +1 -0
  62. package/dist/retry.js +51 -0
  63. package/dist/retry.js.map +1 -0
  64. package/dist/runner.d.ts +16 -0
  65. package/dist/runner.d.ts.map +1 -0
  66. package/dist/runner.js +203 -0
  67. package/dist/runner.js.map +1 -0
  68. package/dist/snapshot.d.ts +7 -0
  69. package/dist/snapshot.d.ts.map +1 -0
  70. package/dist/snapshot.js +146 -0
  71. package/dist/snapshot.js.map +1 -0
  72. package/dist/types.d.ts +138 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +4 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/utils.d.ts +9 -0
  77. package/dist/utils.d.ts.map +1 -0
  78. package/dist/utils.js +83 -0
  79. package/dist/utils.js.map +1 -0
  80. package/package.json +82 -0
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createCustomProvider = createCustomProvider;
37
+ const https = __importStar(require("https"));
38
+ const http = __importStar(require("http"));
39
+ function createCustomProvider(config) {
40
+ return {
41
+ async call(prompt, options) {
42
+ const body = config.bodyTemplate
43
+ ? JSON.stringify(replaceInObject(config.bodyTemplate, { prompt, model: options?.model ?? '' }))
44
+ : JSON.stringify({
45
+ model: options?.model ?? '',
46
+ messages: [{ role: 'user', content: prompt }],
47
+ max_tokens: options?.maxTokens ?? 1024,
48
+ temperature: options?.temperature,
49
+ });
50
+ const headers = {
51
+ 'Content-Type': 'application/json',
52
+ ...config.headers,
53
+ };
54
+ const controller = options?.timeout ? new AbortController() : undefined;
55
+ const timer = controller
56
+ ? setTimeout(() => controller.abort(), options.timeout)
57
+ : undefined;
58
+ try {
59
+ const responseBody = await httpRequest(config.url, {
60
+ method: 'POST',
61
+ headers,
62
+ body,
63
+ signal: controller?.signal,
64
+ });
65
+ const json = JSON.parse(responseBody);
66
+ return extractResponse(json, config.responsePath);
67
+ }
68
+ catch (e) {
69
+ if (e.name === 'AbortError') {
70
+ throw new Error(`Custom provider call timed out after ${options.timeout}ms`);
71
+ }
72
+ throw new Error(`Custom provider error: ${e.message}`);
73
+ }
74
+ finally {
75
+ if (timer)
76
+ clearTimeout(timer);
77
+ }
78
+ },
79
+ };
80
+ }
81
+ function extractResponse(json, responsePath) {
82
+ if (responsePath) {
83
+ const parts = responsePath.split('.');
84
+ let value = json;
85
+ for (const part of parts) {
86
+ if (value == null)
87
+ return '';
88
+ // Handle array index like "choices[0]"
89
+ const match = part.match(/^(\w+)\[(\d+)\]$/);
90
+ if (match) {
91
+ value = value[match[1]]?.[parseInt(match[2])];
92
+ }
93
+ else {
94
+ value = value[part];
95
+ }
96
+ }
97
+ return typeof value === 'string' ? value : JSON.stringify(value ?? '');
98
+ }
99
+ // Auto-detect common response formats
100
+ // OpenAI-compatible
101
+ if (json.choices?.[0]?.message?.content) {
102
+ return json.choices[0].message.content;
103
+ }
104
+ // Anthropic-compatible
105
+ if (json.content?.[0]?.text) {
106
+ return json.content[0].text;
107
+ }
108
+ // Ollama
109
+ if (json.response) {
110
+ return json.response;
111
+ }
112
+ // Generic: message field
113
+ if (json.message?.content) {
114
+ return json.message.content;
115
+ }
116
+ // Last resort: full JSON
117
+ if (typeof json === 'string')
118
+ return json;
119
+ return JSON.stringify(json);
120
+ }
121
+ function replaceInObject(obj, vars) {
122
+ const result = {};
123
+ for (const [key, value] of Object.entries(obj)) {
124
+ if (typeof value === 'string') {
125
+ result[key] = value.replace(/\{\{([\w.\-]+)\}\}/g, (_, k) => vars[k] ?? '');
126
+ }
127
+ else if (Array.isArray(value)) {
128
+ result[key] = value.map(item => typeof item === 'object' && item !== null
129
+ ? replaceInObject(item, vars)
130
+ : typeof item === 'string'
131
+ ? item.replace(/\{\{([\w.\-]+)\}\}/g, (_, k) => vars[k] ?? '')
132
+ : item);
133
+ }
134
+ else if (typeof value === 'object' && value !== null) {
135
+ result[key] = replaceInObject(value, vars);
136
+ }
137
+ else {
138
+ result[key] = value;
139
+ }
140
+ }
141
+ return result;
142
+ }
143
+ function httpRequest(url, opts) {
144
+ return new Promise((resolve, reject) => {
145
+ const urlObj = new URL(url);
146
+ const transport = urlObj.protocol === 'https:' ? https : http;
147
+ const req = transport.request(urlObj, {
148
+ method: opts.method,
149
+ headers: {
150
+ ...opts.headers,
151
+ 'Content-Length': Buffer.byteLength(opts.body).toString(),
152
+ },
153
+ }, (res) => {
154
+ let data = '';
155
+ res.on('data', chunk => data += chunk);
156
+ res.on('end', () => {
157
+ if (res.statusCode && res.statusCode >= 400) {
158
+ reject(new Error(`HTTP ${res.statusCode}: ${data.slice(0, 200)}`));
159
+ }
160
+ else {
161
+ resolve(data);
162
+ }
163
+ });
164
+ });
165
+ req.on('error', reject);
166
+ if (opts.signal) {
167
+ opts.signal.addEventListener('abort', () => {
168
+ req.destroy();
169
+ const err = new Error('The operation was aborted');
170
+ err.name = 'AbortError';
171
+ reject(err);
172
+ });
173
+ }
174
+ req.write(opts.body);
175
+ req.end();
176
+ });
177
+ }
178
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/providers/custom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { LLMProvider, ProviderConfig } from '../types';
2
+ export declare function getProvider(providerConfig: ProviderConfig, model: string): LLMProvider;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAqB,MAAM,UAAU,CAAC;AAK1E,wBAAgB,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CA4BtF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProvider = getProvider;
4
+ const openai_1 = require("./openai");
5
+ const anthropic_1 = require("./anthropic");
6
+ const custom_1 = require("./custom");
7
+ function getProvider(providerConfig, model) {
8
+ let baseProvider;
9
+ if (typeof providerConfig === 'string') {
10
+ switch (providerConfig) {
11
+ case 'openai':
12
+ baseProvider = (0, openai_1.createOpenAIProvider)();
13
+ break;
14
+ case 'anthropic':
15
+ baseProvider = (0, anthropic_1.createAnthropicProvider)();
16
+ break;
17
+ default:
18
+ throw new Error(`Unknown provider: "${providerConfig}". Supported: openai, anthropic, or use { type: 'custom', url: '...' } for custom endpoints.`);
19
+ }
20
+ }
21
+ else if (providerConfig.type === 'custom') {
22
+ baseProvider = (0, custom_1.createCustomProvider)(providerConfig);
23
+ }
24
+ else {
25
+ throw new Error('Invalid provider configuration.');
26
+ }
27
+ // Wrap so that model is always passed through
28
+ return {
29
+ async call(prompt, options) {
30
+ return baseProvider.call(prompt, { ...options, model });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;AAKA,kCA4BC;AAhCD,qCAAgD;AAChD,2CAAsD;AACtD,qCAAgD;AAEhD,SAAgB,WAAW,CAAC,cAA8B,EAAE,KAAa;IACvE,IAAI,YAAyB,CAAC;IAE9B,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,QAAQ,cAAc,EAAE,CAAC;YACvB,KAAK,QAAQ;gBACX,YAAY,GAAG,IAAA,6BAAoB,GAAE,CAAC;gBACtC,MAAM;YACR,KAAK,WAAW;gBACd,YAAY,GAAG,IAAA,mCAAuB,GAAE,CAAC;gBACzC,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CACb,sBAAsB,cAAc,8FAA8F,CACnI,CAAC;QACN,CAAC;IACH,CAAC;SAAM,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,YAAY,GAAG,IAAA,6BAAoB,EAAC,cAAc,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,8CAA8C;IAC9C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,OAA2B;YACpD,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { LLMProvider } from '../types';
2
+ export declare function createOpenAIProvider(apiKey?: string): LLMProvider;
3
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,UAAU,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAgDjE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOpenAIProvider = createOpenAIProvider;
4
+ function createOpenAIProvider(apiKey) {
5
+ return {
6
+ async call(prompt, options) {
7
+ let OpenAI;
8
+ try {
9
+ OpenAI = require('openai').default || require('openai');
10
+ }
11
+ catch {
12
+ throw new Error('OpenAI SDK not found. Install it with: npm install openai');
13
+ }
14
+ const resolvedKey = apiKey || process.env.OPENAI_API_KEY;
15
+ if (!resolvedKey) {
16
+ throw new Error('OpenAI API key not found. Set OPENAI_API_KEY environment variable or pass apiKey to createOpenAIProvider().');
17
+ }
18
+ const client = new OpenAI({ apiKey: resolvedKey });
19
+ const controller = options?.timeout ? new AbortController() : undefined;
20
+ const timer = controller
21
+ ? setTimeout(() => controller.abort(), options.timeout)
22
+ : undefined;
23
+ try {
24
+ const response = await client.chat.completions.create({
25
+ model: options?.model ?? 'gpt-4o-mini',
26
+ messages: [{ role: 'user', content: prompt }],
27
+ max_tokens: options?.maxTokens ?? 1024,
28
+ temperature: options?.temperature,
29
+ }, controller ? { signal: controller.signal } : undefined);
30
+ return response.choices[0]?.message?.content ?? '';
31
+ }
32
+ catch (e) {
33
+ if (e.name === 'AbortError') {
34
+ throw new Error(`OpenAI call timed out after ${options.timeout}ms`);
35
+ }
36
+ throw e;
37
+ }
38
+ finally {
39
+ if (timer)
40
+ clearTimeout(timer);
41
+ }
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":";;AAEA,oDAgDC;AAhDD,SAAgB,oBAAoB,CAAC,MAAe;IAClD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,OAAgD;YACzE,IAAI,MAAW,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAEnD,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,MAAM,KAAK,GAAG,UAAU;gBACtB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAQ,CAAC,OAAO,CAAC;gBACxD,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CACnD;oBACE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,aAAa;oBACtC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC7C,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;oBACtC,WAAW,EAAE,OAAO,EAAE,WAAW;iBAClC,EACD,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CACvD,CAAC;gBAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACrD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAK,CAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;oBAAS,CAAC;gBACT,IAAI,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { RunResult, DiffResult } from './types';
2
+ export declare function printConsoleReport(results: RunResult[]): void;
3
+ export declare function printDiffReport(diffs: DiffResult[]): void;
4
+ export declare function generateJsonReport(results: RunResult[], outputDir?: string): Promise<string>;
5
+ export declare function generateHtmlReport(results: RunResult[], outputDir?: string): Promise<string>;
6
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMhD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CA0D7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAiBzD;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,SAAS,EAAE,EACpB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,SAAS,EAAE,EACpB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,CAAC,CA0GjB"}
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.printConsoleReport = printConsoleReport;
40
+ exports.printDiffReport = printDiffReport;
41
+ exports.generateJsonReport = generateJsonReport;
42
+ exports.generateHtmlReport = generateHtmlReport;
43
+ const path = __importStar(require("path"));
44
+ const chalk_1 = __importDefault(require("chalk"));
45
+ const utils_1 = require("./utils");
46
+ const fs = __importStar(require("fs"));
47
+ const DEFAULT_REPORT_DIR = '.promptlock/reports';
48
+ function printConsoleReport(results) {
49
+ const total = results.length;
50
+ const passed = results.filter(r => r.passed).length;
51
+ const failed = total - passed;
52
+ console.log('');
53
+ console.log(chalk_1.default.bold(`prompt-lock run — ${total} prompt${total !== 1 ? 's' : ''} evaluated`));
54
+ console.log('');
55
+ for (const result of results) {
56
+ const icon = result.passed ? chalk_1.default.green('✅') : chalk_1.default.red('❌');
57
+ const assertionCount = result.assertions.length;
58
+ const assertionPassed = result.assertions.filter(a => a.passed).length;
59
+ console.log(`${icon} ${chalk_1.default.bold(result.id)}` +
60
+ ` ${assertionPassed}/${assertionCount} assertions passed` +
61
+ ` ${chalk_1.default.dim(`(${result.duration}ms)`)}`);
62
+ // Show failed assertions
63
+ const failedAssertions = result.assertions.filter(a => !a.passed);
64
+ for (const assertion of failedAssertions) {
65
+ console.log(chalk_1.default.red(` └─ FAIL: ${assertion.name}`) +
66
+ (assertion.expected ? chalk_1.default.dim(` (expected ${assertion.expected}, got ${assertion.actual})`) : '') +
67
+ (assertion.message ? chalk_1.default.dim(` — ${assertion.message}`) : ''));
68
+ }
69
+ // Show dataset results if present
70
+ if (result.datasetResults && result.datasetResults.length > 0) {
71
+ const dsPassed = result.datasetResults.filter(d => d.passed).length;
72
+ const dsTotal = result.datasetResults.length;
73
+ const dsIcon = dsPassed === dsTotal ? chalk_1.default.green('✅') : chalk_1.default.red('❌');
74
+ console.log(` ${dsIcon} dataset: ${dsPassed}/${dsTotal} inputs passed`);
75
+ for (let i = 0; i < result.datasetResults.length; i++) {
76
+ const ds = result.datasetResults[i];
77
+ if (!ds.passed) {
78
+ const dsFailed = ds.assertions.filter(a => !a.passed);
79
+ const varsStr = Object.entries(ds.vars).map(([k, v]) => `${k}="${v.slice(0, 30)}"`).join(', ');
80
+ console.log(chalk_1.default.red(` └─ input[${i}] (${varsStr}): `) +
81
+ chalk_1.default.dim(dsFailed.map(a => a.name).join(', ')));
82
+ }
83
+ }
84
+ }
85
+ }
86
+ console.log('');
87
+ if (failed > 0) {
88
+ console.log(chalk_1.default.red(`Run complete. ${failed} failure${failed !== 1 ? 's' : ''}. Exit code: 1`));
89
+ }
90
+ else {
91
+ console.log(chalk_1.default.green(`Run complete. All ${total} prompt${total !== 1 ? 's' : ''} passed.`));
92
+ }
93
+ }
94
+ function printDiffReport(diffs) {
95
+ for (const diff of diffs) {
96
+ console.log('');
97
+ console.log(chalk_1.default.bold(`Diff: ${diff.id}`) + chalk_1.default.dim(` (snapshot from ${diff.snapshotTimestamp})`));
98
+ console.log('');
99
+ for (const change of diff.changes) {
100
+ if (change.added) {
101
+ process.stdout.write(chalk_1.default.green(`+ ${change.value}`));
102
+ }
103
+ else if (change.removed) {
104
+ process.stdout.write(chalk_1.default.red(`- ${change.value}`));
105
+ }
106
+ else {
107
+ process.stdout.write(chalk_1.default.dim(` ${change.value}`));
108
+ }
109
+ }
110
+ console.log('');
111
+ }
112
+ }
113
+ async function generateJsonReport(results, outputDir = DEFAULT_REPORT_DIR) {
114
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
115
+ const filePath = path.join(outputDir, `run-${timestamp}.json`);
116
+ const report = {
117
+ timestamp: new Date().toISOString(),
118
+ total: results.length,
119
+ passed: results.filter(r => r.passed).length,
120
+ failed: results.filter(r => !r.passed).length,
121
+ results: results.map(r => ({
122
+ id: r.id,
123
+ version: r.version,
124
+ provider: r.provider,
125
+ model: r.model,
126
+ passed: r.passed,
127
+ duration: r.duration,
128
+ assertions: r.assertions,
129
+ outputPreview: r.output.slice(0, 500),
130
+ datasetResults: r.datasetResults?.map(d => ({
131
+ vars: d.vars,
132
+ passed: d.passed,
133
+ duration: d.duration,
134
+ assertions: d.assertions,
135
+ outputPreview: d.output.slice(0, 200),
136
+ })),
137
+ })),
138
+ };
139
+ await (0, utils_1.writeJsonFile)(filePath, report);
140
+ return filePath;
141
+ }
142
+ async function generateHtmlReport(results, outputDir = DEFAULT_REPORT_DIR) {
143
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
144
+ const filePath = path.join(outputDir, `run-${timestamp}.html`);
145
+ const total = results.length;
146
+ const passed = results.filter(r => r.passed).length;
147
+ const failed = total - passed;
148
+ const resultRows = results.map(r => {
149
+ const statusClass = r.passed ? 'pass' : 'fail';
150
+ const statusIcon = r.passed ? '✅' : '❌';
151
+ const assertionRows = r.assertions.map(a => `
152
+ <tr class="${a.passed ? 'pass' : 'fail'}">
153
+ <td>${escapeHtml(a.type)}</td>
154
+ <td>${escapeHtml(a.name)}</td>
155
+ <td>${a.passed ? '✅ Pass' : '❌ Fail'}</td>
156
+ <td>${escapeHtml(a.expected ?? '')}</td>
157
+ <td>${escapeHtml(a.actual ?? '')}</td>
158
+ <td>${escapeHtml(a.message ?? '')}</td>
159
+ </tr>
160
+ `).join('');
161
+ return `
162
+ <div class="prompt-result ${statusClass}">
163
+ <h3>${statusIcon} ${escapeHtml(r.id)} <span class="meta">v${escapeHtml(r.version ?? '?')} · ${escapeHtml(r.provider)}/${escapeHtml(r.model)} · ${r.duration}ms</span></h3>
164
+ <details>
165
+ <summary>Prompt</summary>
166
+ <pre class="prompt-text">${escapeHtml(r.prompt)}</pre>
167
+ </details>
168
+ <details>
169
+ <summary>Output</summary>
170
+ <pre class="output-text">${escapeHtml(r.output.length > 2000 ? r.output.slice(0, 2000) + `\n... (truncated, ${r.output.length} chars total)` : r.output)}</pre>
171
+ </details>
172
+ <table>
173
+ <thead>
174
+ <tr><th>Type</th><th>Name</th><th>Result</th><th>Expected</th><th>Actual</th><th>Message</th></tr>
175
+ </thead>
176
+ <tbody>${assertionRows}</tbody>
177
+ </table>
178
+ ${r.datasetResults && r.datasetResults.length > 0 ? `
179
+ <details>
180
+ <summary>Dataset Results (${r.datasetResults.filter(d => d.passed).length}/${r.datasetResults.length} passed)</summary>
181
+ <table>
182
+ <thead>
183
+ <tr><th>#</th><th>Variables</th><th>Result</th><th>Duration</th><th>Failures</th></tr>
184
+ </thead>
185
+ <tbody>
186
+ ${r.datasetResults.map((d, i) => `
187
+ <tr class="${d.passed ? 'pass' : 'fail'}">
188
+ <td>${i + 1}</td>
189
+ <td><code>${escapeHtml(JSON.stringify(d.vars).slice(0, 100))}</code></td>
190
+ <td>${d.passed ? '✅ Pass' : '❌ Fail'}</td>
191
+ <td>${d.duration}ms</td>
192
+ <td>${d.passed ? '' : escapeHtml(d.assertions.filter(a => !a.passed).map(a => a.name).join(', '))}</td>
193
+ </tr>
194
+ `).join('')}
195
+ </tbody>
196
+ </table>
197
+ </details>` : ''}
198
+ </div>
199
+ `;
200
+ }).join('');
201
+ const html = `<!DOCTYPE html>
202
+ <html lang="en">
203
+ <head>
204
+ <meta charset="UTF-8">
205
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
206
+ <title>prompt-lock Report</title>
207
+ <style>
208
+ * { margin: 0; padding: 0; box-sizing: border-box; }
209
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; padding: 2rem; background: #f8f9fa; color: #212529; }
210
+ h1 { margin-bottom: 0.5rem; }
211
+ .summary { margin-bottom: 2rem; padding: 1rem; background: white; border-radius: 8px; border: 1px solid #dee2e6; }
212
+ .summary .stat { display: inline-block; margin-right: 2rem; font-size: 1.1rem; }
213
+ .stat.fail-count { color: #dc3545; font-weight: bold; }
214
+ .stat.pass-count { color: #28a745; font-weight: bold; }
215
+ .prompt-result { margin-bottom: 1.5rem; padding: 1rem; background: white; border-radius: 8px; border-left: 4px solid #28a745; }
216
+ .prompt-result.fail { border-left-color: #dc3545; }
217
+ .prompt-result h3 { margin-bottom: 0.75rem; }
218
+ .prompt-result .meta { font-weight: normal; color: #6c757d; font-size: 0.85rem; }
219
+ details { margin-bottom: 0.75rem; }
220
+ summary { cursor: pointer; font-weight: 500; padding: 0.25rem 0; }
221
+ pre { background: #f1f3f5; padding: 1rem; border-radius: 4px; overflow-x: auto; font-size: 0.85rem; margin-top: 0.5rem; white-space: pre-wrap; }
222
+ table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
223
+ th, td { padding: 0.5rem; text-align: left; border-bottom: 1px solid #dee2e6; }
224
+ th { background: #f1f3f5; font-weight: 600; }
225
+ tr.fail { background: #fff5f5; }
226
+ tr.pass { background: #f0fff0; }
227
+ </style>
228
+ </head>
229
+ <body>
230
+ <h1>prompt-lock Report</h1>
231
+ <p style="color: #6c757d; margin-bottom: 1.5rem;">${new Date().toISOString()}</p>
232
+ <div class="summary">
233
+ <span class="stat">Total: ${total}</span>
234
+ <span class="stat pass-count">Passed: ${passed}</span>
235
+ ${failed > 0 ? `<span class="stat fail-count">Failed: ${failed}</span>` : ''}
236
+ </div>
237
+ ${resultRows}
238
+ </body>
239
+ </html>`;
240
+ await (0, utils_1.ensureDir)(outputDir);
241
+ await fs.promises.writeFile(filePath, html, 'utf-8');
242
+ return filePath;
243
+ }
244
+ function escapeHtml(s) {
245
+ return s
246
+ .replace(/&/g, '&amp;')
247
+ .replace(/</g, '&lt;')
248
+ .replace(/>/g, '&gt;')
249
+ .replace(/"/g, '&quot;');
250
+ }
251
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface RetryOptions {
2
+ maxRetries: number;
3
+ baseDelayMs: number;
4
+ maxDelayMs: number;
5
+ retryableErrors?: string[];
6
+ }
7
+ export declare function withRetry<T>(fn: () => Promise<T>, opts?: Partial<RetryOptions>, onRetry?: (attempt: number, error: Error, delayMs: number) => void): Promise<T>;
8
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAuBD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,EAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACjE,OAAO,CAAC,CAAC,CAAC,CAiCZ"}
package/dist/retry.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withRetry = withRetry;
4
+ const DEFAULT_RETRY_OPTIONS = {
5
+ maxRetries: 3,
6
+ baseDelayMs: 1000,
7
+ maxDelayMs: 15000,
8
+ retryableErrors: [
9
+ 'ECONNRESET',
10
+ 'ETIMEDOUT',
11
+ 'ECONNREFUSED',
12
+ 'ENOTFOUND',
13
+ 'rate_limit',
14
+ 'Rate limit',
15
+ '429',
16
+ '500',
17
+ '502',
18
+ '503',
19
+ '529',
20
+ 'overloaded',
21
+ 'The operation was aborted',
22
+ ],
23
+ };
24
+ async function withRetry(fn, opts, onRetry) {
25
+ const options = { ...DEFAULT_RETRY_OPTIONS, ...opts };
26
+ let lastError;
27
+ for (let attempt = 0; attempt <= options.maxRetries; attempt++) {
28
+ try {
29
+ return await fn();
30
+ }
31
+ catch (error) {
32
+ lastError = error;
33
+ if (attempt >= options.maxRetries)
34
+ break;
35
+ // Check if error is retryable
36
+ const errorMessage = lastError.message || '';
37
+ const isRetryable = options.retryableErrors?.some(pattern => errorMessage.includes(pattern)) ?? false;
38
+ if (!isRetryable)
39
+ break;
40
+ // Exponential backoff with jitter
41
+ const delay = Math.min(options.baseDelayMs * Math.pow(2, attempt) + Math.random() * 500, options.maxDelayMs);
42
+ onRetry?.(attempt + 1, lastError, delay);
43
+ await sleep(delay);
44
+ }
45
+ }
46
+ throw lastError;
47
+ }
48
+ function sleep(ms) {
49
+ return new Promise(resolve => setTimeout(resolve, ms));
50
+ }
51
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":";;AA4BA,8BAqCC;AA1DD,MAAM,qBAAqB,GAAiB;IAC1C,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE;QACf,YAAY;QACZ,WAAW;QACX,cAAc;QACd,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,YAAY;QACZ,2BAA2B;KAC5B;CACF,CAAC;AAEK,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,IAA4B,EAC5B,OAAkE;IAElE,MAAM,OAAO,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,IAAI,EAAE,CAAC;IACtD,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAc,CAAC;YAE3B,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU;gBAAE,MAAM;YAEzC,8BAA8B;YAC9B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAC1D,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC/B,IAAI,KAAK,CAAC;YAEX,IAAI,CAAC,WAAW;gBAAE,MAAM;YAExB,kCAAkC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAChE,OAAO,CAAC,UAAU,CACnB,CAAC;YAEF,OAAO,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAEzC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}