@skillit/core 1.5.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/audit-formatter.d.ts +36 -0
  4. package/dist/audit-formatter.d.ts.map +1 -0
  5. package/dist/audit-formatter.js +173 -0
  6. package/dist/audit-formatter.js.map +1 -0
  7. package/dist/audit-score.d.ts +76 -0
  8. package/dist/audit-score.d.ts.map +1 -0
  9. package/dist/audit-score.js +490 -0
  10. package/dist/audit-score.js.map +1 -0
  11. package/dist/audit-types.d.ts +81 -0
  12. package/dist/audit-types.d.ts.map +1 -0
  13. package/dist/audit-types.js +2 -0
  14. package/dist/audit-types.js.map +1 -0
  15. package/dist/audit.d.ts +17 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +567 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/canonical.d.ts +36 -0
  20. package/dist/canonical.d.ts.map +1 -0
  21. package/dist/canonical.js +148 -0
  22. package/dist/canonical.js.map +1 -0
  23. package/dist/config-renderer.d.ts +16 -0
  24. package/dist/config-renderer.d.ts.map +1 -0
  25. package/dist/config-renderer.js +296 -0
  26. package/dist/config-renderer.js.map +1 -0
  27. package/dist/config-types.d.ts +144 -0
  28. package/dist/config-types.d.ts.map +1 -0
  29. package/dist/config-types.js +2 -0
  30. package/dist/config-types.js.map +1 -0
  31. package/dist/docs-scanner.d.ts +40 -0
  32. package/dist/docs-scanner.d.ts.map +1 -0
  33. package/dist/docs-scanner.js +176 -0
  34. package/dist/docs-scanner.js.map +1 -0
  35. package/dist/examples-scanner.d.ts +39 -0
  36. package/dist/examples-scanner.d.ts.map +1 -0
  37. package/dist/examples-scanner.js +221 -0
  38. package/dist/examples-scanner.js.map +1 -0
  39. package/dist/index.d.ts +40 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +31 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llms-txt.d.ts +20 -0
  44. package/dist/llms-txt.d.ts.map +1 -0
  45. package/dist/llms-txt.js +187 -0
  46. package/dist/llms-txt.js.map +1 -0
  47. package/dist/markdown-parser.d.ts +11 -0
  48. package/dist/markdown-parser.d.ts.map +1 -0
  49. package/dist/markdown-parser.js +222 -0
  50. package/dist/markdown-parser.js.map +1 -0
  51. package/dist/markdown-types.d.ts +48 -0
  52. package/dist/markdown-types.d.ts.map +1 -0
  53. package/dist/markdown-types.js +2 -0
  54. package/dist/markdown-types.js.map +1 -0
  55. package/dist/readme-parser.d.ts +21 -0
  56. package/dist/readme-parser.d.ts.map +1 -0
  57. package/dist/readme-parser.js +137 -0
  58. package/dist/readme-parser.js.map +1 -0
  59. package/dist/references-mcp.d.ts +79 -0
  60. package/dist/references-mcp.d.ts.map +1 -0
  61. package/dist/references-mcp.js +130 -0
  62. package/dist/references-mcp.js.map +1 -0
  63. package/dist/refine/ast-edit.d.ts +21 -0
  64. package/dist/refine/ast-edit.d.ts.map +1 -0
  65. package/dist/refine/ast-edit.js +147 -0
  66. package/dist/refine/ast-edit.js.map +1 -0
  67. package/dist/refine/index.d.ts +7 -0
  68. package/dist/refine/index.d.ts.map +1 -0
  69. package/dist/refine/index.js +6 -0
  70. package/dist/refine/index.js.map +1 -0
  71. package/dist/refine/jsdoc-edit.d.ts +4 -0
  72. package/dist/refine/jsdoc-edit.d.ts.map +1 -0
  73. package/dist/refine/jsdoc-edit.js +6 -0
  74. package/dist/refine/jsdoc-edit.js.map +1 -0
  75. package/dist/refine/loop.d.ts +8 -0
  76. package/dist/refine/loop.d.ts.map +1 -0
  77. package/dist/refine/loop.js +98 -0
  78. package/dist/refine/loop.js.map +1 -0
  79. package/dist/refine/select-targets.d.ts +5 -0
  80. package/dist/refine/select-targets.d.ts.map +1 -0
  81. package/dist/refine/select-targets.js +30 -0
  82. package/dist/refine/select-targets.js.map +1 -0
  83. package/dist/refine/types.d.ts +67 -0
  84. package/dist/refine/types.d.ts.map +1 -0
  85. package/dist/refine/types.js +2 -0
  86. package/dist/refine/types.js.map +1 -0
  87. package/dist/renderer.d.ts +27 -0
  88. package/dist/renderer.d.ts.map +1 -0
  89. package/dist/renderer.js +1244 -0
  90. package/dist/renderer.js.map +1 -0
  91. package/dist/tokens.d.ts +14 -0
  92. package/dist/tokens.d.ts.map +1 -0
  93. package/dist/tokens.js +26 -0
  94. package/dist/tokens.js.map +1 -0
  95. package/dist/types.d.ts +519 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/writer.d.ts +17 -0
  100. package/dist/writer.d.ts.map +1 -0
  101. package/dist/writer.js +313 -0
  102. package/dist/writer.js.map +1 -0
  103. package/package.json +54 -0
