@pseolint/core 0.1.0 → 0.2.1

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 (116) hide show
  1. package/dist/ai/adapters/index.d.ts +53 -0
  2. package/dist/ai/adapters/index.d.ts.map +1 -0
  3. package/dist/ai/adapters/index.js +158 -0
  4. package/dist/ai/adapters/index.js.map +1 -0
  5. package/dist/ai/cache.d.ts +11 -0
  6. package/dist/ai/cache.d.ts.map +1 -0
  7. package/dist/ai/cache.js +40 -0
  8. package/dist/ai/cache.js.map +1 -0
  9. package/dist/ai/cost.d.ts +3 -0
  10. package/dist/ai/cost.d.ts.map +1 -0
  11. package/dist/ai/cost.js +22 -0
  12. package/dist/ai/cost.js.map +1 -0
  13. package/dist/ai/feedback-prompt.d.ts +22 -0
  14. package/dist/ai/feedback-prompt.d.ts.map +1 -0
  15. package/dist/ai/feedback-prompt.js +39 -0
  16. package/dist/ai/feedback-prompt.js.map +1 -0
  17. package/dist/ai/prompt.d.ts +10 -0
  18. package/dist/ai/prompt.d.ts.map +1 -0
  19. package/dist/ai/prompt.js +51 -0
  20. package/dist/ai/prompt.js.map +1 -0
  21. package/dist/ai/triage.d.ts +28 -0
  22. package/dist/ai/triage.d.ts.map +1 -0
  23. package/dist/ai/triage.js +136 -0
  24. package/dist/ai/triage.js.map +1 -0
  25. package/dist/ai/types.d.ts +27 -0
  26. package/dist/ai/types.d.ts.map +1 -0
  27. package/dist/ai/types.js +2 -0
  28. package/dist/ai/types.js.map +1 -0
  29. package/dist/auditor.d.ts.map +1 -1
  30. package/dist/auditor.js +399 -83
  31. package/dist/auditor.js.map +1 -1
  32. package/dist/cache.d.ts +44 -0
  33. package/dist/cache.d.ts.map +1 -0
  34. package/dist/cache.js +182 -0
  35. package/dist/cache.js.map +1 -0
  36. package/dist/data-source-loader.d.ts +14 -0
  37. package/dist/data-source-loader.d.ts.map +1 -0
  38. package/dist/data-source-loader.js +76 -0
  39. package/dist/data-source-loader.js.map +1 -0
  40. package/dist/enrich-findings.d.ts.map +1 -1
  41. package/dist/enrich-findings.js +4 -0
  42. package/dist/enrich-findings.js.map +1 -1
  43. package/dist/formatters/console.d.ts.map +1 -1
  44. package/dist/formatters/console.js +30 -0
  45. package/dist/formatters/console.js.map +1 -1
  46. package/dist/formatters/html.d.ts.map +1 -1
  47. package/dist/formatters/html.js +92 -70
  48. package/dist/formatters/html.js.map +1 -1
  49. package/dist/formatters/markdown.d.ts.map +1 -1
  50. package/dist/formatters/markdown.js +29 -0
  51. package/dist/formatters/markdown.js.map +1 -1
  52. package/dist/index.d.ts +20 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +11 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/rule-references.d.ts.map +1 -1
  57. package/dist/rule-references.js +3 -0
  58. package/dist/rule-references.js.map +1 -1
  59. package/dist/rules/data/data-binding.d.ts +4 -0
  60. package/dist/rules/data/data-binding.d.ts.map +1 -0
  61. package/dist/rules/data/data-binding.js +107 -0
  62. package/dist/rules/data/data-binding.js.map +1 -0
  63. package/dist/rules/tech/robots-sitemap-presence.d.ts +2 -1
  64. package/dist/rules/tech/robots-sitemap-presence.d.ts.map +1 -1
  65. package/dist/rules/tech/robots-sitemap-presence.js +101 -0
  66. package/dist/rules/tech/robots-sitemap-presence.js.map +1 -1
  67. package/dist/rules/tech/sitemap-completeness.d.ts.map +1 -1
  68. package/dist/rules/tech/sitemap-completeness.js +15 -0
  69. package/dist/rules/tech/sitemap-completeness.js.map +1 -1
  70. package/dist/state.d.ts +35 -0
  71. package/dist/state.d.ts.map +1 -0
  72. package/dist/state.js +64 -0
  73. package/dist/state.js.map +1 -0
  74. package/dist/stratified-sample.d.ts +3 -0
  75. package/dist/stratified-sample.d.ts.map +1 -0
  76. package/dist/stratified-sample.js +88 -0
  77. package/dist/stratified-sample.js.map +1 -0
  78. package/dist/telemetry/aggregator.d.ts +47 -0
  79. package/dist/telemetry/aggregator.d.ts.map +1 -0
  80. package/dist/telemetry/aggregator.js +77 -0
  81. package/dist/telemetry/aggregator.js.map +1 -0
  82. package/dist/telemetry/index.d.ts +5 -0
  83. package/dist/telemetry/index.d.ts.map +1 -0
  84. package/dist/telemetry/index.js +5 -0
  85. package/dist/telemetry/index.js.map +1 -0
  86. package/dist/telemetry/reader.d.ts +12 -0
  87. package/dist/telemetry/reader.d.ts.map +1 -0
  88. package/dist/telemetry/reader.js +35 -0
  89. package/dist/telemetry/reader.js.map +1 -0
  90. package/dist/telemetry/types.d.ts +126 -0
  91. package/dist/telemetry/types.d.ts.map +1 -0
  92. package/dist/telemetry/types.js +75 -0
  93. package/dist/telemetry/types.js.map +1 -0
  94. package/dist/telemetry/writer.d.ts +12 -0
  95. package/dist/telemetry/writer.d.ts.map +1 -0
  96. package/dist/telemetry/writer.js +38 -0
  97. package/dist/telemetry/writer.js.map +1 -0
  98. package/dist/types.d.ts +96 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +26 -6
  101. package/dist/algorithms/entity-mask.test.d.ts +0 -2
  102. package/dist/algorithms/entity-mask.test.d.ts.map +0 -1
  103. package/dist/algorithms/entity-mask.test.js +0 -23
  104. package/dist/algorithms/entity-mask.test.js.map +0 -1
  105. package/dist/algorithms/simhash.test.d.ts +0 -2
  106. package/dist/algorithms/simhash.test.d.ts.map +0 -1
  107. package/dist/algorithms/simhash.test.js +0 -23
  108. package/dist/algorithms/simhash.test.js.map +0 -1
  109. package/dist/auditor.test.d.ts +0 -2
  110. package/dist/auditor.test.d.ts.map +0 -1
  111. package/dist/auditor.test.js +0 -134
  112. package/dist/auditor.test.js.map +0 -1
  113. package/dist/parser.test.d.ts +0 -2
  114. package/dist/parser.test.d.ts.map +0 -1
  115. package/dist/parser.test.js +0 -37
  116. package/dist/parser.test.js.map +0 -1
