ai-saas-guard 0.41.0 → 0.42.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 CHANGED
@@ -235,13 +235,13 @@ The CLI is published on npm as `ai-saas-guard`, and the GitHub Action is availab
235
235
  | Area | Status |
236
236
  | --- | --- |
237
237
  | Public GitHub repository | Available |
238
- | npm CLI | `ai-saas-guard@0.41.0` |
239
- | GitHub Action | `zr9959/ai-saas-guard@v0` or fixed tag `v0.41.0` |
238
+ | npm CLI | `ai-saas-guard@0.42.0` |
239
+ | GitHub Action | `zr9959/ai-saas-guard@v0` or fixed tag `v0.42.0` |
240
240
  | Outputs | Launch decision queue, short summary, terminal, JSON, SARIF, and PR-focused markdown |
241
241
  | Project config | `.ai-saas-guard.json` rule toggles, severity overrides, suppressions, and fail thresholds |
242
242
  | Privacy model | Local-first, read-only scan commands, no LLM calls, no code upload |
243
- | Versioned Action tags | `v0.41.0`, `v0` |
244
- | Current release | `0.41.0` adds source-checkout trial planning/evidence contracts, compresses hosted Check Run reviewer output, and documents the next hosted source-checkout gate |
243
+ | Versioned Action tags | `v0.42.0`, `v0` |
244
+ | Current release | `0.42.0` adds a single Phase 3 source-checkout trial gate that combines plan, stage evidence, scan proof, live smoke, rollback, monitoring, and incident-owner checks before hosted beta |
245
245
  | npm publishing | Trusted Publisher/OIDC, no long-lived publish token |
246
246
  | Repository trust hardening | Strict branch protection, Dependabot, CodeQL, fast-check fuzzing, signed release provenance assets, private vulnerability reporting, secret scanning, and push protection |
247
247
  | Cloudflare hosted ingress | Deployed at `https://ai-saas-guard-hosted.zr9959.workers.dev`; public install/privacy notes are in [docs/hosted-install-privacy.md](docs/hosted-install-privacy.md); signed GitHub App webhook delivery and compact Check Run smoke now pass in staging |