@@ -0,0 +1,490 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Dimension maxima
3
+ // ---------------------------------------------------------------------------
4
+ const MAX_D1 = 20;
5
+ const MAX_D2 = 15;
6
+ const MAX_D3 = 15;
7
+ const MAX_D4 = 15;
8
+ const MAX_D5 = 15;
9
+ const MAX_D6 = 15;
10
+ const MAX_D7 = 10;
11
+ const MAX_D8 = 15;
12
+ const MAX_TOTAL = MAX_D1 + MAX_D2 + MAX_D3 + MAX_D4 + MAX_D5 + MAX_D6 + MAX_D7 + MAX_D8; // 120
13
+ // ---------------------------------------------------------------------------
14
+ // Helpers
15
+ // ---------------------------------------------------------------------------
16
+ function passes(audit, code) {
17
+ return audit.passing.some((p) => p.code === code);
18
+ }
19
+ function hasFatalCode(audit, code) {
20
+ return audit.issues.some((i) => i.code === code && i.severity === 'fatal');
21
+ }
22
+ function clamp(value, max) {
23
+ return Math.min(Math.max(0, value), max);
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // Core estimator
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Estimate the 8-dimension skill-judge score from an {@link AuditResult}.
30
+ *
31
+ * Each dimension starts at a baseline and adds/deducts based on which audit
32
+ * checks pass or fail. Dimensions are capped at their respective maxima.
33
+ *
34
+ * @param audit - The completed audit result to score
35
+ * @param skill - Optional extracted skill; when provided, improvements include specific file/export targets
36
+ * @returns A {@link SkillJudgeEstimate} with dimension breakdown, total, grade, and improvements
37
+ *
38
+ * @category Audit
39
+ * @useWhen
40
+ * - You want a quick human-readable quality rating after running an audit
41
+ * - Building dashboards that track skill quality over time
42
+ * @avoidWhen
43
+ * - Using as a hard CI gate — prefer explicit audit codes (F1, E4, etc.) for gating
44
+ */
45
+ export function estimateSkillJudgeScore(audit, skill) {
46
+ // --- D1: Knowledge Delta /20 ---
47
+ let d1 = 14;
48
+ if (passes(audit, 'W10'))
49
+ d1 += 3; // @remarks on complex functions
50
+ if (passes(audit, 'W1'))
51
+ d1 += 3; // @packageDocumentation >50 chars
52
+ if (hasFatalCode(audit, 'F4'))
53
+ d1 -= 5; // missing JSDoc on exports
54
+ d1 = clamp(d1, MAX_D1);
55
+ // --- D2: Procedures /15 ---
56
+ let d2 = 5;
57
+ if (passes(audit, 'W7'))
58
+ d2 += 5; // @useWhen
59
+ if (passes(audit, 'W8'))
60
+ d2 += 3; // @avoidWhen
61
+ if (passes(audit, 'E4'))
62
+ d2 += 2; // @example
63
+ d2 = clamp(d2, MAX_D2);
64
+ // --- D3: Anti-Patterns /15 ---
65
+ let d3 = 2;
66
+ if (passes(audit, 'W9'))
67
+ d3 += 8; // @never
68
+ if (passes(audit, 'W3'))
69
+ d3 += 3; // notable tags
70
+ if (passes(audit, 'W6'))
71
+ d3 += 2; // README troubleshooting
72
+ d3 = clamp(d3, MAX_D3);
73
+ // --- D4: Description /15 ---
74
+ let d4 = 5;
75
+ if (passes(audit, 'F1'))
76
+ d4 += 4; // package.json description
77
+ if (passes(audit, 'F3'))
78
+ d4 += 3; // README description
79
+ if (passes(audit, 'F2'))
80
+ d4 += 2; // keywords
81
+ if (passes(audit, 'E5'))
82
+ d4 += 1; // repository URL
83
+ d4 = clamp(d4, MAX_D4);
84
+ // --- D5: Progressive Disclosure /15 ---
85
+ let d5 = 10;
86
+ if (passes(audit, 'W11'))
87
+ d5 += 3; // @category
88
+ if (passes(audit, 'W5'))
89
+ d5 += 2; // README Features
90
+ d5 = clamp(d5, MAX_D5);
91
+ // --- D6: Freedom /15 ---
92
+ let d6 = 12;
93
+ if (passes(audit, 'W8'))
94
+ d6 += 3; // @avoidWhen
95
+ d6 = clamp(d6, MAX_D6);
96
+ // --- D7: Pattern /10 ---
97
+ let d7 = 5;
98
+ if (passes(audit, 'W11'))
99
+ d7 += 3; // @category
100
+ if (passes(audit, 'W7'))
101
+ d7 += 2; // @useWhen
102
+ d7 = clamp(d7, MAX_D7);
103
+ // --- D8: Usability /15 ---
104
+ let d8 = 5;
105
+ if (passes(audit, 'E1'))
106
+ d8 += 3; // @param
107
+ if (passes(audit, 'E2'))
108
+ d8 += 3; // @returns
109
+ if (passes(audit, 'E3'))
110
+ d8 += 2; // property JSDoc
111
+ if (passes(audit, 'E4'))
112
+ d8 += 2; // @example
113
+ d8 = clamp(d8, MAX_D8);
114
+ const total = d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8;
115
+ const percentage = Math.round((total / MAX_TOTAL) * 1000) / 10;
116
+ const grade = percentageToGrade(percentage);
117
+ const improvements = buildImprovements(audit, {
118
+ d1,
119
+ d2,
120
+ d3,
121
+ d4,
122
+ d5,
123
+ d6,
124
+ d7,
125
+ d8
126
+ }, skill);
127
+ return {
128
+ dimensions: {
129
+ d1_knowledgeDelta: d1,
130
+ d2_procedures: d2,
131
+ d3_antiPatterns: d3,
132
+ d4_description: d4,
133
+ d5_progressiveDisclosure: d5,
134
+ d6_freedom: d6,
135
+ d7_pattern: d7,
136
+ d8_usability: d8
137
+ },
138
+ total,
139
+ percentage,
140
+ grade,
141
+ improvements
142
+ };
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // Grade calculation
146
+ // ---------------------------------------------------------------------------
147
+ function percentageToGrade(pct) {
148
+ if (pct >= 90)
149
+ return 'A';
150
+ if (pct >= 80)
151
+ return 'B';
152
+ if (pct >= 70)
153
+ return 'C';
154
+ if (pct >= 60)
155
+ return 'D';
156
+ return 'F';
157
+ }
158
+ function fileForModule(sourceModule) {
159
+ if (!sourceModule)
160
+ return 'src/';
161
+ return `src/${sourceModule}`;
162
+ }
163
+ /** Depth in source tree — fewer segments = higher priority (top-level exports first). */
164
+ function sourceDepth(sourceModule) {
165
+ if (!sourceModule)
166
+ return 0; // no source info = treat as top-level
167
+ return sourceModule.split('/').length;
168
+ }
169
+ /** Classes and functions missing a given tag, sorted by source tree depth (top-level first). */
170
+ function targetsForMissingTag(skill, tag, maxClasses = 5, maxFunctions = 3) {
171
+ const classTargets = skill.classes
172
+ .filter((c) => !c.tags[tag])
173
+ .sort((a, b) => sourceDepth(a.sourceModule) - sourceDepth(b.sourceModule))
174
+ .slice(0, maxClasses)
175
+ .map((c) => ({ file: fileForModule(c.sourceModule), name: c.name, kind: 'class' }));
176
+ const fnTargets = skill.functions
177
+ .filter((f) => !f.tags[tag])
178
+ .sort((a, b) => sourceDepth(a.sourceModule) - sourceDepth(b.sourceModule))
179
+ .slice(0, maxFunctions)
180
+ .map((f) => ({ file: fileForModule(f.sourceModule), name: f.name, kind: 'function' }));
181
+ // CLI command surfaces also carry useWhen / avoidWhen / pitfalls.
182
+ // Only emit targets for the tags that ExtractedConfigSurface actually holds.
183
+ const CLI_SURFACE_TAGS = new Set(['useWhen', 'avoidWhen', 'pitfalls']);
184
+ const cliTargets = CLI_SURFACE_TAGS.has(tag)
185
+ ? (skill.configSurfaces ?? [])
186
+ // Empty array = no content = a gap, so treat it the same as a missing tag.
187
+ .filter((s) => s.sourceType === 'cli' && !s[tag]?.length)
188
+ .slice(0, maxFunctions)
189
+ .map((s) => ({ file: '', name: s.name, kind: 'command' }))
190
+ : [];
191
+ return [...classTargets, ...fnTargets, ...cliTargets];
192
+ }
193
+ /** Functions with 3+ parameters missing @remarks, sorted by source tree depth. */
194
+ function targetsForRemarks(skill) {
195
+ return skill.functions
196
+ .filter((f) => f.parameters.length >= 3 && !f.tags['remarks'])
197
+ .sort((a, b) => sourceDepth(a.sourceModule) - sourceDepth(b.sourceModule))
198
+ .slice(0, 5)
199
+ .map((f) => ({
200
+ file: fileForModule(f.sourceModule),
201
+ name: f.name,
202
+ kind: `function, ${f.parameters.length} params`
203
+ }));
204
+ }
205
+ /**
206
+ * For each dimension below 80% of its max, suggest the audit fix that would
207
+ * help most. Return the top 3 by potential point gain.
208
+ */
209
+ function buildImprovements(audit, dims, skill) {
210
+ const suggestions = [];
211
+ // D1: highest single-fix gain is W10 (+3) or W1 (+3)
212
+ if (dims.d1 < MAX_D1 * 0.8) {
213
+ if (!passes(audit, 'W10')) {
214
+ const targets = skill ? targetsForRemarks(skill) : undefined;
215
+ suggestions.push({
216
+ gain: 3,
217
+ imp: {
218
+ suggestion: 'Add @remarks to complex functions (3+ params) (+3 on D1)',
219
+ points: 3,
220
+ dimension: 'D1',
221
+ targets: targets && targets.length > 0 ? targets : undefined
222
+ }
223
+ });
224
+ }
225
+ if (!passes(audit, 'W1')) {
226
+ suggestions.push({
227
+ gain: 3,
228
+ imp: {
229
+ suggestion: 'Add detailed @packageDocumentation description >50 chars (+3 on D1)',
230
+ points: 3,
231
+ dimension: 'D1'
232
+ }
233
+ });
234
+ }
235
+ }
236
+ // D2: highest gain is W7 (+5)
237
+ if (dims.d2 < MAX_D2 * 0.8) {
238
+ if (!passes(audit, 'W7')) {
239
+ const targets = skill ? targetsForMissingTag(skill, 'useWhen') : undefined;
240
+ suggestions.push({
241
+ gain: 5,
242
+ imp: {
243
+ suggestion: 'Add @useWhen to key exports (+5 on D2)',
244
+ points: 5,
245
+ dimension: 'D2',
246
+ targets: targets && targets.length > 0 ? targets : undefined
247
+ }
248
+ });
249
+ }
250
+ if (!passes(audit, 'W8')) {
251
+ const targets = skill ? targetsForMissingTag(skill, 'avoidWhen') : undefined;
252
+ suggestions.push({
253
+ gain: 3,
254
+ imp: {
255
+ suggestion: 'Add @avoidWhen to key exports (+3 on D2)',
256
+ points: 3,
257
+ dimension: 'D2',
258
+ targets: targets && targets.length > 0 ? targets : undefined
259
+ }
260
+ });
261
+ }
262
+ if (!passes(audit, 'E4')) {
263
+ suggestions.push({
264
+ gain: 2,
265
+ imp: {
266
+ suggestion: 'Add @example code blocks (+2 on D2)',
267
+ points: 2,
268
+ dimension: 'D2'
269
+ }
270
+ });
271
+ }
272
+ }
273
+ // D3: highest gain is W9 (+8)
274
+ if (dims.d3 < MAX_D3 * 0.8) {
275
+ if (!passes(audit, 'W9')) {
276
+ const targets = skill ? targetsForMissingTag(skill, 'pitfalls') : undefined;
277
+ suggestions.push({
278
+ gain: 8,
279
+ imp: {
280
+ suggestion: 'Add @pitfalls (never-do) annotation to key exports (+8 on D3)',
281
+ points: 8,
282
+ dimension: 'D3',
283
+ targets: targets && targets.length > 0 ? targets : undefined
284
+ }
285
+ });
286
+ }
287
+ if (!passes(audit, 'W3')) {
288
+ suggestions.push({
289
+ gain: 3,
290
+ imp: {
291
+ suggestion: 'Add @deprecated/@since/@throws/@see tags (+3 on D3)',
292
+ points: 3,
293
+ dimension: 'D3'
294
+ }
295
+ });
296
+ }
297
+ if (!passes(audit, 'W6')) {
298
+ suggestions.push({
299
+ gain: 2,
300
+ imp: {
301
+ suggestion: 'Add README Troubleshooting section (+2 on D3)',
302
+ points: 2,
303
+ dimension: 'D3'
304
+ }
305
+ });
306
+ }
307
+ }
308
+ // D4: highest gain is F1 (+4)
309
+ if (dims.d4 < MAX_D4 * 0.8) {
310
+ if (!passes(audit, 'F1')) {
311
+ suggestions.push({
312
+ gain: 4,
313
+ imp: {
314
+ suggestion: 'Add meaningful package.json description (+4 on D4)',
315
+ points: 4,
316
+ dimension: 'D4'
317
+ }
318
+ });
319
+ }
320
+ if (!passes(audit, 'F3')) {
321
+ suggestions.push({
322
+ gain: 3,
323
+ imp: {
324
+ suggestion: 'Add README description/blockquote (+3 on D4)',
325
+ points: 3,
326
+ dimension: 'D4'
327
+ }
328
+ });
329
+ }
330
+ if (!passes(audit, 'F2')) {
331
+ suggestions.push({
332
+ gain: 2,
333
+ imp: {
334
+ suggestion: 'Add 5+ domain-specific keywords (+2 on D4)',
335
+ points: 2,
336
+ dimension: 'D4'
337
+ }
338
+ });
339
+ }
340
+ if (!passes(audit, 'E5')) {
341
+ suggestions.push({
342
+ gain: 1,
343
+ imp: {
344
+ suggestion: 'Add repository URL to package.json (+1 on D4)',
345
+ points: 1,
346
+ dimension: 'D4'
347
+ }
348
+ });
349
+ }
350
+ }
351
+ // D5: highest gain is W11 (+3)
352
+ if (dims.d5 < MAX_D5 * 0.8) {
353
+ if (!passes(audit, 'W11')) {
354
+ suggestions.push({
355
+ gain: 3,
356
+ imp: {
357
+ suggestion: 'Add @category for grouping (+3 on D5, +3 on D7)',
358
+ points: 3,
359
+ dimension: 'D5'
360
+ }
361
+ });
362
+ }
363
+ if (!passes(audit, 'W5')) {
364
+ suggestions.push({
365
+ gain: 2,
366
+ imp: {
367
+ suggestion: 'Add README Features section (+2 on D5)',
368
+ points: 2,
369
+ dimension: 'D5'
370
+ }
371
+ });
372
+ }
373
+ }
374
+ // D6: only W8 (+3) — but D6 base is 12 so below 80% (12) rarely triggers unless W8 missing
375
+ if (dims.d6 < MAX_D6 * 0.8) {
376
+ if (!passes(audit, 'W8')) {
377
+ const targets = skill ? targetsForMissingTag(skill, 'avoidWhen') : undefined;
378
+ suggestions.push({
379
+ gain: 3,
380
+ imp: {
381
+ suggestion: 'Add @avoidWhen to key exports (+3 on D6)',
382
+ points: 3,
383
+ dimension: 'D6',
384
+ targets: targets && targets.length > 0 ? targets : undefined
385
+ }
386
+ });
387
+ }
388
+ }
389
+ // D7: W11 (+3), W7 (+2)
390
+ if (dims.d7 < MAX_D7 * 0.8) {
391
+ if (!passes(audit, 'W11')) {
392
+ // Avoid duplicate if already added from D5
393
+ const alreadySuggested = suggestions.some((s) => s.imp.suggestion.includes('@category for grouping'));
394
+ if (!alreadySuggested) {
395
+ suggestions.push({
396
+ gain: 3,
397
+ imp: {
398
+ suggestion: 'Add @category for grouping (+3 on D5, +3 on D7)',
399
+ points: 3,
400
+ dimension: 'D7'
401
+ }
402
+ });
403
+ }
404
+ }
405
+ if (!passes(audit, 'W7')) {
406
+ const alreadySuggested = suggestions.some((s) => s.imp.suggestion.includes('@useWhen to key exports'));
407
+ if (!alreadySuggested) {
408
+ const targets = skill ? targetsForMissingTag(skill, 'useWhen') : undefined;
409
+ suggestions.push({
410
+ gain: 2,
411
+ imp: {
412
+ suggestion: 'Add @useWhen to key exports (+2 on D7)',
413
+ points: 2,
414
+ dimension: 'D7',
415
+ targets: targets && targets.length > 0 ? targets : undefined
416
+ }
417
+ });
418
+ }
419
+ }
420
+ }
421
+ // D8: E1 (+3), E2 (+3), E3 (+2), E4 (+2)
422
+ if (dims.d8 < MAX_D8 * 0.8) {
423
+ if (!passes(audit, 'E1')) {
424
+ // Use audit issues to find specific symbols missing @param
425
+ const targets = audit.issues
426
+ .filter((i) => i.code === 'E1')
427
+ .slice(0, 5)
428
+ .map((i) => ({ file: i.file, name: i.symbol ?? '(unknown)', kind: 'function' }));
429
+ suggestions.push({
430
+ gain: 3,
431
+ imp: {
432
+ suggestion: 'Add @param descriptions to all parameters (+3 on D8)',
433
+ points: 3,
434
+ dimension: 'D8',
435
+ targets: targets.length > 0 ? targets : undefined
436
+ }
437
+ });
438
+ }
439
+ if (!passes(audit, 'E2')) {
440
+ const targets = audit.issues
441
+ .filter((i) => i.code === 'E2')
442
+ .slice(0, 5)
443
+ .map((i) => ({ file: i.file, name: i.symbol ?? '(unknown)', kind: 'function' }));
444
+ suggestions.push({
445
+ gain: 3,
446
+ imp: {
447
+ suggestion: 'Add @returns descriptions to non-void functions (+3 on D8)',
448
+ points: 3,
449
+ dimension: 'D8',
450
+ targets: targets.length > 0 ? targets : undefined
451
+ }
452
+ });
453
+ }
454
+ if (!passes(audit, 'E3')) {
455
+ suggestions.push({
456
+ gain: 2,
457
+ imp: {
458
+ suggestion: 'Add JSDoc to all interface/type properties (+2 on D8)',
459
+ points: 2,
460
+ dimension: 'D8'
461
+ }
462
+ });
463
+ }
464
+ if (!passes(audit, 'E4')) {
465
+ const alreadySuggested = suggestions.some((s) => s.imp.suggestion.includes('@example code blocks'));
466
+ if (!alreadySuggested) {
467
+ suggestions.push({
468
+ gain: 2,
469
+ imp: {
470
+ suggestion: 'Add @example code blocks (+2 on D8)',
471
+ points: 2,
472
+ dimension: 'D8'
473
+ }
474
+ });
475
+ }
476
+ }
477
+ }
478
+ // Sort by gain desc, deduplicate by suggestion text, take top 3
479
+ suggestions.sort((a, b) => b.gain - a.gain);
480
+ const seen = new Set();
481
+ const top = [];
482
+ for (const s of suggestions) {
483
+ if (!seen.has(s.imp.suggestion) && top.length < 3) {
484
+ seen.add(s.imp.suggestion);
485
+ top.push(s.imp);
486
+ }
487
+ }
488
+ return top;
489
+ }
490
+ //# sourceMappingURL=audit-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-score.js","sourceRoot":"","sources":["../src/audit-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Severity levels for audit issues, ordered from most to least severe.
3
+ * - `fatal`: Disqualifying problems that prevent the skill from being used safely
4
+ * - `error`: Serious problems that significantly degrade skill quality
5
+ * - `warning`: Moderate problems that reduce skill effectiveness
6
+ * - `alert`: Minor issues or suggestions for improvement
7
+ */
8
+ export type AuditSeverity = 'fatal' | 'error' | 'warning' | 'alert';
9
+ /**
10
+ * A single audit finding that identifies a problem in the skill package.
11
+ */
12
+ export interface AuditIssue {
13
+ /** Severity level of this issue */
14
+ severity: AuditSeverity;
15
+ /** Short rule code, e.g. "F1", "E2", "W3", "A1" */
16
+ code: string;
17
+ /** Relative path to the file containing the issue */
18
+ file: string;
19
+ /** Line number within the file, or null if not applicable */
20
+ line: number | null;
21
+ /** Name of the function, class, or property related to the issue */
22
+ symbol: string;
23
+ /** Human-readable description of the problem */
24
+ message: string;
25
+ /** Actionable suggestion for how to fix the issue */
26
+ suggestion: string;
27
+ }
28
+ /**
29
+ * A check that the audit engine ran and the skill package passed.
30
+ */
31
+ export interface AuditPass {
32
+ /** Short rule code corresponding to the passed check */
33
+ code: string;
34
+ /** Human-readable description of what was checked */
35
+ message: string;
36
+ /** Optional additional detail about the passing result */
37
+ detail?: string;
38
+ }
39
+ /**
40
+ * Contextual metadata about the package being audited, used to evaluate
41
+ * relevance and quality of skill content.
42
+ */
43
+ export interface AuditContext {
44
+ /** Description field from package.json */
45
+ packageDescription?: string;
46
+ /** Keywords from package.json */
47
+ keywords?: string[];
48
+ /** Repository URL from package.json */
49
+ repository?: string;
50
+ /** Parsed sections of the package README */
51
+ readme?: ParsedReadme;
52
+ }
53
+ /**
54
+ * Structured representation of key sections extracted from a package README.
55
+ */
56
+ export interface ParsedReadme {
57
+ /** Leading blockquote, often used as a one-liner summary */
58
+ blockquote?: string;
59
+ /** First prose paragraph after any heading or blockquote */
60
+ firstParagraph?: string;
61
+ /** Quick-start or getting-started section content */
62
+ quickStart?: string;
63
+ /** Features or capabilities section content */
64
+ features?: string;
65
+ /** Troubleshooting, common issues, or FAQ section content */
66
+ troubleshooting?: string;
67
+ }
68
+ /**
69
+ * The complete output of an audit run against a single skill package.
70
+ */
71
+ export interface AuditResult {
72
+ /** Package name being audited */
73
+ package: string;
74
+ /** Count of issues found at each severity level */
75
+ summary: Record<AuditSeverity, number>;
76
+ /** All issues found during the audit */
77
+ issues: AuditIssue[];
78
+ /** All checks that the package passed */
79
+ passing: AuditPass[];
80
+ }
81
+ //# sourceMappingURL=audit-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-types.d.ts","sourceRoot":"","sources":["../src/audit-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,CAAC;IACxB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACvC,wCAAwC;IACxC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,yCAAyC;IACzC,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audit-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-types.js","sourceRoot":"","sources":["../src/audit-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { ExtractedSkill } from './types.js';
2
+ import type { AuditContext, AuditResult } from './audit-types.js';
3
+ /**
4
+ * Run the documentation audit on a single extracted skill.
5
+ *
6
+ * Executes 20+ checks across fatal/error/warning/alert severity levels and returns
7
+ * a structured result with issues, passing checks, and summary counts.
8
+ *
9
+ * @category Audit
10
+ * @useWhen
11
+ * - You want programmatic quality feedback on JSDoc coverage before publishing skills
12
+ * - Building a CI gate that blocks PRs with undocumented exports
13
+ * @avoidWhen
14
+ * - Rapid local iteration where audit noise slows you down — use the skillsAudit: false option instead
15
+ */
16
+ export declare function auditSkill(skill: ExtractedSkill, context: AuditContext): AuditResult;
17
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EACV,YAAY,EAGZ,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAg7B1B;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAwCpF"}