@@ -0,0 +1,126 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Used to correlate a triage-feedback record back to the audit it belongs to.
4
+ * 16 lowercase hex chars = 64 bits of entropy.
5
+ */
6
+ export declare const runIdSchema: z.ZodString;
7
+ export declare const tokenUsageSchema: z.ZodObject<{
8
+ input: z.ZodNumber;
9
+ output: z.ZodNumber;
10
+ }, z.core.$strict>;
11
+ export declare const cacheStatsSchema: z.ZodObject<{
12
+ hits: z.ZodNumber;
13
+ total: z.ZodNumber;
14
+ bytesSavedEstimate: z.ZodNumber;
15
+ }, z.core.$strict>;
16
+ export declare const triageTelemetrySchema: z.ZodObject<{
17
+ success: z.ZodBoolean;
18
+ skipReason: z.ZodOptional<z.ZodString>;
19
+ rootCauseCount: z.ZodNumber;
20
+ providerId: z.ZodString;
21
+ modelId: z.ZodString;
22
+ cacheHit: z.ZodBoolean;
23
+ tokenUsage: z.ZodObject<{
24
+ input: z.ZodNumber;
25
+ output: z.ZodNumber;
26
+ }, z.core.$strict>;
27
+ estimatedCostUsd: z.ZodOptional<z.ZodNumber>;
28
+ truncatedInput: z.ZodBoolean;
29
+ }, z.core.$strict>;
30
+ /** Audit run record — one per audit. */
31
+ export declare const auditRecordSchema: z.ZodObject<{
32
+ type: z.ZodLiteral<"audit">;
33
+ schemaVersion: z.ZodLiteral<1>;
34
+ runId: z.ZodString;
35
+ timestamp: z.ZodString;
36
+ durationMs: z.ZodNumber;
37
+ score: z.ZodNumber;
38
+ pageCount: z.ZodNumber;
39
+ findingCount: z.ZodNumber;
40
+ rawFindingCount: z.ZodOptional<z.ZodNumber>;
41
+ templateDetected: z.ZodOptional<z.ZodBoolean>;
42
+ cacheStats: z.ZodOptional<z.ZodObject<{
43
+ hits: z.ZodNumber;
44
+ total: z.ZodNumber;
45
+ bytesSavedEstimate: z.ZodNumber;
46
+ }, z.core.$strict>>;
47
+ triage: z.ZodOptional<z.ZodObject<{
48
+ success: z.ZodBoolean;
49
+ skipReason: z.ZodOptional<z.ZodString>;
50
+ rootCauseCount: z.ZodNumber;
51
+ providerId: z.ZodString;
52
+ modelId: z.ZodString;
53
+ cacheHit: z.ZodBoolean;
54
+ tokenUsage: z.ZodObject<{
55
+ input: z.ZodNumber;
56
+ output: z.ZodNumber;
57
+ }, z.core.$strict>;
58
+ estimatedCostUsd: z.ZodOptional<z.ZodNumber>;
59
+ truncatedInput: z.ZodBoolean;
60
+ }, z.core.$strict>>;
61
+ }, z.core.$strict>;
62
+ /** Feedback record — one per triage feedback event. */
63
+ export declare const feedbackRecordSchema: z.ZodObject<{
64
+ type: z.ZodLiteral<"feedback">;
65
+ schemaVersion: z.ZodLiteral<1>;
66
+ runId: z.ZodString;
67
+ timestamp: z.ZodString;
68
+ rating: z.ZodEnum<{
69
+ helpful: "helpful";
70
+ unhelpful: "unhelpful";
71
+ skipped: "skipped";
72
+ }>;
73
+ }, z.core.$strict>;
74
+ export declare const telemetryRecordSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
75
+ type: z.ZodLiteral<"audit">;
76
+ schemaVersion: z.ZodLiteral<1>;
77
+ runId: z.ZodString;
78
+ timestamp: z.ZodString;
79
+ durationMs: z.ZodNumber;
80
+ score: z.ZodNumber;
81
+ pageCount: z.ZodNumber;
82
+ findingCount: z.ZodNumber;
83
+ rawFindingCount: z.ZodOptional<z.ZodNumber>;
84
+ templateDetected: z.ZodOptional<z.ZodBoolean>;
85
+ cacheStats: z.ZodOptional<z.ZodObject<{
86
+ hits: z.ZodNumber;
87
+ total: z.ZodNumber;
88
+ bytesSavedEstimate: z.ZodNumber;
89
+ }, z.core.$strict>>;
90
+ triage: z.ZodOptional<z.ZodObject<{
91
+ success: z.ZodBoolean;
92
+ skipReason: z.ZodOptional<z.ZodString>;
93
+ rootCauseCount: z.ZodNumber;
94
+ providerId: z.ZodString;
95
+ modelId: z.ZodString;
96
+ cacheHit: z.ZodBoolean;
97
+ tokenUsage: z.ZodObject<{
98
+ input: z.ZodNumber;
99
+ output: z.ZodNumber;
100
+ }, z.core.$strict>;
101
+ estimatedCostUsd: z.ZodOptional<z.ZodNumber>;
102
+ truncatedInput: z.ZodBoolean;
103
+ }, z.core.$strict>>;
104
+ }, z.core.$strict>, z.ZodObject<{
105
+ type: z.ZodLiteral<"feedback">;
106
+ schemaVersion: z.ZodLiteral<1>;
107
+ runId: z.ZodString;
108
+ timestamp: z.ZodString;
109
+ rating: z.ZodEnum<{
110
+ helpful: "helpful";
111
+ unhelpful: "unhelpful";
112
+ skipped: "skipped";
113
+ }>;
114
+ }, z.core.$strict>], "type">;
115
+ export type TokenUsage = z.infer<typeof tokenUsageSchema>;
116
+ export type CacheStatsRecord = z.infer<typeof cacheStatsSchema>;
117
+ export type TriageTelemetry = z.infer<typeof triageTelemetrySchema>;
118
+ export type AuditRecord = z.infer<typeof auditRecordSchema>;
119
+ export type FeedbackRecord = z.infer<typeof feedbackRecordSchema>;
120
+ export type TelemetryRecord = z.infer<typeof telemetryRecordSchema>;
121
+ /**
122
+ * Generate a 16-char lowercase hex runId. Used to correlate an audit record
123
+ * with any later feedback records for the same run.
124
+ */
125
+ export declare function generateRunId(): string;
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/telemetry/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,WAAW,aAAqC,CAAC;AAE9D,eAAO,MAAM,gBAAgB;;;kBAKlB,CAAC;AAEZ,eAAO,MAAM,gBAAgB;;;;kBAMlB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;kBAevB,CAAC;AAEZ,wCAAwC;AACxC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAenB,CAAC;AAEZ,uDAAuD;AACvD,eAAO,MAAM,oBAAoB;;;;;;;;;;kBAQtB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAGhC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,75 @@
1
+ import crypto from "node:crypto";
2
+ import { z } from "zod";
3
+ /**
4
+ * Used to correlate a triage-feedback record back to the audit it belongs to.
5
+ * 16 lowercase hex chars = 64 bits of entropy.
6
+ */
7
+ export const runIdSchema = z.string().regex(/^[0-9a-f]{16}$/);
8
+ export const tokenUsageSchema = z
9
+ .object({
10
+ input: z.number().int().nonnegative(),
11
+ output: z.number().int().nonnegative(),
12
+ })
13
+ .strict();
14
+ export const cacheStatsSchema = z
15
+ .object({
16
+ hits: z.number().int().nonnegative(),
17
+ total: z.number().int().nonnegative(),
18
+ bytesSavedEstimate: z.number().int().nonnegative(),
19
+ })
20
+ .strict();
21
+ export const triageTelemetrySchema = z
22
+ .object({
23
+ /** Whether triage actually produced a result. False when fail-open skipped. */
24
+ success: z.boolean(),
25
+ /** Populated only when success=false. Short reason (kind: message). */
26
+ skipReason: z.string().optional(),
27
+ /** 0 when success=false. */
28
+ rootCauseCount: z.number().int().nonnegative(),
29
+ providerId: z.string(),
30
+ modelId: z.string(),
31
+ cacheHit: z.boolean(),
32
+ tokenUsage: tokenUsageSchema,
33
+ estimatedCostUsd: z.number().optional(),
34
+ truncatedInput: z.boolean(),
35
+ })
36
+ .strict();
37
+ /** Audit run record — one per audit. */
38
+ export const auditRecordSchema = z
39
+ .object({
40
+ type: z.literal("audit"),
41
+ schemaVersion: z.literal(1),
42
+ runId: runIdSchema,
43
+ timestamp: z.string(), // ISO 8601
44
+ durationMs: z.number().int().nonnegative(),
45
+ score: z.number(),
46
+ pageCount: z.number().int().nonnegative(),
47
+ findingCount: z.number().int().nonnegative(),
48
+ rawFindingCount: z.number().int().nonnegative().optional(),
49
+ templateDetected: z.boolean().optional(),
50
+ cacheStats: cacheStatsSchema.optional(),
51
+ triage: triageTelemetrySchema.optional(),
52
+ })
53
+ .strict();
54
+ /** Feedback record — one per triage feedback event. */
55
+ export const feedbackRecordSchema = z
56
+ .object({
57
+ type: z.literal("feedback"),
58
+ schemaVersion: z.literal(1),
59
+ runId: runIdSchema,
60
+ timestamp: z.string(),
61
+ rating: z.enum(["helpful", "unhelpful", "skipped"]),
62
+ })
63
+ .strict();
64
+ export const telemetryRecordSchema = z.discriminatedUnion("type", [
65
+ auditRecordSchema,
66
+ feedbackRecordSchema,
67
+ ]);
68
+ /**
69
+ * Generate a 16-char lowercase hex runId. Used to correlate an audit record
70
+ * with any later feedback records for the same run.
71
+ */
72
+ export function generateRunId() {
73
+ return crypto.randomBytes(8).toString("hex");
74
+ }
75
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/telemetry/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type TelemetryRecord } from "./types.js";
2
+ /**
3
+ * Append a single telemetry record as one JSON line.
4
+ *
5
+ * Telemetry MUST NEVER throw to the caller — an audit must not fail because a
6
+ * log line could not be written. We swallow both I/O errors (expected, e.g.
7
+ * read-only filesystem, path clash) and schema errors (a programmer bug where
8
+ * an internal caller passed the wrong shape). Schema bugs log a single warning
9
+ * to stderr so they remain discoverable.
10
+ */
11
+ export declare function appendTelemetryRecord(path: string, record: TelemetryRecord): Promise<void>;
12
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/telemetry/writer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,38 @@
1
+ import { appendFile, mkdir } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { telemetryRecordSchema } from "./types.js";
4
+ /**
5
+ * Append a single telemetry record as one JSON line.
6
+ *
7
+ * Telemetry MUST NEVER throw to the caller — an audit must not fail because a
8
+ * log line could not be written. We swallow both I/O errors (expected, e.g.
9
+ * read-only filesystem, path clash) and schema errors (a programmer bug where
10
+ * an internal caller passed the wrong shape). Schema bugs log a single warning
11
+ * to stderr so they remain discoverable.
12
+ */
13
+ export async function appendTelemetryRecord(path, record) {
14
+ let serialized;
15
+ try {
16
+ const parsed = telemetryRecordSchema.parse(record);
17
+ serialized = JSON.stringify(parsed) + "\n";
18
+ }
19
+ catch (err) {
20
+ // Programmer bug: invalid record shape. Warn once and bail — don't throw.
21
+ try {
22
+ // eslint-disable-next-line no-console
23
+ console.warn("[telemetry] refusing to write invalid record:", err instanceof Error ? err.message : String(err));
24
+ }
25
+ catch {
26
+ // stderr itself failed — nothing we can do.
27
+ }
28
+ return;
29
+ }
30
+ try {
31
+ await mkdir(dirname(path), { recursive: true });
32
+ await appendFile(path, serialized, "utf8");
33
+ }
34
+ catch {
35
+ // Silent failure — telemetry MUST NOT block an audit.
36
+ }
37
+ }
38
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/telemetry/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,YAAY,CAAC;AAEzE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,MAAuB;IAEvB,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnD,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,IAAI,CAAC;YACH,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,+CAA+C,EAC/C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -59,6 +59,61 @@ export interface CategoryScores {
59
59
  schema: number;
60
60
  cannibal: number;
61
61
  }
