ai-saas-guard 0.33.0 → 0.34.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.
- package/README.md +7 -7
- package/dist/hosted/contracts.js +6 -1
- package/dist/report/markdown.js +7 -1
- package/dist/report/summary.js +5 -1
- package/dist/report/terminal.js +5 -1
- package/docs/README.zh-CN.md +6 -6
- package/docs/cold-start-review.md +22 -0
- package/docs/demo-terminal-output.txt +6 -0
- package/docs/demo-terminal-screenshot.svg +20 -0
- package/docs/launch-gate-positioning.md +4 -0
- package/docs/npm-publishing.md +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
AI-built SaaS can look ready before it is ready: login works, checkout opens, the dashboard loads, and tests are green. The launch risk is usually hidden in trust-boundary code that decides who gets access, who pays, what data they can see, and whether failures are visible.
|
|
33
33
|
|
|
34
|
-
Start with the 30-second copy-paste demo: `npx ai-saas-guard@latest demo --summary`. No signup, no code upload, no LLM call. See [docs/demo-terminal-output
|
|
34
|
+
Start with the 30-second copy-paste demo: `npx ai-saas-guard@latest demo --summary`. No signup, no code upload, no LLM call. See the [terminal screenshot](docs/demo-terminal-screenshot.svg), [saved output](docs/demo-terminal-output.txt), [compare with alternatives](docs/launch-gate-positioning.md), and the [30-second cold-start review](docs/cold-start-review.md).
|
|
35
35
|
|
|
36
36
|
These are the failures that hurt after real users arrive:
|
|
37
37
|
|
|
@@ -54,7 +54,7 @@ No signup, no code upload, no LLM call:
|
|
|
54
54
|
npx ai-saas-guard@latest demo --summary
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
The demo scans two packaged fixtures: one risky AI-built SaaS and one safer version. See the saved terminal sample in [docs/demo-terminal-output.txt](docs/demo-terminal-output.txt), then compare with alternatives in [docs/launch-gate-positioning.md](docs/launch-gate-positioning.md).
|
|
57
|
+
The demo scans two packaged fixtures: one risky AI-built SaaS and one safer version. See the [terminal screenshot](docs/demo-terminal-screenshot.svg) or saved terminal sample in [docs/demo-terminal-output.txt](docs/demo-terminal-output.txt), then compare with alternatives in [docs/launch-gate-positioning.md](docs/launch-gate-positioning.md).
|
|
58
58
|
|
|
59
59
|
## 60-Second Local Check
|
|
60
60
|
|
|
@@ -199,13 +199,13 @@ The CLI is published on npm as `ai-saas-guard`, and the GitHub Action is availab
|
|
|
199
199
|
| Area | Status |
|
|
200
200
|
| --- | --- |
|
|
201
201
|
| Public GitHub repository | Available |
|
|
202
|
-
| npm CLI | `ai-saas-guard@0.
|
|
203
|
-
| GitHub Action | `zr9959/ai-saas-guard@v0` or fixed tag `v0.
|
|
202
|
+
| npm CLI | `ai-saas-guard@0.34.0` |
|
|
203
|
+
| GitHub Action | `zr9959/ai-saas-guard@v0` or fixed tag `v0.34.0` |
|
|
204
204
|
| Outputs | Short summary, terminal, JSON, SARIF, and PR-focused markdown |
|
|
205
205
|
| Project config | `.ai-saas-guard.json` rule toggles, severity overrides, suppressions, and fail thresholds |
|
|
206
206
|
| Privacy model | Local-first, read-only scan commands, no LLM calls, no code upload |
|
|
207
|
-
| Versioned Action tags | `v0.
|
|
208
|
-
| Current release | `0.
|
|
207
|
+
| Versioned Action tags | `v0.34.0`, `v0` |
|
|
208
|
+
| Current release | `0.34.0` adds a visual demo screenshot, tightens first-run demo output, adds a concise competitor-positioning line, and improves hosted Check Run reviewer checklist wording |
|
|
209
209
|
| npm publishing | Trusted Publisher/OIDC, no long-lived publish token |
|
|
210
210
|
| Repository trust hardening | Strict branch protection, Dependabot, CodeQL, fast-check fuzzing, signed release provenance assets, private vulnerability reporting, secret scanning, and push protection |
|
|
211
211
|
| Cloudflare hosted ingress | Deployed at `https://ai-saas-guard-hosted.zr9959.workers.dev`; signed GitHub App webhook delivery and compact Check Run smoke now pass in staging |
|
|
@@ -374,7 +374,7 @@ Use `suppressions` for narrower false-positive handling when one rule is noisy o
|
|
|
374
374
|
|
|
375
375
|
## GitHub Action
|
|
376
376
|
|
|
377
|
-
The repo includes a composite Action. Use `v0` for the latest compatible pre-1.0 Action, a specific release tag such as `v0.
|
|
377
|
+
The repo includes a composite Action. Use `v0` for the latest compatible pre-1.0 Action, a specific release tag such as `v0.34.0` for controlled upgrades, or pin a reviewed commit SHA for stricter supply-chain control:
|
|
378
378
|
|
|
379
379
|
```yaml
|
|
380
380
|
name: ai-saas-guard
|
package/dist/hosted/contracts.js
CHANGED
|
@@ -485,7 +485,7 @@ export function createHostedCheckRunSummary(input) {
|
|
|
485
485
|
conclusion,
|
|
486
486
|
output: {
|
|
487
487
|
title: formatCheckRunTitle(totalFindings, conclusion, input.failOnSeverity),
|
|
488
|
-
summary: `Launch gate: ${launchGate}. Review first:
|
|
488
|
+
summary: `Launch gate: ${launchGate}. Review first: What changed at the launch boundary? Manual proof required before release; it is not a full security audit, pentest, or certification.`,
|
|
489
489
|
text: truncateMarkdown(formatCheckRunMarkdown(report, conclusion, localCliCommand, launchGate), input.maxMarkdownChars)
|
|
490
490
|
},
|
|
491
491
|
annotations: report.evidence.slice(0, MAX_CHECK_RUN_ANNOTATIONS).map((finding) => {
|
|
@@ -1111,6 +1111,11 @@ function formatCheckRunMarkdown(report, conclusion, localCliCommand, launchGate)
|
|
|
1111
1111
|
"Files to review first:",
|
|
1112
1112
|
...(filesToReview.length === 0 ? ["- None"] : filesToReview.map((file) => `- ${file}`)),
|
|
1113
1113
|
"",
|
|
1114
|
+
"Launch-boundary reviewer checklist:",
|
|
1115
|
+
"- What changed at the launch boundary?",
|
|
1116
|
+
"- Why this auth billing data or deploy decision is safe?",
|
|
1117
|
+
"- What manual test proves it fails closed?",
|
|
1118
|
+
"",
|
|
1114
1119
|
"Verification steps:",
|
|
1115
1120
|
"- Review each listed file before release or merge.",
|
|
1116
1121
|
"- Reproduce locally with the CLI command above.",
|
package/dist/report/markdown.js
CHANGED
|
@@ -10,11 +10,17 @@ function formatDemoMarkdown(report) {
|
|
|
10
10
|
const lines = [];
|
|
11
11
|
lines.push("## ai-saas-guard demo");
|
|
12
12
|
lines.push("");
|
|
13
|
-
lines.push("
|
|
13
|
+
lines.push("AI-built SaaS can look ready while launch risks stay hidden. This is not a pentest, full audit, or certification.");
|
|
14
14
|
lines.push("");
|
|
15
15
|
lines.push(`- Risky demo: ${escapeMarkdownInline(summaryText(report.demos.risky))}`);
|
|
16
16
|
lines.push(`- Safe demo: ${escapeMarkdownInline(summaryText(report.demos.safe))}`);
|
|
17
17
|
lines.push("");
|
|
18
|
+
lines.push("### What This Proves");
|
|
19
|
+
appendList(lines, [
|
|
20
|
+
"The same SaaS surfaces can look finished while auth, billing, data, deploy, and CI risks still need review.",
|
|
21
|
+
"The safe demo keeps the same SaaS surfaces but removes the intentional launch-risk patterns."
|
|
22
|
+
].map(escapeMarkdownInline));
|
|
23
|
+
lines.push("");
|
|
18
24
|
lines.push("### Review First");
|
|
19
25
|
appendList(lines, reviewFirst(report.demos.risky.findings).map(escapeMarkdownInline));
|
|
20
26
|
lines.push("");
|
package/dist/report/summary.js
CHANGED
|
@@ -35,13 +35,17 @@ export function formatSummaryReport(report) {
|
|
|
35
35
|
function formatShowcaseSummary(report) {
|
|
36
36
|
const lines = [];
|
|
37
37
|
lines.push("ai-saas-guard demo summary");
|
|
38
|
-
lines.push("
|
|
38
|
+
lines.push("AI-built SaaS can look ready while launch risks stay hidden.");
|
|
39
39
|
lines.push("This is not a pentest, full audit, or certification.");
|
|
40
40
|
lines.push("");
|
|
41
41
|
lines.push(`Risky demo: ${summaryText(report.demos.risky)}`);
|
|
42
42
|
lines.push(`Safe demo: ${summaryText(report.demos.safe)}`);
|
|
43
43
|
lines.push(`Launch gate: ${launchGateVerdict(report.demos.risky)}`);
|
|
44
44
|
lines.push("");
|
|
45
|
+
lines.push("What this proves:");
|
|
46
|
+
lines.push("- The same SaaS surfaces can look finished while auth, billing, data, deploy, and CI risks still need review.");
|
|
47
|
+
lines.push("- The safe demo keeps the same SaaS surfaces but removes the intentional launch-risk patterns.");
|
|
48
|
+
lines.push("");
|
|
45
49
|
lines.push("Top risks:");
|
|
46
50
|
appendList(lines, reviewFirst(report.demos.risky.findings, 3));
|
|
47
51
|
lines.push("");
|
package/dist/report/terminal.js
CHANGED
|
@@ -48,12 +48,16 @@ export function formatTerminalReport(report) {
|
|
|
48
48
|
function formatDemoTerminalReport(report) {
|
|
49
49
|
const lines = [];
|
|
50
50
|
lines.push("ai-saas-guard demo");
|
|
51
|
-
lines.push("
|
|
51
|
+
lines.push("AI-built SaaS can look ready while launch risks stay hidden.");
|
|
52
52
|
lines.push("This is not a pentest, full audit, or certification.");
|
|
53
53
|
lines.push("");
|
|
54
54
|
lines.push(`Risky demo: ${summaryText(report.demos.risky)}`);
|
|
55
55
|
lines.push(`Safe demo: ${summaryText(report.demos.safe)}`);
|
|
56
56
|
lines.push("");
|
|
57
|
+
lines.push("What this proves:");
|
|
58
|
+
lines.push("- The same SaaS surfaces can look finished while auth, billing, data, deploy, and CI risks still need review.");
|
|
59
|
+
lines.push("- The safe demo keeps the same SaaS surfaces but removes the intentional launch-risk patterns.");
|
|
60
|
+
lines.push("");
|
|
57
61
|
lines.push("Review first:");
|
|
58
62
|
for (const item of reviewFirst(report.demos.risky.findings)) {
|
|
59
63
|
lines.push(`- ${item}`);
|
package/docs/README.zh-CN.md
CHANGED
|
@@ -51,7 +51,7 @@ AI 构建的 SaaS 很容易“看起来已经能上线”:能登录、能打
|
|
|
51
51
|
npx ai-saas-guard@latest demo --summary
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
这个 demo 会扫描两个包内 fixture:一个故意有上线风险的 AI-built SaaS
|
|
54
|
+
这个 demo 会扫描两个包内 fixture:一个故意有上线风险的 AI-built SaaS,和一个同类场景下更安全的版本。可以先看[终端截图](docs/demo-terminal-screenshot.svg)和保存好的终端样例:[docs/demo-terminal-output.txt](demo-terminal-output.txt),再看它[和替代方案的区别](launch-gate-positioning.md)。
|
|
55
55
|
|
|
56
56
|
## 60 秒本地检查
|
|
57
57
|
|
|
@@ -179,18 +179,18 @@ node dist/cli.js scan --root /path/to/your-saas
|
|
|
179
179
|
|
|
180
180
|
这个仓库是公开 GitHub 仓库。
|
|
181
181
|
|
|
182
|
-
CLI 已发布到 npm:`ai-saas-guard@0.
|
|
182
|
+
CLI 已发布到 npm:`ai-saas-guard@0.34.0`。GitHub Action 支持 `v0` 浮动标签,也支持固定版本标签,例如 `v0.34.0`。
|
|
183
183
|
|
|
184
184
|
| 模块 | 状态 |
|
|
185
185
|
| --- | --- |
|
|
186
186
|
| 公开 GitHub 仓库 | 已可用 |
|
|
187
|
-
| npm CLI | `ai-saas-guard@0.
|
|
188
|
-
| GitHub Action | `zr9959/ai-saas-guard@v0` 或固定标签 `v0.
|
|
187
|
+
| npm CLI | `ai-saas-guard@0.34.0` |
|
|
188
|
+
| GitHub Action | `zr9959/ai-saas-guard@v0` 或固定标签 `v0.34.0` |
|
|
189
189
|
| 输出格式 | 短 summary、Terminal、JSON、SARIF 和 PR markdown |
|
|
190
190
|
| 项目配置 | `.ai-saas-guard.json` 支持规则开关、severity 覆盖、suppressions 和 fail threshold |
|
|
191
191
|
| 隐私模型 | 本地优先、只读扫描、不调用 LLM、不上传代码 |
|
|
192
|
-
| 当前版本 | `0.
|
|
193
|
-
| Action 标签 | `v0.
|
|
192
|
+
| 当前版本 | `0.34.0` 增加可视化 demo 截图、优化首次 demo 输出、补充更精简的竞品定位说明,并强化 hosted Check Run reviewer checklist |
|
|
193
|
+
| Action 标签 | `v0.34.0`、`v0` |
|
|
194
194
|
| npm 发布 | GitHub Actions Trusted Publisher/OIDC,无需长期 npm token |
|
|
195
195
|
| 仓库可信度加固 | 严格 branch protection、Dependabot、CodeQL、fast-check fuzzing、signed release provenance assets、private vulnerability reporting、secret scanning 和 push protection |
|
|
196
196
|
| Cloudflare hosted ingress | 已部署到 `https://ai-saas-guard-hosted.zr9959.workers.dev`;签名 GitHub App webhook delivery 和 compact Check Run staging smoke 已通过 |
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 30-Second GitHub Cold-Start Review
|
|
2
|
+
|
|
3
|
+
Use this checklist when reading the repository as a first-time visitor.
|
|
4
|
+
|
|
5
|
+
## First Screen
|
|
6
|
+
|
|
7
|
+
- Does the first screen explain the painful problem before listing features?
|
|
8
|
+
- Does it say AI-built SaaS can look ready while auth, billing, data, deploy, and CI risks stay hidden?
|
|
9
|
+
- Is the no-signup demo command visible without scrolling far?
|
|
10
|
+
- Are the local-first boundaries visible: no code upload and no LLM call?
|
|
11
|
+
|
|
12
|
+
## First Command
|
|
13
|
+
|
|
14
|
+
- Can the visitor run `npx ai-saas-guard@latest demo --summary` without cloning a repository?
|
|
15
|
+
- Does the output show risky versus safe SaaS surfaces in under a minute?
|
|
16
|
+
- Does it point to manual proof instead of implying certification?
|
|
17
|
+
|
|
18
|
+
## First Decision
|
|
19
|
+
|
|
20
|
+
- Can the visitor tell when to use this beside Semgrep, CodeQL, zizmor, Scorecard, Snyk, and GitHub code scanning?
|
|
21
|
+
- Can the visitor tell this is a launch review queue, not a pentest, full audit, or certification?
|
|
22
|
+
- Can the visitor tell whether they should run `scan`, `pr-risk`, or the GitHub Action next?
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
ai-saas-guard demo --summary
|
|
2
2
|
|
|
3
|
+
AI-built SaaS can look ready while launch risks stay hidden.
|
|
4
|
+
|
|
3
5
|
Risky demo: 19 findings
|
|
4
6
|
Launch gate: blocked
|
|
5
7
|
|
|
8
|
+
What this proves:
|
|
9
|
+
- The same SaaS surfaces can look finished while auth, billing, data, deploy, and CI risks still need review.
|
|
10
|
+
- The safe demo keeps the same SaaS surfaces but removes the intentional launch-risk patterns.
|
|
11
|
+
|
|
6
12
|
Top risks:
|
|
7
13
|
- CRITICAL stripe.webhook.missing-signature at app/api/stripe/webhook/route.ts:1
|
|
8
14
|
- CRITICAL supabase.rls.broad-policy at supabase/migrations/001_accounts.sql:10
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="560" viewBox="0 0 960 560" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">ai-saas-guard demo terminal screenshot</title>
|
|
3
|
+
<desc id="desc">Terminal-style screenshot showing risky and safe demo summaries.</desc>
|
|
4
|
+
<rect width="960" height="560" fill="#0b1020"/>
|
|
5
|
+
<rect x="32" y="32" width="896" height="496" rx="8" fill="#111827" stroke="#334155"/>
|
|
6
|
+
<circle cx="62" cy="58" r="7" fill="#ef4444"/>
|
|
7
|
+
<circle cx="86" cy="58" r="7" fill="#f59e0b"/>
|
|
8
|
+
<circle cx="110" cy="58" r="7" fill="#22c55e"/>
|
|
9
|
+
<text x="48" y="104" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="22">npx ai-saas-guard@latest demo --summary</text>
|
|
10
|
+
<text x="48" y="152" fill="#93c5fd" font-family="Menlo, Consolas, monospace" font-size="20">ai-saas-guard demo summary</text>
|
|
11
|
+
<text x="48" y="190" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="18">AI-built SaaS can look ready while launch risks stay hidden.</text>
|
|
12
|
+
<text x="48" y="232" fill="#fca5a5" font-family="Menlo, Consolas, monospace" font-size="20">Risky demo: 19 findings: 2 critical, 6 high, 7 medium, 3 low, 1 info</text>
|
|
13
|
+
<text x="48" y="270" fill="#86efac" font-family="Menlo, Consolas, monospace" font-size="20">Safe demo: 0 findings</text>
|
|
14
|
+
<text x="48" y="320" fill="#fde68a" font-family="Menlo, Consolas, monospace" font-size="18">What this proves:</text>
|
|
15
|
+
<text x="72" y="356" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="17">- same SaaS surfaces, different launch-risk patterns</text>
|
|
16
|
+
<text x="72" y="388" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="17">- review auth, billing, data, deploy, CI before real users</text>
|
|
17
|
+
<text x="48" y="438" fill="#fde68a" font-family="Menlo, Consolas, monospace" font-size="18">Top risks:</text>
|
|
18
|
+
<text x="72" y="474" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="16">- CRITICAL stripe.webhook.missing-signature</text>
|
|
19
|
+
<text x="72" y="504" fill="#e5e7eb" font-family="Menlo, Consolas, monospace" font-size="16">- CRITICAL supabase.rls.broad-policy</text>
|
|
20
|
+
</svg>
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
The narrow bet is simple: a founder or reviewer should know which launch-risk files to inspect first, what manual proof to run, and what fix direction to try before traffic reaches real users.
|
|
6
6
|
|
|
7
|
+
## What This Adds In One Line
|
|
8
|
+
|
|
9
|
+
`ai-saas-guard` turns AI-built SaaS launch risks into a short local review queue; it is not intended to substitute for broad SAST, dependency scanning, workflow security analysis, or repository scorecards.
|
|
10
|
+
|
|
7
11
|
## Where It Fits
|
|
8
12
|
|
|
9
13
|
| Tool category | Typical strength | How ai-saas-guard fits beside it |
|
package/docs/npm-publishing.md
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
## Current State
|
|
6
6
|
|
|
7
7
|
- Package name: `ai-saas-guard`
|
|
8
|
-
- Current published version: `0.
|
|
8
|
+
- Current published version: `0.34.0`
|
|
9
9
|
- Next source candidate: none
|
|
10
10
|
- npm registry state: published at <https://www.npmjs.com/package/ai-saas-guard>
|
|
11
11
|
- First npm-published version: `0.1.1`
|
|
12
|
-
- GitHub Release: `v0.
|
|
12
|
+
- GitHub Release: `v0.34.0`
|
|
13
13
|
- Publish workflow: `.github/workflows/npm-publish.yml`
|
|
14
14
|
- Trusted Publisher: GitHub Actions, `zr9959/ai-saas-guard`, workflow `npm-publish.yml`, allowed action `npm publish`
|
|
15
15
|
- Long-lived npm publish token: not required
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
Use GitHub Actions with npm Trusted Publisher/OIDC:
|
|
20
20
|
|
|
21
|
-
1. Create and review a release tag such as `v0.
|
|
21
|
+
1. Create and review a release tag such as `v0.34.0`.
|
|
22
22
|
2. Publish from the GitHub Release or run the `Publish npm` workflow manually with `ref` set to that tag.
|
|
23
23
|
3. Keep `permissions.id-token: write` in the workflow so npm can exchange the GitHub Actions OIDC identity for a short-lived publish credential.
|
|
24
24
|
4. Run `npm publish --access public` from the workflow. Trusted publishing automatically generates provenance for this public package from this public repository.
|
package/package.json
CHANGED