@promptwheel/core 0.6.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 (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. package/package.json +126 -0
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Pure trajectory algorithms — no filesystem.
3
+ *
4
+ * Shared by both @promptwheel/cli and @promptwheel/mcp.
5
+ * Callers handle file I/O (reading YAML files from .promptwheel/trajectories/).
6
+ *
7
+ * A trajectory is a DAG of ordered steps that the wheel follows across cycles.
8
+ * Each step constrains the scout's scope, categories, and acceptance criteria.
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Pure algorithms
12
+ // ---------------------------------------------------------------------------
13
+ const DEFAULT_MAX_RETRIES = 3;
14
+ /** Can this step start? All dependencies must be completed. */
15
+ export function stepReady(step, states) {
16
+ for (const depId of step.depends_on) {
17
+ const dep = states[depId];
18
+ if (!dep || dep.status !== 'completed')
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ /** Pick next step: first ready step in declaration order that is pending or active. */
24
+ export function getNextStep(trajectory, states) {
25
+ for (const step of trajectory.steps) {
26
+ const state = states[step.id];
27
+ if (!state)
28
+ continue;
29
+ if (state.status === 'completed' || state.status === 'skipped' || state.status === 'failed')
30
+ continue;
31
+ if (stepReady(step, states))
32
+ return step;
33
+ }
34
+ return null;
35
+ }
36
+ /** All steps completed or skipped? */
37
+ export function trajectoryComplete(trajectory, states) {
38
+ for (const step of trajectory.steps) {
39
+ const state = states[step.id];
40
+ if (!state)
41
+ return false;
42
+ if (state.status !== 'completed' && state.status !== 'skipped')
43
+ return false;
44
+ }
45
+ return true;
46
+ }
47
+ /** Stuck: current step has failed 3+ cycles with no progress. Returns stuck step ID or null. */
48
+ export function trajectoryStuck(states, maxRetries = DEFAULT_MAX_RETRIES) {
49
+ for (const [stepId, state] of Object.entries(states)) {
50
+ if (state.status === 'active' && state.cyclesAttempted >= maxRetries) {
51
+ return stepId;
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ /** Format trajectory context for scout prompt injection. */
57
+ export function formatTrajectoryForPrompt(trajectory, states, currentStep) {
58
+ const lines = [
59
+ '<trajectory>',
60
+ `## Trajectory: ${trajectory.name}`,
61
+ trajectory.description,
62
+ '',
63
+ ];
64
+ // Completed steps
65
+ const completed = trajectory.steps.filter(s => states[s.id]?.status === 'completed');
66
+ if (completed.length > 0) {
67
+ lines.push('### Completed Steps');
68
+ for (const step of completed) {
69
+ lines.push(`- [x] ${step.title}`);
70
+ }
71
+ lines.push('');
72
+ }
73
+ // Current step (the focus)
74
+ lines.push('### Current Step (FOCUS HERE)');
75
+ lines.push(`**${currentStep.title}**`);
76
+ lines.push(currentStep.description);
77
+ lines.push('');
78
+ if (currentStep.acceptance_criteria.length > 0) {
79
+ lines.push('**Acceptance Criteria:**');
80
+ for (const ac of currentStep.acceptance_criteria) {
81
+ lines.push(`- ${ac}`);
82
+ }
83
+ lines.push('');
84
+ }
85
+ if (currentStep.scope) {
86
+ lines.push(`**Scope:** \`${currentStep.scope}\``);
87
+ }
88
+ if (currentStep.categories && currentStep.categories.length > 0) {
89
+ lines.push(`**Categories:** ${currentStep.categories.join(', ')}`);
90
+ }
91
+ if (currentStep.measure) {
92
+ const arrow = currentStep.measure.direction === 'up' ? '>' : '<';
93
+ lines.push(`**Measure:** target ${arrow}= ${currentStep.measure.target}`);
94
+ }
95
+ const stepState = states[currentStep.id];
96
+ if (stepState && stepState.cyclesAttempted > 0) {
97
+ lines.push(`**Attempts:** ${stepState.cyclesAttempted} cycle(s) so far`);
98
+ }
99
+ lines.push('');
100
+ // Remaining steps
101
+ const remaining = trajectory.steps.filter(s => {
102
+ const st = states[s.id];
103
+ return st && s.id !== currentStep.id && st.status !== 'completed' && st.status !== 'skipped';
104
+ });
105
+ if (remaining.length > 0) {
106
+ lines.push('### Upcoming Steps');
107
+ for (const step of remaining) {
108
+ if (step.id === currentStep.id)
109
+ continue;
110
+ const deps = step.depends_on.length > 0 ? ` (after: ${step.depends_on.join(', ')})` : '';
111
+ lines.push(`- [ ] ${step.title}${deps}`);
112
+ }
113
+ lines.push('');
114
+ }
115
+ lines.push('Proposals should advance the **current step** toward its acceptance criteria.');
116
+ lines.push('</trajectory>');
117
+ return lines.join('\n');
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Trajectory YAML parsing (pure — no filesystem)
121
+ // ---------------------------------------------------------------------------
122
+ /**
123
+ * Parse a trajectory YAML document into a Trajectory object.
124
+ * Handles the nested steps array with all fields.
125
+ */
126
+ export function parseTrajectoryYaml(content) {
127
+ const lines = content.split('\n');
128
+ let name = '';
129
+ let description = '';
130
+ const steps = [];
131
+ let currentStep = null;
132
+ let currentListKey = null;
133
+ let currentList = [];
134
+ let inMeasure = false;
135
+ let measureObj = {};
136
+ function flushList() {
137
+ if (currentStep && currentListKey && currentList.length > 0) {
138
+ currentStep[currentListKey] = [...currentList];
139
+ }
140
+ currentListKey = null;
141
+ currentList = [];
142
+ }
143
+ function flushMeasure() {
144
+ if (currentStep && inMeasure && measureObj.cmd !== undefined && measureObj.target !== undefined && measureObj.direction) {
145
+ currentStep.measure = { cmd: measureObj.cmd, target: measureObj.target, direction: measureObj.direction };
146
+ }
147
+ inMeasure = false;
148
+ measureObj = {};
149
+ }
150
+ function flushStep() {
151
+ flushList();
152
+ flushMeasure();
153
+ if (currentStep && currentStep.id) {
154
+ steps.push({
155
+ id: currentStep.id,
156
+ title: currentStep.title ?? '',
157
+ description: currentStep.description ?? '',
158
+ scope: currentStep.scope,
159
+ categories: currentStep.categories,
160
+ acceptance_criteria: currentStep.acceptance_criteria ?? [],
161
+ verification_commands: currentStep.verification_commands ?? [],
162
+ depends_on: currentStep.depends_on ?? [],
163
+ measure: currentStep.measure,
164
+ });
165
+ }
166
+ currentStep = null;
167
+ }
168
+ for (const line of lines) {
169
+ const trimmed = line.trim();
170
+ // Skip comments and empty lines at top level
171
+ if (trimmed.startsWith('#') || trimmed === '') {
172
+ // Empty line in a list context ends the list
173
+ if (trimmed === '' && currentListKey) {
174
+ flushList();
175
+ }
176
+ continue;
177
+ }
178
+ // Top-level fields
179
+ if (!line.startsWith(' ') && !line.startsWith('\t')) {
180
+ flushStep();
181
+ const match = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
182
+ if (match) {
183
+ const [, key, value] = match;
184
+ if (key === 'name')
185
+ name = value.trim();
186
+ else if (key === 'description')
187
+ description = value.trim();
188
+ }
189
+ continue;
190
+ }
191
+ // Steps array marker
192
+ if (trimmed === '- id:' || trimmed.startsWith('- id:')) {
193
+ flushStep();
194
+ currentStep = {};
195
+ const idMatch = trimmed.match(/^-\s*id\s*:\s*(.*)/);
196
+ if (idMatch) {
197
+ currentStep.id = idMatch[1].trim();
198
+ }
199
+ continue;
200
+ }
201
+ // Inside a step
202
+ if (currentStep) {
203
+ // Check for measure sub-object
204
+ if (inMeasure) {
205
+ const mMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
206
+ if (mMatch) {
207
+ const [, mKey, mVal] = mMatch;
208
+ // Check indent — measure fields should be deeper than "measure:"
209
+ const indent = line.length - line.trimStart().length;
210
+ if (indent >= 6) {
211
+ if (mKey === 'cmd')
212
+ measureObj.cmd = mVal.trim().replace(/^["']|["']$/g, '');
213
+ else if (mKey === 'target')
214
+ measureObj.target = parseFloat(mVal.trim());
215
+ else if (mKey === 'direction')
216
+ measureObj.direction = mVal.trim();
217
+ continue;
218
+ }
219
+ else {
220
+ // Back to step level
221
+ flushMeasure();
222
+ }
223
+ }
224
+ }
225
+ // List item
226
+ if (trimmed.startsWith('- ')) {
227
+ const item = trimmed.slice(2).trim();
228
+ if (currentListKey) {
229
+ currentList.push(item);
230
+ continue;
231
+ }
232
+ }
233
+ // Key: value within a step
234
+ const kvMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
235
+ if (kvMatch) {
236
+ flushList();
237
+ const [, key, rawVal] = kvMatch;
238
+ const val = rawVal.trim();
239
+ switch (key) {
240
+ case 'title':
241
+ currentStep.title = val;
242
+ break;
243
+ case 'description':
244
+ currentStep.description = val;
245
+ break;
246
+ case 'scope':
247
+ currentStep.scope = val.replace(/^["']|["']$/g, '');
248
+ break;
249
+ case 'categories':
250
+ currentStep.categories = parseSimpleList(val);
251
+ break;
252
+ case 'acceptance_criteria':
253
+ currentListKey = 'acceptance_criteria';
254
+ currentList = [];
255
+ break;
256
+ case 'verification_commands':
257
+ currentListKey = 'verification_commands';
258
+ currentList = [];
259
+ break;
260
+ case 'depends_on':
261
+ currentStep.depends_on = parseSimpleList(val);
262
+ break;
263
+ case 'measure':
264
+ inMeasure = true;
265
+ measureObj = {};
266
+ break;
267
+ default:
268
+ break;
269
+ }
270
+ }
271
+ }
272
+ }
273
+ // Flush final step
274
+ flushStep();
275
+ return { name, description, steps };
276
+ }
277
+ /** Parse "[a, b, c]" or "a, b, c" → string[]. Also handles YAML inline sequences. */
278
+ function parseSimpleList(value) {
279
+ const stripped = value.replace(/^\[/, '').replace(/\]$/, '');
280
+ return stripped.split(',').map(s => s.trim()).filter(s => s.length > 0);
281
+ }
282
+ // ---------------------------------------------------------------------------
283
+ // State initialization
284
+ // ---------------------------------------------------------------------------
285
+ /** Create initial step states for a trajectory. */
286
+ export function createInitialStepStates(trajectory) {
287
+ const states = {};
288
+ for (const step of trajectory.steps) {
289
+ states[step.id] = {
290
+ stepId: step.id,
291
+ status: 'pending',
292
+ cyclesAttempted: 0,
293
+ lastAttemptedCycle: 0,
294
+ };
295
+ }
296
+ return states;
297
+ }
298
+ // ---------------------------------------------------------------------------
299
+ // YAML serialization (inverse of parseTrajectoryYaml)
300
+ // ---------------------------------------------------------------------------
301
+ /** Serialize a Trajectory to YAML that parseTrajectoryYaml can round-trip. */
302
+ export function serializeTrajectoryToYaml(trajectory) {
303
+ const lines = [];
304
+ lines.push(`name: ${trajectory.name}`);
305
+ lines.push(`description: ${trajectory.description}`);
306
+ lines.push('steps:');
307
+ for (const step of trajectory.steps) {
308
+ lines.push(` - id: ${step.id}`);
309
+ lines.push(` title: ${step.title}`);
310
+ lines.push(` description: ${step.description}`);
311
+ if (step.scope) {
312
+ lines.push(` scope: "${step.scope}"`);
313
+ }
314
+ if (step.categories && step.categories.length > 0) {
315
+ lines.push(` categories: [${step.categories.join(', ')}]`);
316
+ }
317
+ lines.push(' acceptance_criteria:');
318
+ for (const ac of step.acceptance_criteria) {
319
+ lines.push(` - ${ac}`);
320
+ }
321
+ lines.push(' verification_commands:');
322
+ for (const vc of step.verification_commands) {
323
+ lines.push(` - ${vc}`);
324
+ }
325
+ lines.push(` depends_on: [${step.depends_on.join(', ')}]`);
326
+ if (step.measure) {
327
+ lines.push(' measure:');
328
+ lines.push(` cmd: "${step.measure.cmd}"`);
329
+ lines.push(` target: ${step.measure.target}`);
330
+ lines.push(` direction: ${step.measure.direction}`);
331
+ }
332
+ lines.push('');
333
+ }
334
+ return lines.join('\n');
335
+ }
336
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/trajectory/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ID generation utilities
3
+ */
4
+ /**
5
+ * Generate a random ID
6
+ */
7
+ export declare function nanoid(size?: number): string;
8
+ /**
9
+ * Generate a prefixed ID
10
+ */
11
+ export declare function prefixedId(prefix: string, size?: number): string;
12
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAWhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ID generation utilities
3
+ */
4
+ const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';
5
+ /**
6
+ * Generate a random ID
7
+ */
8
+ export function nanoid(size = 21) {
9
+ let id = '';
10
+ const bytes = new Uint8Array(size);
11
+ // eslint-disable-next-line no-undef
12
+ crypto.getRandomValues(bytes);
13
+ for (let i = 0; i < size; i++) {
14
+ id += ALPHABET[bytes[i] % ALPHABET.length];
15
+ }
16
+ return id;
17
+ }
18
+ /**
19
+ * Generate a prefixed ID
20
+ */
21
+ export function prefixedId(prefix, size = 12) {
22
+ return `${prefix}_${nanoid(size)}`;
23
+ }
24
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE;IACtC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,OAAe,EAAE;IAC1D,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for ID generation utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=id.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.test.d.ts","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Tests for ID generation utilities
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { nanoid, prefixedId } from './id.js';
6
+ const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';
7
+ describe('nanoid', () => {
8
+ describe('length', () => {
9
+ it('generates string of default length (21)', () => {
10
+ const id = nanoid();
11
+ expect(id).toHaveLength(21);
12
+ });
13
+ it('generates string of specified length', () => {
14
+ expect(nanoid(10)).toHaveLength(10);
15
+ expect(nanoid(32)).toHaveLength(32);
16
+ expect(nanoid(100)).toHaveLength(100);
17
+ });
18
+ it('handles size=0', () => {
19
+ const id = nanoid(0);
20
+ expect(id).toBe('');
21
+ expect(id).toHaveLength(0);
22
+ });
23
+ it('handles size=1', () => {
24
+ const id = nanoid(1);
25
+ expect(id).toHaveLength(1);
26
+ expect(ALPHABET).toContain(id);
27
+ });
28
+ });
29
+ describe('character set', () => {
30
+ it('only uses characters from ALPHABET', () => {
31
+ // Generate multiple IDs to increase coverage
32
+ for (let i = 0; i < 100; i++) {
33
+ const id = nanoid(50);
34
+ for (const char of id) {
35
+ expect(ALPHABET).toContain(char);
36
+ }
37
+ }
38
+ });
39
+ it('produces lowercase alphanumeric characters only', () => {
40
+ const id = nanoid(100);
41
+ expect(id).toMatch(/^[0-9a-z]+$/);
42
+ });
43
+ });
44
+ describe('uniqueness', () => {
45
+ it('generates unique IDs across multiple calls', () => {
46
+ const ids = new Set();
47
+ const count = 1000;
48
+ for (let i = 0; i < count; i++) {
49
+ ids.add(nanoid());
50
+ }
51
+ expect(ids.size).toBe(count);
52
+ });
53
+ it('generates unique IDs even with small size', () => {
54
+ // With size=8 and 36-char alphabet, we have 36^8 = 2.8 trillion possibilities
55
+ // 100 samples should still be unique
56
+ const ids = new Set();
57
+ const count = 100;
58
+ for (let i = 0; i < count; i++) {
59
+ ids.add(nanoid(8));
60
+ }
61
+ expect(ids.size).toBe(count);
62
+ });
63
+ });
64
+ describe('randomness', () => {
65
+ it('produces different IDs on consecutive calls', () => {
66
+ const id1 = nanoid();
67
+ const id2 = nanoid();
68
+ const id3 = nanoid();
69
+ expect(id1).not.toBe(id2);
70
+ expect(id2).not.toBe(id3);
71
+ expect(id1).not.toBe(id3);
72
+ });
73
+ });
74
+ describe('edge cases', () => {
75
+ it('handles large sizes', () => {
76
+ const id = nanoid(1000);
77
+ expect(id).toHaveLength(1000);
78
+ expect(id).toMatch(/^[0-9a-z]+$/);
79
+ });
80
+ });
81
+ });
82
+ describe('prefixedId', () => {
83
+ describe('format', () => {
84
+ it('returns prefix_id format', () => {
85
+ const id = prefixedId('tkt');
86
+ expect(id).toMatch(/^tkt_[0-9a-z]+$/);
87
+ });
88
+ it('uses underscore as separator', () => {
89
+ const id = prefixedId('usr');
90
+ const parts = id.split('_');
91
+ expect(parts).toHaveLength(2);
92
+ expect(parts[0]).toBe('usr');
93
+ });
94
+ it('preserves prefix exactly', () => {
95
+ const prefixes = ['tkt', 'run', 'step', 'ABC', '123'];
96
+ for (const prefix of prefixes) {
97
+ const id = prefixedId(prefix);
98
+ expect(id.startsWith(`${prefix}_`)).toBe(true);
99
+ }
100
+ });
101
+ });
102
+ describe('default size', () => {
103
+ it('uses default size of 12 for random part', () => {
104
+ const id = prefixedId('tkt');
105
+ const randomPart = id.split('_')[1];
106
+ expect(randomPart).toHaveLength(12);
107
+ });
108
+ });
109
+ describe('custom size', () => {
110
+ it('respects custom size parameter', () => {
111
+ const id = prefixedId('tkt', 8);
112
+ const randomPart = id.split('_')[1];
113
+ expect(randomPart).toHaveLength(8);
114
+ });
115
+ it('handles size=0', () => {
116
+ const id = prefixedId('tkt', 0);
117
+ expect(id).toBe('tkt_');
118
+ });
119
+ it('handles size=1', () => {
120
+ const id = prefixedId('tkt', 1);
121
+ const randomPart = id.split('_')[1];
122
+ expect(randomPart).toHaveLength(1);
123
+ expect(ALPHABET).toContain(randomPart);
124
+ });
125
+ it('handles large sizes', () => {
126
+ const id = prefixedId('tkt', 100);
127
+ const randomPart = id.split('_')[1];
128
+ expect(randomPart).toHaveLength(100);
129
+ });
130
+ });
131
+ describe('uniqueness', () => {
132
+ it('generates unique IDs with same prefix', () => {
133
+ const ids = new Set();
134
+ const count = 100;
135
+ for (let i = 0; i < count; i++) {
136
+ ids.add(prefixedId('tkt'));
137
+ }
138
+ expect(ids.size).toBe(count);
139
+ });
140
+ });
141
+ describe('character set', () => {
142
+ it('random part only uses characters from ALPHABET', () => {
143
+ for (let i = 0; i < 50; i++) {
144
+ const id = prefixedId('test', 20);
145
+ const randomPart = id.split('_')[1];
146
+ for (const char of randomPart) {
147
+ expect(ALPHABET).toContain(char);
148
+ }
149
+ }
150
+ });
151
+ });
152
+ describe('edge cases', () => {
153
+ it('handles empty prefix', () => {
154
+ const id = prefixedId('');
155
+ expect(id).toMatch(/^_[0-9a-z]+$/);
156
+ });
157
+ it('handles prefix with special characters', () => {
158
+ const id = prefixedId('test-prefix');
159
+ expect(id.startsWith('test-prefix_')).toBe(true);
160
+ });
161
+ it('handles prefix with underscore', () => {
162
+ const id = prefixedId('my_prefix');
163
+ expect(id.startsWith('my_prefix_')).toBe(true);
164
+ // Verify format still works (split produces 3 parts now)
165
+ const parts = id.split('_');
166
+ expect(parts[0]).toBe('my');
167
+ expect(parts[1]).toBe('prefix');
168
+ // Random part is the third element
169
+ expect(parts[2]).toHaveLength(12);
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=id.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.test.js","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export { nanoid, prefixedId } from './id.js';
5
+ export { parseJsonArray } from './json.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export { nanoid, prefixedId } from './id.js';
5
+ export { parseJsonArray } from './json.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * JSON parsing utilities
3
+ */
4
+ /**
5
+ * Parse a JSON string that should contain an array.
6
+ * Returns an empty array if the value is null, empty, or invalid JSON.
7
+ */
8
+ export declare function parseJsonArray(value: string | null): string[];
9
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAQ7D"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * JSON parsing utilities
3
+ */
4
+ /**
5
+ * Parse a JSON string that should contain an array.
6
+ * Returns an empty array if the value is null, empty, or invalid JSON.
7
+ */
8
+ export function parseJsonArray(value) {
9
+ if (!value)
10
+ return [];
11
+ try {
12
+ const parsed = JSON.parse(value);
13
+ return Array.isArray(parsed) ? parsed : [];
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}