62
+ /** Options for HTTP caching during audits. */
63
+ export interface CacheOptions {
64
+ /** Directory to store cache files. Default: `.pseolint/cache/`. */
65
+ dir?: string;
66
+ /** TTL for entries without ETag/Last-Modified validators. Default: 7 days. */
67
+ ttlMs?: number;
68
+ }
69
+ /** Cache stats reported at end of audit. */
70
+ export interface CacheStats {
71
+ hits: number;
72
+ total: number;
73
+ bytesSavedEstimate: number;
74
+ }
75
+ /** Options for run state persistence. */
76
+ export interface StateOptions {
77
+ /** Path to state file. Default: `.pseolint/state.json`. */
78
+ path?: string;
79
+ /** If true, audit only URLs with changed/new contentHash since prior state. */
80
+ since?: boolean;
81
+ /** If true, exit non-zero when a new rule ID fires on any URL vs prior state. */
82
+ exitOnRegression?: boolean;
83
+ }
84
+ /** Options for local-only telemetry JSONL output. */
85
+ export interface TelemetryOptions {
86
+ /** Enable telemetry write at end of audit. Default: false. */
87
+ enabled?: boolean;
88
+ /** Path to JSONL file. Default: `.pseolint/telemetry.jsonl`. */
89
+ path?: string;
90
+ /** Show y/n/skip feedback prompt after triage on TTY. Default: true (when telemetry enabled). */
91
+ prompt?: boolean;
92
+ /** Non-interactive feedback rating — bypasses the prompt (useful in CI). */
93
+ feedback?: "helpful" | "unhelpful";
94
+ }
95
+ /** Options for AI triage post-processing. */
96
+ export interface AiOptions {
97
+ enabled?: boolean;
98
+ /** Provider id, e.g. "anthropic" | "openai" | "google" | "ollama". Any string resolved against the adapter registry. */
99
+ provider?: string;
100
+ model?: string;
101
+ /** Only meaningful for Ollama. Ignored by cloud providers. */
102
+ endpoint?: string;
103
+ apiKey?: string;
104
+ maxInputTokens?: number;
105
+ maxOutputTokens?: number;
106
+ /** Max estimated USD cost per triage call. Call is refused pre-flight if exceeded. When undefined, no cap. */
107
+ maxCostUsd?: number;
108
+ /** Max estimated USD spent on successful triages per UTC day (read from telemetry). Requires telemetry.enabled. */
109
+ dailyBudgetUsd?: number;
110
+ /** Print one-line discovery hint when an AI key is detected but --ai is not set. Default: true. */
111
+ suggest?: boolean;
112
+ cache?: {
113
+ ttlMs?: number;
114
+ dir?: string;
115
+ } | false;
116
+ }
62
117
  export interface AuditSummary {
63
118
  score: number;
64
119
  categoryScores: CategoryScores;
@@ -70,6 +125,14 @@ export interface AuditSummary {
70
125
  templateDetected?: boolean;
71
126
  /** Pre-enrichment finding count, for backward compatibility with CI scripts. */
72
127
  rawFindingCount?: number;
128
+ /** Cache statistics when caching is enabled. */
129
+ cacheStats?: CacheStats;
130
+ /** True when --exit-on-regression detected a new rule ID vs prior state. */
131
+ hasRegression?: boolean;
132
+ /** URLs that were skipped because their contentHash matched prior state. */
133
+ skippedUrls?: string[];
134
+ /** AI triage result when AI is enabled and call succeeded. */
135
+ triage?: import("./ai/types.js").TriageResult;
73
136
  }
74
137
  export interface PageGroupConfig {
75
138
  /** Glob pattern(s) to match page URLs/paths. */
@@ -118,6 +181,39 @@ export interface AuditOptions {
118
181
  };
119
182
  /** Override template auto-detection. When set, skips heuristic detection. */
120
183
  templateGenerated?: boolean;
184
+ /** Custom entity mask patterns. Merged with defaults (US states, ZIP codes). Set to empty array to disable defaults. */
185
+ entityPatterns?: Array<{
186
+ placeholder: string;
187
+ pattern: string;
188
+ flags?: string;
189
+ }>;
190
+ /** Source data records for data-binding verification. */
191
+ dataSource?: DataSourceOptions;
192
+ /** HTTP cache configuration. When omitted, caching is disabled. */
193
+ cache?: CacheOptions;
194
+ /** Sampling strategy when sampleSize < total pages. Default: "stratified". */
195
+ samplingStrategy?: SamplingStrategy;
196
+ /** Max samples per inferred URL template cluster. Caps per-cluster allocation. */
197
+ maxPerTemplate?: number;
198
+ /** Run state persistence. When omitted, no state is written. */
199
+ state?: StateOptions;
200
+ /** AI triage options. When omitted or `enabled: false`, no AI is invoked. */
201
+ ai?: AiOptions;
202
+ /** Local-only telemetry (JSONL) options. When omitted or `enabled: false`, no records are written. */
203
+ telemetry?: TelemetryOptions;
204
+ }
205
+ export type SamplingStrategy = "stratified" | "random";
206
+ /** A single page's source data for data-source comparison. */
207
+ export interface PageDataRecord {
208
+ /** URL or path pattern to match against audited pages. Supports globs. */
209
+ url: string;
210
+ /** Key-value data that should appear on the rendered page. */
211
+ data: Record<string, unknown>;
212
+ }
213
+ /** Options for data-source comparison rules. */
214
+ export interface DataSourceOptions {
215
+ /** Path to JSON file or inline array of page data records. */
216
+ records: PageDataRecord[];
121
217
  }
122
218
  export interface EntityMaskPattern {
123
219
  placeholder: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pseolint/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Programmatic SEO audit engine — 34 rules across 6 categories for SpamBrain risk detection",
5
5
  "license": "MIT",
6
6
  "author": "Ouranos Labs <contact@ouranos-labs.dev>",
@@ -33,14 +33,34 @@
33
33
  "typecheck": "tsc --noEmit -p tsconfig.json"
34
34
  },
35
35
  "dependencies": {
36
- "cheerio": "^1.2.0"
36
+ "ai": "^5.0.0",
37
+ "cheerio": "^1.2.0",
38
+ "zod": "^4.3.6"
37
39
  },
38
40
  "peerDependencies": {
39
- "playwright-core": ">=1.40.0"
41
+ "playwright-core": ">=1.40.0",
42
+ "@ai-sdk/anthropic": "^2.0.0",
43
+ "@ai-sdk/openai": "^2.0.0",
44
+ "@ai-sdk/google": "^2.0.0",
45
+ "@ai-sdk/mistral": "^2.0.0",
46
+ "@ai-sdk/groq": "^2.0.0",
47
+ "@ai-sdk/xai": "^2.0.0",
48
+ "@ai-sdk/cohere": "^2.0.0",
49
+ "ollama-ai-provider-v2": "^1.0.0"
40
50
  },
41
51
  "peerDependenciesMeta": {
42
- "playwright-core": {
43
- "optional": true
44
- }
52
+ "playwright-core": { "optional": true },
53
+ "@ai-sdk/anthropic": { "optional": true },
54
+ "@ai-sdk/openai": { "optional": true },
55
+ "@ai-sdk/google": { "optional": true },
56
+ "@ai-sdk/mistral": { "optional": true },
57
+ "@ai-sdk/groq": { "optional": true },
58
+ "@ai-sdk/xai": { "optional": true },
59
+ "@ai-sdk/cohere": { "optional": true },
60
+ "ollama-ai-provider-v2": { "optional": true }
61
+ },
62
+ "devDependencies": {
63
+ "@ai-sdk/anthropic": "^2.0.0",
64
+ "ollama-ai-provider-v2": "^1.0.0"
45
65
  }
46
66
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=entity-mask.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-mask.test.d.ts","sourceRoot":"","sources":["../../src/algorithms/entity-mask.test.ts"],"names":[],"mappings":""}
@@ -1,23 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { maskEntities } from "./entity-mask.js";
3
- describe("entity masking", () => {
4
- test("replaces matched entities with placeholders", () => {
5
- const input = "Form your California LLC in Los Angeles with zip 90210.";
6
- const output = maskEntities(input, [
7
- { placeholder: "[STATE]", pattern: /\bCalifornia\b/gi },
8
- { placeholder: "[CITY]", pattern: /\bLos Angeles\b/gi },
9
- { placeholder: "[ZIP]", pattern: /\b\d{5}\b/g }
10
- ]);
11
- expect(output).toContain("[STATE]");
12
- expect(output).toContain("[CITY]");
13
- expect(output).toContain("[ZIP]");
14
- expect(output).not.toContain("California");
15
- expect(output).not.toContain("90210");
16
- });
17
- test("replaces all occurrences even if regex is not global", () => {
18
- const input = "California LLC filing in California has California-specific rules.";
19
- const output = maskEntities(input, [{ placeholder: "[STATE]", pattern: /\bCalifornia\b/i }]);
20
- expect(output).toBe("[STATE] LLC filing in [STATE] has [STATE]-specific rules.");
21
- });
22
- });
23
- //# sourceMappingURL=entity-mask.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-mask.test.js","sourceRoot":"","sources":["../../src/algorithms/entity-mask.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,yDAAyD,CAAC;QACxE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE;YACjC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE;YACvD,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;YACvD,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;SAChD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,oEAAoE,CAAC;QACnF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAE7F,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=simhash.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simhash.test.d.ts","sourceRoot":"","sources":["../../src/algorithms/simhash.test.ts"],"names":[],"mappings":""}
@@ -1,23 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { hammingDistance, simHashFromText, similarityFromDistance } from "./simhash.js";
3
- describe("simhash", () => {
4
- test("returns same fingerprint for identical text", () => {
5
- const a = simHashFromText("california llc filing requirements and annual fees");
6
- const b = simHashFromText("california llc filing requirements and annual fees");
7
- expect(a).toBe(b);
8
- expect(hammingDistance(a, b)).toBe(0);
9
- expect(similarityFromDistance(0)).toBe(1);
10
- });
11
- test("returns lower similarity for different text", () => {
12
- const a = simHashFromText("california llc filing requirements and annual fees");
13
- const b = simHashFromText("best sourdough starter hydration and oven spring tips");
14
- const distance = hammingDistance(a, b);
15
- expect(distance).toBeGreaterThan(10);
16
- expect(similarityFromDistance(distance)).toBeLessThan(0.85);
17
- });
18
- test("returns neutral fingerprint for empty input", () => {
19
- const fingerprint = simHashFromText(" ");
20
- expect(fingerprint).toBe(0n);
21
- });
22
- });
23
- //# sourceMappingURL=simhash.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simhash.test.js","sourceRoot":"","sources":["../../src/algorithms/simhash.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAExF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,eAAe,CAAC,oDAAoD,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,eAAe,CAAC,oDAAoD,CAAC,CAAC;QAEhF,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,eAAe,CAAC,oDAAoD,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,eAAe,CAAC,uDAAuD,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=auditor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auditor.test.d.ts","sourceRoot":"","sources":["../src/auditor.test.ts"],"names":[],"mappings":""}