@@ -367,7 +367,7 @@ Deployed worker staging evidence is documented in [docs/hosted-deployed-worker-s
367
367
 
368
368
  The first live hosted ingress is deployed on Cloudflare Workers at `https://ai-saas-guard-hosted.zr9959.workers.dev` and documented in [hosted/cloudflare-worker/README.md](hosted/cloudflare-worker/README.md). It exposes `/healthz`, `/github/app/install-info`, `/github/app/manifest-callback`, and signed `/github/webhook` intake backed by Cloudflare KV. A private staging GitHub App, `ai-saas-guard-hosted`, is installed on `zr9959/ai-saas-guard` with selected-repository access and the first-slice permission contract. The Worker verifies signatures, stores compact pull request identity records, exchanges a scoped installation token, fetches PR file metadata from GitHub, classifies PR-risk hotspots, and publishes a bounded selected-repository hosted check with a review queue and manual proof prompt. Signed installation deletion and repository removal events delete matching compact records. Current deployed evidence is tracked in [docs/hosted-operations-evidence.md](docs/hosted-operations-evidence.md): health, signed webhook delivery, compact KV records, cleanup, and Check Run publication pass in staging. The Cloudflare Worker still does not run a full source checkout scan worker or store raw webhook payloads, PR title/body text, raw diffs, source, secrets, checkout paths, or installation tokens.
369
369
 
370
- The next hosted source-checkout step is intentionally narrow: deploy the existing read-only checkout worker behind the same selected-repository identity, keep the fixed `pr-risk --json` command, write only compact findings to the Check Run, and require deployed cleanup/log-boundary/rollback evidence before broader trial use. The v0.41 contract layer adds `createHostedSourceCheckoutTrialPlan` and `createHostedSourceCheckoutEvidence` so checkout start/end, token removal, CLI start/end, compact report write, Check Run write, and cleanup status can be reviewed before public exposure.
370
+ The next hosted source-checkout step is intentionally narrow: deploy the existing read-only checkout worker behind the same selected-repository identity, keep the fixed `pr-risk --json` command, write only compact findings to the Check Run, and require deployed cleanup/log-boundary/rollback evidence before broader trial use. The hosted worker export includes `createHostedSourceCheckoutTrialPlan`, `createHostedSourceCheckoutEvidence`, and `evaluateHostedSourceCheckoutTrialGate` so Phase 3 has one machine-checkable gate for checkout start/end, token removal, CLI start/end, compact report write, Check Run write, cleanup status, live smoke, rollback, monitoring, and incident-owner proof before Phase 4 beta.
371
371
 
372
372
  Hosted install and privacy details are summarized in [docs/hosted-install-privacy.md](docs/hosted-install-privacy.md): selected-repository permissions, supported events, Check Run data boundaries, uninstall cleanup, and why the local CLI remains the private/offline path.
373
373
 
@@ -423,7 +423,7 @@ Use `suppressions` for narrower false-positive handling when one rule is noisy o
423
423
 
424
424
  ## GitHub Action
425
425
 
426
- The repo includes a composite Action. Use `v0` for the latest compatible pre-1.0 Action, a specific release tag such as `v0.41.0` for controlled upgrades, or pin a reviewed commit SHA for stricter supply-chain control:
426
+ The repo includes a composite Action. Use `v0` for the latest compatible pre-1.0 Action, a specific release tag such as `v0.42.0` for controlled upgrades, or pin a reviewed commit SHA for stricter supply-chain control:
427
427
 
428
428
  ```yaml
429
429
  name: ai-saas-guard
@@ -127,6 +127,41 @@ export interface HostedReadOnlyCheckoutScanGate {
127
127
  claimsCompleteHostedSaas: false;
128
128
  };
129
129
  }
130
+ export interface HostedSourceCheckoutTrialGateInput extends HostedSourceCheckoutTrialPlanInput, Omit<HostedSourceCheckoutEvidenceInput, "requestedAt" | "rawSource" | "rawDiff" | "checkoutPath" | "installationToken">, Omit<HostedReadOnlyCheckoutScanGateInput, "requestedAt" | "jobKey" | "summaryCounts" | "compactFindingCount" | "rawSource" | "rawDiff" | "checkoutPath" | "installationToken"> {
131
+ liveSmokePassed: boolean;
132
+ rollbackTested: boolean;
133
+ monitoringEvidence: boolean;
134
+ incidentOwnerRecorded: boolean;
135
+ rawSource?: string;
136
+ rawDiff?: string;
137
+ checkoutPath?: string;
138
+ installationToken?: string;
139
+ }
140
+ export interface HostedSourceCheckoutTrialGate {
141
+ phase: "phase_3_hosted_source_checkout_trial";
142
+ readyForPhase4Beta: boolean;
143
+ blockedReasons: string[];
144
+ requestedAt: string;
145
+ repositoryFullName: string;
146
+ jobKey: string;
147
+ plan: HostedSourceCheckoutTrialPlan;
148
+ evidence: HostedSourceCheckoutEvidence;
149
+ scanGate: HostedReadOnlyCheckoutScanGate;
150
+ operatorProof: {
151
+ liveSmokePassed: boolean;
152
+ rollbackTested: boolean;
153
+ monitoringEvidence: boolean;
154
+ incidentOwnerRecorded: boolean;
155
+ };
156
+ nextAction: string;
157
+ privacy: {
158
+ includesRawSource: false;
159
+ includesRawDiffs: false;
160
+ includesPrivateCheckoutPath: false;
161
+ includesInstallationToken: false;
162
+ claimsPublicHostedScanner: false;
163
+ };
164
+ }
130
165
  export type HostedReadOnlyCheckoutScanSafeReason = "invalid_worker_plan" | "invalid_repository_full_name" | "invalid_clone_base_url" | "missing_installation_token" | "git_init_failed" | "git_remote_add_failed" | "git_fetch_head_failed" | "git_fetch_base_failed" | "git_checkout_failed" | "cli_scan_failed" | "invalid_cli_output" | "cleanup_failed";
131
166
  export declare class HostedReadOnlyCheckoutScanError extends Error {
132
167
  readonly safeReason: HostedReadOnlyCheckoutScanSafeReason;
@@ -144,4 +179,5 @@ export declare function createHostedReadOnlyCheckoutScanRunner(options: HostedRe
144
179
  export declare function createHostedSourceCheckoutTrialPlan(input: HostedSourceCheckoutTrialPlanInput): HostedSourceCheckoutTrialPlan;
145
180
  export declare function createHostedSourceCheckoutEvidence(input: HostedSourceCheckoutEvidenceInput): HostedSourceCheckoutEvidence;
146
181
  export declare function evaluateHostedReadOnlyCheckoutScanGate(input: HostedReadOnlyCheckoutScanGateInput): HostedReadOnlyCheckoutScanGate;
182
+ export declare function evaluateHostedSourceCheckoutTrialGate(input: HostedSourceCheckoutTrialGateInput): HostedSourceCheckoutTrialGate;
147
183
  export declare function runHostedReadOnlyCheckoutScan(input: HostedServiceScanRunnerInput, options: HostedReadOnlyCheckoutScanRunnerOptions): Promise<HostedServiceScanRunnerResult>;
@@ -173,6 +173,72 @@ export function evaluateHostedReadOnlyCheckoutScanGate(input) {
173
173
  }
174
174
  };
175
175
  }
176
+ export function evaluateHostedSourceCheckoutTrialGate(input) {
177
+ const plan = createHostedSourceCheckoutTrialPlan(input);
178
+ const evidence = createHostedSourceCheckoutEvidence({
179
+ requestedAt: input.requestedAt,
180
+ jobKey: input.jobKey,
181
+ stages: input.stages,
182
+ summaryCounts: input.summaryCounts,
183
+ compactFindingCount: input.compactFindingCount,
184
+ cleanupStatus: input.cleanupStatus,
185
+ rawSource: input.rawSource,
186
+ rawDiff: input.rawDiff,
187
+ checkoutPath: input.checkoutPath,
188
+ installationToken: input.installationToken
189
+ });
190
+ const scanGate = evaluateHostedReadOnlyCheckoutScanGate({
191
+ requestedAt: input.requestedAt,
192
+ jobKey: input.jobKey,
193
+ commandStages: input.commandStages,
194
+ summaryCounts: input.summaryCounts,
195
+ compactFindingCount: input.compactFindingCount,
196
+ compactReportStored: input.compactReportStored,
197
+ checkRunPublished: input.checkRunPublished,
198
+ checkoutDeleted: input.checkoutDeleted,
199
+ tokenRemovedBeforeCli: input.tokenRemovedBeforeCli,
200
+ maxOutputBytes: input.maxOutputBytes,
201
+ timeoutMs: input.timeoutMs,
202
+ rawSource: input.rawSource,
203
+ rawDiff: input.rawDiff,
204
+ checkoutPath: input.checkoutPath,
205
+ installationToken: input.installationToken
206
+ });
207
+ const operatorBlockedReasons = operatorProofBlockedReasons(input);
208
+ const blockedReasons = [
209
+ ...plan.blockedReasons,
210
+ ...evidence.blockedReasons,
211
+ ...scanGate.blockedReasons,
212
+ ...operatorBlockedReasons
213
+ ];
214
+ return {
215
+ phase: "phase_3_hosted_source_checkout_trial",
216
+ readyForPhase4Beta: blockedReasons.length === 0,
217
+ blockedReasons,
218
+ requestedAt: input.requestedAt,
219
+ repositoryFullName: input.repositoryFullName,
220
+ jobKey: input.jobKey,
221
+ plan,
222
+ evidence,
223
+ scanGate,
224
+ operatorProof: {
225
+ liveSmokePassed: input.liveSmokePassed,
226
+ rollbackTested: input.rollbackTested,
227
+ monitoringEvidence: input.monitoringEvidence,
228
+ incidentOwnerRecorded: input.incidentOwnerRecorded
229
+ },
230
+ nextAction: blockedReasons.length === 0
231
+ ? "Phase 3 is closed for the selected-repository trial. Continue to Phase 4 beta only with the same privacy boundary."
232
+ : "Do not open hosted beta. Resolve the blocked reasons and rerun the selected-repository source-checkout trial gate.",
233
+ privacy: {
234
+ includesRawSource: false,
235
+ includesRawDiffs: false,
236
+ includesPrivateCheckoutPath: false,
237
+ includesInstallationToken: false,
238
+ claimsPublicHostedScanner: false
239
+ }
240
+ };
241
+ }
176
242
  export async function runHostedReadOnlyCheckoutScan(input, options) {
177
243
  const { plan } = input;
178
244
  const { checkout, cli } = plan;
@@ -339,6 +405,18 @@ function isTrustedFixedReadOnlyPlan(input) {
339
405
  function arraysEqual(left, right) {
340
406
  return left.length === right.length && left.every((value, index) => value === right[index]);
341
407
  }
408
+ function operatorProofBlockedReasons(input) {
409
+ const reasons = [];
410
+ if (!input.liveSmokePassed)
411
+ reasons.push("live_smoke_missing");
412
+ if (!input.rollbackTested)
413
+ reasons.push("rollback_test_missing");
414
+ if (!input.monitoringEvidence)
415
+ reasons.push("monitoring_evidence_missing");
416
+ if (!input.incidentOwnerRecorded)
417
+ reasons.push("incident_owner_missing");
418
+ return reasons;
419
+ }
342
420
  function compactFinding(value) {
343
421
  if (!isRecord(value))
344
422
  return [];
@@ -213,18 +213,18 @@ node dist/cli.js scan --root /path/to/your-saas
213
213
 
214
214
  这个仓库是公开 GitHub 仓库。
215
215
 
216
- CLI 已发布到 npm:`ai-saas-guard@0.41.0`。GitHub Action 支持 `v0` 浮动标签,也支持固定版本标签,例如 `v0.41.0`。
216
+ CLI 已发布到 npm:`ai-saas-guard@0.42.0`。GitHub Action 支持 `v0` 浮动标签,也支持固定版本标签,例如 `v0.42.0`。
217
217
 
218
218
  | 模块 | 状态 |
219
219
  | --- | --- |
220
220
  | 公开 GitHub 仓库 | 已可用 |
221
- | npm CLI | `ai-saas-guard@0.41.0` |
222
- | GitHub Action | `zr9959/ai-saas-guard@v0` 或固定标签 `v0.41.0` |
221
+ | npm CLI | `ai-saas-guard@0.42.0` |
222
+ | GitHub Action | `zr9959/ai-saas-guard@v0` 或固定标签 `v0.42.0` |
223
223
  | 输出格式 | 上线决策队列、短 summary、Terminal、JSON、SARIF 和 PR markdown |
224
224
  | 项目配置 | `.ai-saas-guard.json` 支持规则开关、severity 覆盖、suppressions 和 fail threshold |
225
225
  | 隐私模型 | 本地优先、只读扫描、不调用 LLM、不上传代码 |
226
- | 当前版本 | `0.41.0` 增加 source-checkout trial plan/evidence 契约,压缩 hosted Check Run reviewer 输出,并记录下一阶段 hosted source-checkout gate |
227
- | Action 标签 | `v0.41.0`、`v0` |
226
+ | 当前版本 | `0.42.0` 增加统一的 Phase 3 source-checkout trial gate,把 plan、stage evidence、scan proof、live smoke、rollback、monitoring incident owner proof 合并成进入 hosted beta 前的机器可判定门槛 |
227
+ | Action 标签 | `v0.42.0`、`v0` |
228
228
  | npm 发布 | GitHub Actions Trusted Publisher/OIDC,无需长期 npm token |
229
229
  | 仓库可信度加固 | 严格 branch protection、Dependabot、CodeQL、fast-check fuzzing、signed release provenance assets、private vulnerability reporting、secret scanning 和 push protection |
230
230
  | Cloudflare hosted ingress | 已部署到 `https://ai-saas-guard-hosted.zr9959.workers.dev`;安装和隐私说明见 [hosted-install-privacy.md](hosted-install-privacy.md);提供 `/github/app/install-info`,签名 GitHub App webhook delivery、compact Check Run 和 installation cleanup staging smoke 已通过 |
@@ -383,7 +383,7 @@ GitHub Marketplace wrapper 决策见 [docs/github-marketplace-wrapper-decision.m
383
383
 
384
384
  当前仓库已经包含未来 Hosted GitHub App 的设计文档、纯契约测试、第一个真实 Cloudflare hosted ingress,以及 Node/container read-only checkout scan runner。私有 staging GitHub App `ai-saas-guard-hosted` 已安装到 `zr9959/ai-saas-guard`,Cloudflare 已配置所需的云端凭据绑定。Worker 代码已经能接收签名 webhook、写入 KV 队列、换取 scoped installation token、读取 GitHub PR file metadata、做 compact PR-risk classification,并发布有长度上限的 selected-repository Check Run summary;`/github/app/install-info` 会返回公开安全的安装说明、权限、事件、隐私边界和卸载说明。签名 installation deletion 和 repository removal 事件会删除匹配的 compact records。当前端到端 GitHub App webhook delivery smoke 已通过,证据记录在 [docs/hosted-operations-evidence.md](hosted-operations-evidence.md)。Cloudflare ingress 本身仍不是完整 source checkout scan worker。
385
385
 
386
- 下一步 hosted source checkout 仍然要保持窄边界:把现有 read-only checkout worker 放到同一个 selected-repository identity 后面,继续固定 `pr-risk --json` 命令,只把 compact findings 写入 Check Run,并在扩大 trial 前要求 deployed cleanup、log-boundary 和 rollback evidence。v0.41 契约层新增 `createHostedSourceCheckoutTrialPlan` 和 `createHostedSourceCheckoutEvidence`,用于在公开暴露前检查 checkout start/end、token removal、CLI start/end、compact report write、Check Run write 和 cleanup status
386
+ 下一步 hosted source checkout 仍然要保持窄边界:把现有 read-only checkout worker 放到同一个 selected-repository identity 后面,继续固定 `pr-risk --json` 命令,只把 compact findings 写入 Check Run,并在扩大 trial 前要求 deployed cleanup、log-boundary 和 rollback evidence。hosted worker export 现在包含 `createHostedSourceCheckoutTrialPlan`、`createHostedSourceCheckoutEvidence` 和 `evaluateHostedSourceCheckoutTrialGate`,用于在进入 Phase 4 beta 前统一检查 checkout start/end、token removal、CLI start/end、compact report write、Check Run write、cleanup status、live smoke、rollback、monitoring incident owner proof
387
387
 
388
388
  Hosted 安装、权限和隐私边界见 [hosted-install-privacy.md](hosted-install-privacy.md):selected-repository 权限、支持的 GitHub 事件、Check Run 数据边界、卸载清理,以及为什么本地 CLI 仍然是私有/离线路径。
389
389
 
@@ -134,6 +134,6 @@ It does not return:
134
134
 
135
135
  ## Current Status
136
136
 
137
- The repository can now instantiate a Node/container hosted app skeleton, route signed webhooks into the hosted service runtime, process one worker tick through adapters, compose the real read-only checkout scan runner behind a token-provider boundary, expose clamped worker safety budgets, and validate provider adapter references before deployment.
137
+ The repository can now instantiate a Node/container hosted app skeleton, route signed webhooks into the hosted service runtime, process one worker tick through adapters, compose the real read-only checkout scan runner behind a token-provider boundary, expose clamped worker safety budgets, validate provider adapter references before deployment, and evaluate one Phase 3 source-checkout trial gate through `evaluateHostedSourceCheckoutTrialGate`.
138
138
 
139
- A public hosted environment still requires actual platform infrastructure, a public HTTPS webhook URL, platform secrets, durable queue/storage, worker sandboxing, GitHub Checks API credentials at runtime, monitoring, rollback, incident-response evidence, and the hosted operational release gate. Use [hosted-staging-deployment.md](hosted-staging-deployment.md) to plan and block staging exposure until those provider references and evidence exist.
139
+ A public hosted environment still requires actual platform infrastructure, a public HTTPS webhook URL, platform secrets, durable queue/storage, worker sandboxing, GitHub Checks API credentials at runtime, monitoring, rollback, incident-response evidence, and a passing Phase 3 gate. Use [hosted-staging-deployment.md](hosted-staging-deployment.md) to plan and block staging exposure until those provider references and evidence exist.
@@ -179,6 +179,19 @@ The v0.41 source-checkout trial boundary is executable as a pure contract before
179
179
 
180
180
  The evidence object must stay compact and privacy-safe. It may contain job key, stage IDs, timestamps, summary counts, compact finding count, cleanup status, and safe blocked reasons. It must not include source, diffs, checkout paths, installation tokens, PR-authored commands, private URLs, or low-level filesystem errors.
181
181
 
182
+ ### Phase 3 Source Checkout Trial Gate
183
+
184
+ The v0.42 hosted worker export adds `evaluateHostedSourceCheckoutTrialGate`. This is the single gate for closing Phase 3 and deciding whether the project may move toward Phase 4 hosted beta.
185
+
186
+ The gate combines:
187
+
188
+ - source-checkout trial plan checks from `createHostedSourceCheckoutTrialPlan`
189
+ - stage evidence checks from `createHostedSourceCheckoutEvidence`
190
+ - read-only checkout scan checks from `evaluateHostedReadOnlyCheckoutScanGate`
191
+ - operator proof for live smoke, rollback, monitoring evidence, and incident owner recording
192
+
193
+ It returns `readyForPhase4Beta: true` only when all four layers pass. Otherwise it returns safe blocked reasons and the next action: do not open hosted beta until the missing proof is rerun. The response must remain compact and privacy-safe: no raw source, raw diffs, checkout paths, installation tokens, public hosted scanner claim, private URLs, or PR-authored commands.
194
+
182
195
  ### Log Boundary Evidence
183
196
 
184
197
  Before exposure, sample ingress, queue, worker, report, and Check Run logs for the release candidate. The sample may contain scan key, installation ID, repository ID, PR number, head SHA, scanner version, duration, summary counts, error class, and cleanup status.
@@ -10,6 +10,10 @@ Recorded on 2026-05-25 from the deployed Cloudflare Worker plus temporary GitHub
10
10
 
11
11
  | Check | Evidence | Result |
12
12
  | --- | --- | --- |
13
+ | Cloudflare Worker health, v0.42.0 | `GET https://ai-saas-guard-hosted.zr9959.workers.dev/healthz` returned `ok: true`, routes including `/github/app/install-info`, `checkRunPublisher: "configured"`, `scannerVersion: "0.42.0"`, and all privacy flags set to false for raw payloads, PR text, source, diffs, secrets, customer payloads, checkout paths, and installation tokens | Passed |
14
+ | Public install guidance, v0.42.0 | `GET https://ai-saas-guard-hosted.zr9959.workers.dev/github/app/install-info` returned the `ai-saas-guard-hosted` install URL, selected-repository boundary wording, first-slice permissions `checks: write`, `contents: read`, `metadata: read`, `pull_requests: read`, subscribed events `pull_request`, `installation`, and `installation_repositories`, uninstall cleanup wording, `scannerVersion: "0.42.0"`, and no private keys, webhook secrets, installation tokens, source, diffs, or customer payloads | Passed |
15
+ | Deployed Worker version, v0.42.0 | `wrangler deploy` uploaded 38.57 KiB / gzip 9.86 KiB and deployed version `6de0811e-11bf-46a6-9b7b-cbecda409695` at `2026-05-25T13:40:11Z` verification time | Passed |
16
+ | Real hosted PR smoke, v0.42.0 | `node scripts/hosted-pr-smoke.mjs --evidence-file /tmp/ai-saas-guard-hosted-smoke-v0.42.json` opened temporary PR `#89`, waited for Check Run `77721238202` on head SHA `66dfffde2ffa1a563ebc45fe7b22468d2f060e22`, received conclusion `success`, closed the PR, restored the original branch, deleted the local branch, and deleted 9 staging KV records with `remainingSmokeKeys: 0`; `gh pr view 89` returned `state: "CLOSED"`, `git ls-remote --heads origin codex/hosted-smoke-20260525134106` returned no remote branch, and `wrangler kv key list --namespace-id fa5344fbd7944de6a776bf8731d58460 --remote` returned `[]` after cleanup | Passed |
13
17
  | Cloudflare Worker health, v0.41.0 | `GET https://ai-saas-guard-hosted.zr9959.workers.dev/healthz` returned `ok: true`, routes including `/github/app/install-info`, `checkRunPublisher: "configured"`, `scannerVersion: "0.41.0"`, and all privacy flags set to false for raw payloads, PR text, source, diffs, secrets, customer payloads, checkout paths, and installation tokens | Passed |
14
18
  | Public install guidance, v0.41.0 | `GET https://ai-saas-guard-hosted.zr9959.workers.dev/github/app/install-info` returned the `ai-saas-guard-hosted` install URL, selected-repository boundary wording, first-slice permissions `checks: write`, `contents: read`, `metadata: read`, `pull_requests: read`, subscribed events `pull_request`, `installation`, and `installation_repositories`, uninstall cleanup wording, `scannerVersion: "0.41.0"`, and no private keys, webhook secrets, installation tokens, source, diffs, or customer payloads | Passed |
15
19
  | Deployed Worker version, v0.41.0 | `wrangler deploy` uploaded 38.57 KiB / gzip 9.86 KiB and deployed version `fb0b4726-ac75-4577-942b-fdeed7752979` at `2026-05-25T13:22:28Z` verification time | Passed |
@@ -5,11 +5,11 @@
5
5
  ## Current State
6
6
 
7
7
  - Package name: `ai-saas-guard`
8
- - Current published version: `0.41.0`
8
+ - Current published version: `0.42.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.41.0`
12
+ - GitHub Release: `v0.42.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.41.0`.
21
+ 1. Create and review a release tag such as `v0.42.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.
@@ -23,7 +23,7 @@ This Worker is a real hosted ingress with first-slice Check Run publishing code,
23
23
  - `HOSTED_EVENTS`: Cloudflare KV namespace for compact delivery and queued scan records.
24
24
  - `WEBHOOK_SECRET`: Worker secret matching the GitHub App webhook secret.
25
25
  - `GITHUB_APP_PRIVATE_KEY`: Worker secret for the staging GitHub App private key, used only in memory to sign short-lived GitHub App JWTs.
26
- - `SCANNER_VERSION`: public version string, currently `0.41.0`.
26
+ - `SCANNER_VERSION`: public version string, currently `0.42.0`.
27
27
  - `GITHUB_APP_ID`, `GITHUB_APP_SLUG`, `GITHUB_APP_INSTALLATION_ID`: public staging identifiers for the private GitHub App installation.
28
28
 
29
29
  ## Deployment
@@ -7,7 +7,7 @@
7
7
  "enabled": true
8
8
  },
9
9
  "vars": {
10
- "SCANNER_VERSION": "0.41.0",
10
+ "SCANNER_VERSION": "0.42.0",
11
11
  "GITHUB_APP_ID": "3834787",
12
12
  "GITHUB_APP_SLUG": "ai-saas-guard-hosted",
13
13
  "GITHUB_APP_INSTALLATION_ID": "135085075"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-saas-guard",
3
- "version": "0.41.0",
3
+ "version": "0.42.0",
4
4
  "description": "Local-first CLI that catches launch blockers in AI-built Next.js/Supabase/Stripe SaaS apps.",
5
5
  "readmeFilename": "README.md",
6
6
  "type": "module",