guardrail-ship 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/index.d.ts +7 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +7 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/mock-implementation.d.ts +1 -0
  6. package/dist/mock-implementation.d.ts.map +1 -0
  7. package/dist/mock-implementation.js +2 -0
  8. package/dist/mock-implementation.js.map +1 -0
  9. package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts +5 -0
  10. package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts.map +1 -0
  11. package/dist/mockproof/__tests__/import-graph-scanner.test.js +92 -0
  12. package/dist/mockproof/__tests__/import-graph-scanner.test.js.map +1 -0
  13. package/dist/mockproof/import-graph-scanner.d.ts +93 -0
  14. package/dist/mockproof/import-graph-scanner.d.ts.map +1 -0
  15. package/dist/mockproof/import-graph-scanner.js +411 -0
  16. package/dist/mockproof/import-graph-scanner.js.map +1 -0
  17. package/dist/mockproof/index.d.ts +10 -0
  18. package/dist/mockproof/index.d.ts.map +1 -0
  19. package/dist/mockproof/index.js +10 -0
  20. package/dist/mockproof/index.js.map +1 -0
  21. package/dist/reality-mode/auth-enforcer.d.ts +13 -0
  22. package/dist/reality-mode/auth-enforcer.d.ts.map +1 -0
  23. package/dist/reality-mode/auth-enforcer.js +90 -0
  24. package/dist/reality-mode/auth-enforcer.js.map +1 -0
  25. package/dist/reality-mode/explorer/critical-flows.d.ts +71 -0
  26. package/dist/reality-mode/explorer/critical-flows.d.ts.map +1 -0
  27. package/dist/reality-mode/explorer/critical-flows.js +463 -0
  28. package/dist/reality-mode/explorer/critical-flows.js.map +1 -0
  29. package/dist/reality-mode/explorer/flow-parser.d.ts +52 -0
  30. package/dist/reality-mode/explorer/flow-parser.d.ts.map +1 -0
  31. package/dist/reality-mode/explorer/flow-parser.js +250 -0
  32. package/dist/reality-mode/explorer/flow-parser.js.map +1 -0
  33. package/dist/reality-mode/explorer/index.d.ts +11 -0
  34. package/dist/reality-mode/explorer/index.d.ts.map +1 -0
  35. package/dist/reality-mode/explorer/index.js +11 -0
  36. package/dist/reality-mode/explorer/index.js.map +1 -0
  37. package/dist/reality-mode/explorer/runtime-explorer.d.ts +35 -0
  38. package/dist/reality-mode/explorer/runtime-explorer.d.ts.map +1 -0
  39. package/dist/reality-mode/explorer/runtime-explorer.js +688 -0
  40. package/dist/reality-mode/explorer/runtime-explorer.js.map +1 -0
  41. package/dist/reality-mode/explorer/surface-discovery.d.ts +60 -0
  42. package/dist/reality-mode/explorer/surface-discovery.d.ts.map +1 -0
  43. package/dist/reality-mode/explorer/surface-discovery.js +357 -0
  44. package/dist/reality-mode/explorer/surface-discovery.js.map +1 -0
  45. package/dist/reality-mode/explorer/types.d.ts +275 -0
  46. package/dist/reality-mode/explorer/types.d.ts.map +1 -0
  47. package/dist/reality-mode/explorer/types.js +8 -0
  48. package/dist/reality-mode/explorer/types.js.map +1 -0
  49. package/dist/reality-mode/fake-success-detector.d.ts +10 -0
  50. package/dist/reality-mode/fake-success-detector.d.ts.map +1 -0
  51. package/dist/reality-mode/fake-success-detector.js +76 -0
  52. package/dist/reality-mode/fake-success-detector.js.map +1 -0
  53. package/dist/reality-mode/index.d.ts +14 -0
  54. package/dist/reality-mode/index.d.ts.map +1 -0
  55. package/dist/reality-mode/index.js +14 -0
  56. package/dist/reality-mode/index.js.map +1 -0
  57. package/dist/reality-mode/reality-scanner.d.ts +48 -0
  58. package/dist/reality-mode/reality-scanner.d.ts.map +1 -0
  59. package/dist/reality-mode/reality-scanner.js +516 -0
  60. package/dist/reality-mode/reality-scanner.js.map +1 -0
  61. package/dist/reality-mode/report-generator.d.ts +11 -0
  62. package/dist/reality-mode/report-generator.d.ts.map +1 -0
  63. package/dist/reality-mode/report-generator.js +233 -0
  64. package/dist/reality-mode/report-generator.js.map +1 -0
  65. package/dist/reality-mode/traffic-classifier.d.ts +14 -0
  66. package/dist/reality-mode/traffic-classifier.d.ts.map +1 -0
  67. package/dist/reality-mode/traffic-classifier.js +131 -0
  68. package/dist/reality-mode/traffic-classifier.js.map +1 -0
  69. package/dist/reality-mode/types.d.ts +90 -0
  70. package/dist/reality-mode/types.d.ts.map +1 -0
  71. package/dist/reality-mode/types.js +2 -0
  72. package/dist/reality-mode/types.js.map +1 -0
  73. package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts +5 -0
  74. package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts.map +1 -0
  75. package/dist/ship-badge/__tests__/ship-badge-generator.test.js +146 -0
  76. package/dist/ship-badge/__tests__/ship-badge-generator.test.js.map +1 -0
  77. package/dist/ship-badge/index.d.ts +9 -0
  78. package/dist/ship-badge/index.d.ts.map +1 -0
  79. package/dist/ship-badge/index.js +9 -0
  80. package/dist/ship-badge/index.js.map +1 -0
  81. package/dist/ship-badge/ship-badge-generator.d.ts +136 -0
  82. package/dist/ship-badge/ship-badge-generator.d.ts.map +1 -0
  83. package/dist/ship-badge/ship-badge-generator.js +681 -0
  84. package/dist/ship-badge/ship-badge-generator.js.map +1 -0
  85. package/package.json +20 -0
  86. package/src/index.ts +7 -0
  87. package/src/mock-implementation.ts +0 -0
  88. package/src/mockproof/__tests__/import-graph-scanner.test.ts +115 -0
  89. package/src/mockproof/import-graph-scanner.d.ts +93 -0
  90. package/src/mockproof/import-graph-scanner.d.ts.map +1 -0
  91. package/src/mockproof/import-graph-scanner.js +482 -0
  92. package/src/mockproof/import-graph-scanner.ts +540 -0
  93. package/src/mockproof/index.ts +18 -0
  94. package/src/reality-mode/auth-enforcer.ts +97 -0
  95. package/src/reality-mode/explorer/critical-flows.ts +504 -0
  96. package/src/reality-mode/explorer/flow-parser.ts +293 -0
  97. package/src/reality-mode/explorer/index.ts +22 -0
  98. package/src/reality-mode/explorer/runtime-explorer.ts +715 -0
  99. package/src/reality-mode/explorer/surface-discovery.ts +498 -0
  100. package/src/reality-mode/explorer/templates/example-flows/auth-flow.yaml +41 -0
  101. package/src/reality-mode/explorer/templates/example-flows/checkout-flow.yaml +66 -0
  102. package/src/reality-mode/explorer/templates/example-flows/contact-form.yaml +43 -0
  103. package/src/reality-mode/explorer/templates/github-action.yml +132 -0
  104. package/src/reality-mode/explorer/types.ts +356 -0
  105. package/src/reality-mode/fake-success-detector.ts +89 -0
  106. package/src/reality-mode/index.ts +19 -0
  107. package/src/reality-mode/reality-scanner.d.ts +123 -0
  108. package/src/reality-mode/reality-scanner.d.ts.map +1 -0
  109. package/src/reality-mode/reality-scanner.js +526 -0
  110. package/src/reality-mode/reality-scanner.ts +576 -0
  111. package/src/reality-mode/report-generator.ts +253 -0
  112. package/src/reality-mode/traffic-classifier.ts +169 -0
  113. package/src/reality-mode/types.ts +95 -0
  114. package/src/ship-badge/__tests__/ship-badge-generator.test.ts +162 -0
  115. package/src/ship-badge/index.ts +16 -0
  116. package/src/ship-badge/ship-badge-generator.d.ts +136 -0
  117. package/src/ship-badge/ship-badge-generator.d.ts.map +1 -0
  118. package/src/ship-badge/ship-badge-generator.js +779 -0
  119. package/src/ship-badge/ship-badge-generator.ts +873 -0
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Tests for Ship Badge Generator
3
+ */
4
+ import * as path from "path";
5
+ import { ShipBadgeGenerator } from "../ship-badge-generator";
6
+ describe("ShipBadgeGenerator", () => {
7
+ let generator;
8
+ beforeEach(() => {
9
+ generator = new ShipBadgeGenerator();
10
+ });
11
+ describe("generateShipBadge", () => {
12
+ it("should generate badges for a project", async () => {
13
+ const result = await generator.generateShipBadge({
14
+ projectPath: path.join(__dirname, "..", "..", "..", ".."),
15
+ projectName: "test-project",
16
+ });
17
+ expect(result).toHaveProperty("verdict");
18
+ expect(result).toHaveProperty("score");
19
+ expect(result).toHaveProperty("checks");
20
+ expect(result).toHaveProperty("badges");
21
+ expect(result).toHaveProperty("permalink");
22
+ expect(result).toHaveProperty("embedCode");
23
+ expect(result.checks.length).toBeGreaterThan(0);
24
+ expect(["ship", "no-ship", "review"]).toContain(result.verdict);
25
+ });
26
+ it("should include all required checks", async () => {
27
+ const result = await generator.generateShipBadge({
28
+ projectPath: __dirname,
29
+ projectName: "test",
30
+ });
31
+ const checkIds = result.checks.map((c) => c.id);
32
+ expect(checkIds).toContain("no-mock-data");
33
+ expect(checkIds).toContain("no-localhost");
34
+ expect(checkIds).toContain("env-vars");
35
+ expect(checkIds).toContain("real-billing");
36
+ expect(checkIds).toContain("real-database");
37
+ expect(checkIds).toContain("oauth-callbacks");
38
+ });
39
+ });
40
+ describe("generateReport", () => {
41
+ it("should generate readable report for passing project", () => {
42
+ const mockResult = {
43
+ projectId: "test123",
44
+ projectName: "My App",
45
+ verdict: "ship",
46
+ score: 100,
47
+ checks: [
48
+ {
49
+ id: "no-mock-data",
50
+ name: "No Mock Data",
51
+ shortName: "Mock",
52
+ status: "pass",
53
+ message: "Clean",
54
+ },
55
+ {
56
+ id: "no-localhost",
57
+ name: "No Localhost",
58
+ shortName: "URLs",
59
+ status: "pass",
60
+ message: "Clean",
61
+ },
62
+ ],
63
+ badges: {
64
+ main: "<svg>...</svg>",
65
+ mockData: "<svg>...</svg>",
66
+ realApi: "<svg>...</svg>",
67
+ envVars: "<svg>...</svg>",
68
+ billing: "<svg>...</svg>",
69
+ database: "<svg>...</svg>",
70
+ oauth: "<svg>...</svg>",
71
+ combined: "<svg>...</svg>",
72
+ },
73
+ timestamp: new Date().toISOString(),
74
+ expiresAt: new Date().toISOString(),
75
+ permalink: "https://Guardrail.dev/badge/test123",
76
+ embedCode: "[![Badge](url)](link)",
77
+ };
78
+ const report = generator.generateReport(mockResult);
79
+ expect(report).toContain("SHIP IT!");
80
+ expect(report).toContain("My App");
81
+ expect(report).toContain("100/100");
82
+ });
83
+ it("should generate readable report for failing project", () => {
84
+ const mockResult = {
85
+ projectId: "test123",
86
+ projectName: "Bad App",
87
+ verdict: "no-ship",
88
+ score: 33,
89
+ checks: [
90
+ {
91
+ id: "no-mock-data",
92
+ name: "No Mock Data",
93
+ shortName: "Mock",
94
+ status: "fail",
95
+ message: "Found 5 issues",
96
+ details: ["file1.ts", "file2.ts"],
97
+ },
98
+ {
99
+ id: "no-localhost",
100
+ name: "No Localhost",
101
+ shortName: "URLs",
102
+ status: "pass",
103
+ message: "Clean",
104
+ },
105
+ {
106
+ id: "env-vars",
107
+ name: "Env Vars",
108
+ shortName: "Env",
109
+ status: "fail",
110
+ message: "Missing vars",
111
+ },
112
+ ],
113
+ badges: {
114
+ main: "<svg>...</svg>",
115
+ mockData: "<svg>...</svg>",
116
+ realApi: "<svg>...</svg>",
117
+ envVars: "<svg>...</svg>",
118
+ billing: "<svg>...</svg>",
119
+ database: "<svg>...</svg>",
120
+ oauth: "<svg>...</svg>",
121
+ combined: "<svg>...</svg>",
122
+ },
123
+ timestamp: new Date().toISOString(),
124
+ expiresAt: new Date().toISOString(),
125
+ permalink: "https://Guardrail.dev/badge/test123",
126
+ embedCode: "[![Badge](url)](link)",
127
+ };
128
+ const report = generator.generateReport(mockResult);
129
+ expect(report).toContain("NO SHIP");
130
+ expect(report).toContain("Bad App");
131
+ expect(report).toContain("❌");
132
+ });
133
+ });
134
+ describe("badges", () => {
135
+ it("should generate valid SVG badges", async () => {
136
+ const result = await generator.generateShipBadge({
137
+ projectPath: __dirname,
138
+ projectName: "test",
139
+ });
140
+ expect(result.badges.main).toContain("<svg");
141
+ expect(result.badges.main).toContain("</svg>");
142
+ expect(result.badges.combined).toContain("<svg");
143
+ });
144
+ });
145
+ });
146
+ //# sourceMappingURL=ship-badge-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-badge-generator.test.js","sourceRoot":"","sources":["../../../src/ship-badge/__tests__/ship-badge-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Ship Badge Generator
3
+ *
4
+ * "One-click shareable proof that your app is real."
5
+ *
6
+ * Social proof badges for README / landing page / Product Hunt.
7
+ */
8
+ export { ShipBadgeGenerator, shipBadgeGenerator, type ShipCheck, type ShipBadgeResult, type ShipBadges, type ShipBadgeConfig, } from "./ship-badge-generator";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ship-badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Ship Badge Generator
3
+ *
4
+ * "One-click shareable proof that your app is real."
5
+ *
6
+ * Social proof badges for README / landing page / Product Hunt.
7
+ */
8
+ export { ShipBadgeGenerator, shipBadgeGenerator, } from "./ship-badge-generator";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ship-badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAKnB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Ship Badge Generator
3
+ *
4
+ * "One-click shareable proof that your app is real."
5
+ *
6
+ * Generates badges + hosted permalinks for:
7
+ * ✅ No Mock Data Detected
8
+ * ✅ No Localhost/Ngrok
9
+ * ✅ All required env vars present
10
+ * ✅ Billing not simulated
11
+ * ✅ DB is real
12
+ * ✅ OAuth callbacks not localhost
13
+ *
14
+ * Vibecoders slap this on README / landing page / Product Hunt for social proof.
15
+ */
16
+ export interface ShipCheck {
17
+ id: string;
18
+ name: string;
19
+ shortName: string;
20
+ status: "pass" | "fail" | "warning" | "skip";
21
+ message: string;
22
+ details?: string[];
23
+ }
24
+ export interface ShipBadgeResult {
25
+ projectId: string;
26
+ projectName: string;
27
+ verdict: "ship" | "no-ship" | "review";
28
+ score: number;
29
+ checks: ShipCheck[];
30
+ badges: ShipBadges;
31
+ timestamp: string;
32
+ expiresAt: string;
33
+ permalink: string;
34
+ embedCode: string;
35
+ }
36
+ export interface ShipBadges {
37
+ main: string;
38
+ mockData: string;
39
+ realApi: string;
40
+ envVars: string;
41
+ billing: string;
42
+ database: string;
43
+ oauth: string;
44
+ combined: string;
45
+ }
46
+ export interface ShipBadgeConfig {
47
+ projectPath: string;
48
+ projectName?: string;
49
+ checks?: string[];
50
+ outputDir?: string;
51
+ baseUrl?: string;
52
+ }
53
+ export declare class ShipBadgeGenerator {
54
+ /**
55
+ * Run all ship checks and generate badges
56
+ */
57
+ generateShipBadge(config: ShipBadgeConfig): Promise<ShipBadgeResult>;
58
+ /**
59
+ * Run all ship-worthiness checks
60
+ */
61
+ private runAllChecks;
62
+ /**
63
+ * Check for mock data patterns
64
+ */
65
+ private checkNoMockData;
66
+ /**
67
+ * Check for localhost/ngrok URLs
68
+ */
69
+ private checkNoLocalhost;
70
+ /**
71
+ * Check for required environment variables
72
+ */
73
+ private checkEnvVars;
74
+ /**
75
+ * Check for real billing (not demo/test)
76
+ */
77
+ private checkRealBilling;
78
+ /**
79
+ * Check for real database connection
80
+ */
81
+ private checkRealDatabase;
82
+ /**
83
+ * Check OAuth callback URLs
84
+ */
85
+ private checkOAuthCallbacks;
86
+ /**
87
+ * Calculate overall verdict
88
+ */
89
+ private calculateVerdict;
90
+ /**
91
+ * Generate all badge SVGs
92
+ */
93
+ private generateAllBadges;
94
+ /**
95
+ * Create a single check badge
96
+ */
97
+ private createCheckBadge;
98
+ /**
99
+ * Create a combined badge strip
100
+ */
101
+ private createCombinedBadge;
102
+ /**
103
+ * Create SVG badge
104
+ */
105
+ private createBadge;
106
+ /**
107
+ * Generate embed code for README
108
+ */
109
+ private generateEmbedCode;
110
+ /**
111
+ * Save badges to directory
112
+ */
113
+ private saveBadges;
114
+ /**
115
+ * Generate project ID from path
116
+ */
117
+ private generateProjectId;
118
+ /**
119
+ * Find source files
120
+ */
121
+ private findSourceFiles;
122
+ /**
123
+ * Check if file is a test file
124
+ */
125
+ private isTestFile;
126
+ /**
127
+ * Escape HTML entities
128
+ */
129
+ private escapeHtml;
130
+ /**
131
+ * Generate human-readable report
132
+ */
133
+ generateReport(result: ShipBadgeResult): string;
134
+ }
135
+ export declare const shipBadgeGenerator: ShipBadgeGenerator;
136
+ //# sourceMappingURL=ship-badge-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-badge-generator.d.ts","sourceRoot":"","sources":["../../src/ship-badge/ship-badge-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA8C1E;;OAEG;YACW,YAAY;IAwB1B;;OAEG;YACW,eAAe;IAgD7B;;OAEG;YACW,gBAAgB;IAoD9B;;OAEG;YACW,YAAY;IAuD1B;;OAEG;YACW,gBAAgB;IA2D9B;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;YACW,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,UAAU;IASlB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;CAoEhD;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}