memento-mori-jester 0.1.84 → 0.1.85

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/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to Memento Mori Jester are tracked here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.1.85
8
+
9
+ - Added `examples/ci/adoption-smoke.yml`, a read-only GitHub Actions recipe for checking `doctor`, `summary`, and packaged framework tuning cookbook commands in real repos.
10
+ - Added `npm run ci:adoption:check` to keep the adoption smoke workflow and docs aligned with current commands and safety expectations.
11
+ - Updated README, GitHub Actions docs, CI examples, release docs, production-readiness docs, roadmap, and release notes for the new adoption path.
12
+
7
13
  ## 0.1.84
8
14
 
9
15
  - Added `npm run framework:tuning:doctor`, a consumer-style smoke check that generates temporary preset configs and runs every cookbook `jester tune <rule-id> --json` command through the built CLI.
package/README.md CHANGED
@@ -68,6 +68,8 @@ npx -y memento-mori-jester@latest github-action --write
68
68
 
69
69
  The generated workflow uploads SARIF for code scanning and adds a readable Jester summary to the GitHub Actions run.
70
70
 
71
+ For a first read-only CI smoke, copy [examples/ci/adoption-smoke.yml](examples/ci/adoption-smoke.yml). It runs `doctor`, `summary --kind command "git reset --hard"`, and the published package's `framework:tuning:doctor` without requiring code-scanning permissions.
72
+
71
73
  Expected vibe:
72
74
 
73
75
  ```text
@@ -436,6 +438,7 @@ More setup examples:
436
438
  - [Preset Example Packs](examples/presets)
437
439
  - [Review Fixtures](examples/fixtures)
438
440
  - [Framework CI Examples](examples/ci)
441
+ - [Adoption Smoke CI](examples/ci/adoption-smoke.yml)
439
442
  - [Security Policy](SECURITY.md)
440
443
  - [Maintainer Triage](docs/MAINTAINER_TRIAGE.md)
441
444
  - [Changelog](CHANGELOG.md)
@@ -453,6 +456,7 @@ Preset example packs:
453
456
 
454
457
  Framework CI examples:
455
458
 
459
+ - [Adoption Smoke CI](examples/ci/adoption-smoke.yml)
456
460
  - [Next.js CI](examples/ci/nextjs.yml)
457
461
  - [Vite React CI](examples/ci/vite-react.yml)
458
462
  - [Express API CI](examples/ci/express-api.yml)
package/ROADMAP.md CHANGED
@@ -6,6 +6,7 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
6
6
 
7
7
  ## Recently Shipped
8
8
 
9
+ - Adoption smoke CI example in v0.1.85, giving real repos a read-only workflow for `doctor`, `summary`, and packaged framework tuning checks.
9
10
  - Framework tuning doctor in v0.1.84, proving cookbook recipes execute through the built CLI with generated preset configs before release.
10
11
  - Framework tuning cookbook in v0.1.83, adding checked copy-paste recipes and a machine-readable JSON map for stack-shaped noisy-rule reports.
11
12
  - Framework tuning examples and quiet-pass fixture curation in v0.1.82, adding six safe real-world examples plus a guide for framework-shaped noisy-rule reports.
@@ -20,6 +20,21 @@ The generated workflow reviews pull request diffs, writes `jester.sarif`, upload
20
20
 
21
21
  This repository dogfoods that generated workflow in [.github/workflows/memento-mori.yml](../.github/workflows/memento-mori.yml).
22
22
 
23
+ ## Adoption Smoke Workflow
24
+
25
+ Use [examples/ci/adoption-smoke.yml](../examples/ci/adoption-smoke.yml) when you want a first read-only CI check before enabling SARIF/code scanning.
26
+
27
+ It runs:
28
+
29
+ ```powershell
30
+ npx -y memento-mori-jester@latest doctor
31
+ npx -y memento-mori-jester@latest summary --kind command "git reset --hard"
32
+ npm run framework:tuning:check
33
+ npm run framework:tuning:doctor
34
+ ```
35
+
36
+ The workflow downloads the published npm tarball into a temporary directory before running the framework tuning checks, so it verifies package contents rather than relying on this repository checkout.
37
+
23
38
  ## Composite Action
24
39
 
25
40
  This repo can be used directly as a GitHub Action:
@@ -26,6 +26,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
26
26
  - Action inputs cover `fail-on`, `subject`, `config`, `no-config`, `format`, `output-file`, and `summary`.
27
27
  - SARIF output and GitHub step summaries remain separate so users can enable readable summaries without new GitHub write permissions.
28
28
  - Example workflows in `examples/` and `examples/ci/` stay aligned with the action shape.
29
+ - `examples/ci/adoption-smoke.yml` gives new repos a read-only smoke workflow for `doctor`, `summary`, and packaged framework tuning checks before code scanning is enabled.
29
30
 
30
31
  ## MCP And Agent Setup
31
32
 
@@ -79,6 +80,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
79
80
  - fixture coverage reports are wired into `npm test`.
80
81
  - framework tuning cookbook checks are wired into `npm test`.
81
82
  - framework tuning cookbook doctor checks are wired into `npm test`.
83
+ - CI adoption example checks are wired into `npm test`.
82
84
  - promo freshness checks are wired into `npm test`.
83
85
  - site checks are wired into `npm test`.
84
86
 
package/docs/RELEASE.md CHANGED
@@ -14,6 +14,7 @@ npm.cmd run fixtures:report -- --json
14
14
  npm.cmd run fixtures:report -- --markdown
15
15
  npm.cmd run framework:tuning:check
16
16
  npm.cmd run framework:tuning:doctor
17
+ npm.cmd run ci:adoption:check
17
18
  npm.cmd run promo:card:check
18
19
  npm.cmd run promo:check
19
20
  npm.cmd run site:check
@@ -26,7 +27,7 @@ Move the current changelog bullets into a matching version section and add `docs
26
27
  ## 2. Tag And Push
27
28
 
28
29
  ```powershell
29
- git add package.json package-lock.json CHANGELOG.md docs/RELEASE_NOTES_v0.1.x.md docs/PRODUCTION_READINESS.md docs/MAINTAINER_TRIAGE.md docs/FRAMEWORK_TUNING.md examples/tuning scripts/check-framework-tuning.mjs scripts/doctor-framework-tuning.mjs SECURITY.md .github/ISSUE_TEMPLATE
30
+ git add package.json package-lock.json CHANGELOG.md docs/RELEASE_NOTES_v0.1.x.md docs/PRODUCTION_READINESS.md docs/MAINTAINER_TRIAGE.md docs/FRAMEWORK_TUNING.md docs/GITHUB_ACTIONS.md examples/ci examples/tuning scripts/check-ci-adoption.mjs scripts/check-framework-tuning.mjs scripts/doctor-framework-tuning.mjs SECURITY.md .github/ISSUE_TEMPLATE
30
31
  git commit -m "Release v0.1.x"
31
32
  git tag -a v0.1.x -m "Memento Mori Jester v0.1.x"
32
33
  git push origin main
@@ -0,0 +1,54 @@
1
+ # Memento Mori Jester v0.1.85
2
+
3
+ ## Summary
4
+
5
+ This release adds a narrow adoption smoke workflow for real repos. It gives teams a read-only GitHub Actions recipe that checks the package health, proves a summary review path, and verifies the published framework tuning cookbook scripts before they enable heavier code-scanning workflows.
6
+
7
+ ## What Changed
8
+
9
+ - Added `examples/ci/adoption-smoke.yml`.
10
+ - Added `scripts/check-ci-adoption.mjs`.
11
+ - Added `npm run ci:adoption:check`.
12
+ - Wired the adoption checker into `npm test` and production-readiness checks.
13
+ - Updated README, GitHub Actions docs, CI example docs, release docs, production-readiness docs, roadmap, and changelog.
14
+
15
+ ## Public Interface
16
+
17
+ - No CLI command changes.
18
+ - No MCP tool changes.
19
+ - No config schema changes.
20
+ - No review rule, scoring, matching, or verdict behavior changes.
21
+ - No GitHub Action input changes.
22
+ - New maintainer/package script: `npm run ci:adoption:check`.
23
+ - New checked example workflow: `examples/ci/adoption-smoke.yml`.
24
+
25
+ ## Release Validation
26
+
27
+ ```powershell
28
+ npm.cmd test
29
+ npm.cmd run demo:svg:check
30
+ npm.cmd run promo:card:check
31
+ npm.cmd run promo:check
32
+ npm.cmd run framework:tuning:check
33
+ npm.cmd run framework:tuning:doctor
34
+ npm.cmd run ci:adoption:check
35
+ npm.cmd run fixtures:report
36
+ npm.cmd run fixtures:report -- --json
37
+ npm.cmd run fixtures:report -- --markdown
38
+ npm.cmd run site:check
39
+ npm.cmd run pack:dry
40
+ git diff --check
41
+ node .\dist\cli.js summary --kind command "git reset --hard"
42
+ node .\dist\cli.js tune coverage --no-config
43
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.85 adoption smoke CI"
44
+ ```
45
+
46
+ Expected:
47
+
48
+ - `ci:adoption:check` passes for `examples/ci/adoption-smoke.yml`,
49
+ - `framework:tuning:doctor` still runs 10 executable tune commands,
50
+ - fixture report still shows `Fixtures: 222`,
51
+ - no thin rule coverage,
52
+ - no preset/kind gaps,
53
+ - no rules without quiet-pass coverage,
54
+ - GitHub Release and npm Publish complete from the `v0.1.85` tag.
@@ -13,8 +13,15 @@ npx -y memento-mori-jester@latest bootstrap --preset web
13
13
 
14
14
  Then copy the workflow that best matches your stack into `.github/workflows/memento-mori.yml`.
15
15
 
16
+ If you want a first CI smoke before enabling code scanning, copy [Adoption Smoke](adoption-smoke.yml). It runs:
17
+
18
+ - `npx -y memento-mori-jester@latest doctor`
19
+ - `npx -y memento-mori-jester@latest summary --kind command "git reset --hard"`
20
+ - `npm run framework:tuning:check` and `npm run framework:tuning:doctor` from the published package tarball
21
+
16
22
  ## Workflows
17
23
 
24
+ - [Adoption Smoke](adoption-smoke.yml): read-only setup check for doctor, summary, and framework tuning cookbook commands.
18
25
  - [Next.js](nextjs.yml): app-router, middleware, redirects, public env, and browser-rendered UI.
19
26
  - [Vite React](vite-react.yml): browser storage, public config, redirects, and unsafe HTML surfaces.
20
27
  - [Express API](express-api.yml): CORS, auth bypasses, raw SQL, webhooks, and migrations.
@@ -25,5 +32,6 @@ Then copy the workflow that best matches your stack into `.github/workflows/meme
25
32
  ## Notes
26
33
 
27
34
  - Workflows upload SARIF and add a readable Actions job summary.
35
+ - The adoption smoke workflow is read-only and does not upload SARIF.
28
36
  - Most stacks fail CI only on `BLOCK`.
29
37
  - The Terraform/Kubernetes example uses `fail-on: caution` because infra repos often want lower tolerance for risky changes.
@@ -0,0 +1,42 @@
1
+ name: Memento Mori Jester Adoption Smoke
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ adoption-smoke:
13
+ name: Adoption smoke
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 10
16
+
17
+ steps:
18
+ - name: Checkout
19
+ uses: actions/checkout@v6
20
+
21
+ - name: Setup Node
22
+ uses: actions/setup-node@v6
23
+ with:
24
+ node-version: 24
25
+
26
+ - name: Jester doctor
27
+ run: npx -y memento-mori-jester@latest doctor
28
+
29
+ - name: Command summary smoke
30
+ run: npx -y memento-mori-jester@latest summary --kind command "git reset --hard"
31
+
32
+ - name: Framework tuning cookbook smoke
33
+ shell: bash
34
+ run: |
35
+ set -euo pipefail
36
+ workdir="$(mktemp -d)"
37
+ trap 'rm -rf "$workdir"' EXIT
38
+ npm pack memento-mori-jester@latest --pack-destination "$workdir" --silent
39
+ tar -xzf "$workdir"/memento-mori-jester-*.tgz -C "$workdir"
40
+ npm install --omit=dev --ignore-scripts --prefix "$workdir/package"
41
+ npm run framework:tuning:check --prefix "$workdir/package"
42
+ npm run framework:tuning:doctor --prefix "$workdir/package"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mori-jester",
3
- "version": "0.1.84",
3
+ "version": "0.1.85",
4
4
  "description": "A local court-jester sidecar for AI coding agents: review plans, commands, diffs, and final claims before they get too pleased with themselves.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -40,7 +40,7 @@
40
40
  "build": "tsc -p tsconfig.json",
41
41
  "start": "node dist/server.js",
42
42
  "start:mcp": "node dist/server.js",
43
- "test": "npm run build && node scripts/run-tests.mjs && npm run fixtures:check && npm run fixtures:report && npm run framework:tuning:check && npm run framework:tuning:doctor && npm run promo:check && npm run site:check && npm run production:check",
43
+ "test": "npm run build && node scripts/run-tests.mjs && npm run fixtures:check && npm run fixtures:report && npm run framework:tuning:check && npm run framework:tuning:doctor && npm run ci:adoption:check && npm run promo:check && npm run site:check && npm run production:check",
44
44
  "doctor": "node dist/cli.js doctor",
45
45
  "demo:svg": "node scripts/render-demo-svg.mjs",
46
46
  "demo:svg:check": "node scripts/render-demo-svg.mjs --check",
@@ -48,6 +48,7 @@
48
48
  "fixtures:report": "node scripts/report-fixtures.mjs",
49
49
  "framework:tuning:check": "node scripts/check-framework-tuning.mjs",
50
50
  "framework:tuning:doctor": "node scripts/doctor-framework-tuning.mjs",
51
+ "ci:adoption:check": "node scripts/check-ci-adoption.mjs",
51
52
  "promo:card": "node scripts/render-social-card.mjs",
52
53
  "promo:card:check": "node scripts/render-social-card.mjs --check",
53
54
  "promo:check": "node scripts/check-promo-freshness.mjs",
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+
5
+ const root = process.cwd();
6
+ const failures = [];
7
+ const workflowPath = "examples/ci/adoption-smoke.yml";
8
+ const workflow = read(workflowPath);
9
+ const examplesReadme = read("examples/ci/README.md");
10
+ const githubActionsDocs = read("docs/GITHUB_ACTIONS.md");
11
+ const readme = read("README.md");
12
+
13
+ const unsafeContentPatterns = [
14
+ { name: "private key block", pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
15
+ { name: "OpenAI-looking secret key", pattern: /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/ },
16
+ { name: "Anthropic-looking secret key", pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/ },
17
+ { name: "GitHub-looking token", pattern: /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/ },
18
+ { name: "AWS access key id", pattern: /\bAKIA[0-9A-Z]{16}\b/ },
19
+ { name: "Slack-looking token", pattern: /\bxox[baprs]-[A-Za-z0-9-]{20,}\b/ },
20
+ { name: "absolute Unix home path", pattern: /(?:^|[\s"'`])\/(?:Users|home)\/[A-Za-z0-9._-]+/ },
21
+ { name: "absolute Windows user path", pattern: /[A-Za-z]:\\Users\\[A-Za-z0-9._-]+\\/ }
22
+ ];
23
+
24
+ function read(path) {
25
+ return readFileSync(join(root, path), "utf8");
26
+ }
27
+
28
+ function requireText(path, content, pattern, description) {
29
+ if (!pattern.test(content)) {
30
+ failures.push(`${path} should include ${description}.`);
31
+ }
32
+ }
33
+
34
+ function forbidText(path, content, pattern, description) {
35
+ if (pattern.test(content)) {
36
+ failures.push(`${path} should not include ${description}.`);
37
+ }
38
+ }
39
+
40
+ for (const [path, content] of [
41
+ [workflowPath, workflow],
42
+ ["examples/ci/README.md", examplesReadme],
43
+ ["docs/GITHUB_ACTIONS.md", githubActionsDocs],
44
+ ["README.md", readme]
45
+ ]) {
46
+ for (const unsafe of unsafeContentPatterns) {
47
+ if (unsafe.pattern.test(content)) {
48
+ failures.push(`${path} appears to contain ${unsafe.name}; adoption examples should stay public and redacted.`);
49
+ }
50
+ }
51
+ }
52
+
53
+ requireText(workflowPath, workflow, /^name: Memento Mori Jester Adoption Smoke/m, "the adoption smoke workflow name");
54
+ requireText(workflowPath, workflow, /^\s*pull_request:/m, "a pull_request trigger");
55
+ requireText(workflowPath, workflow, /^\s*workflow_dispatch:/m, "a manual trigger");
56
+ requireText(workflowPath, workflow, /^permissions:\s*\n\s*contents: read/m, "read-only contents permission");
57
+ requireText(workflowPath, workflow, /actions\/checkout@v6/, "checkout@v6");
58
+ requireText(workflowPath, workflow, /actions\/setup-node@v6/, "setup-node@v6");
59
+ requireText(workflowPath, workflow, /node-version:\s*24/, "Node 24");
60
+ requireText(workflowPath, workflow, /npx -y memento-mori-jester@latest doctor/, "the doctor command");
61
+ requireText(workflowPath, workflow, /npx -y memento-mori-jester@latest summary --kind command "git reset --hard"/, "the command summary smoke");
62
+ requireText(workflowPath, workflow, /npm pack memento-mori-jester@latest --pack-destination "\$workdir" --silent/, "the registry package smoke");
63
+ requireText(workflowPath, workflow, /npm run framework:tuning:check --prefix "\$workdir\/package"/, "the framework tuning check command");
64
+ requireText(workflowPath, workflow, /npm run framework:tuning:doctor --prefix "\$workdir\/package"/, "the framework tuning doctor command");
65
+ requireText(workflowPath, workflow, /trap 'rm -rf "\$workdir"' EXIT/, "temporary package cleanup");
66
+ forbidText(workflowPath, workflow, /pull_request_target/, "pull_request_target");
67
+ forbidText(workflowPath, workflow, /security-events:\s*write|contents:\s*write|pull-requests:\s*write|id-token:\s*write/, "write permissions");
68
+ forbidText(workflowPath, workflow, /npm publish|gh release|git push/, "release or publish commands");
69
+
70
+ for (const [path, content] of [
71
+ ["examples/ci/README.md", examplesReadme],
72
+ ["docs/GITHUB_ACTIONS.md", githubActionsDocs],
73
+ ["README.md", readme]
74
+ ]) {
75
+ requireText(path, content, /adoption-smoke\.yml/, "the adoption smoke workflow link");
76
+ requireText(path, content, /doctor/, "doctor adoption guidance");
77
+ requireText(path, content, /summary --kind command "git reset --hard"/, "summary smoke guidance");
78
+ requireText(path, content, /framework:tuning:doctor/, "framework tuning doctor guidance");
79
+ }
80
+
81
+ if (failures.length > 0) {
82
+ console.error("CI adoption example check failed:");
83
+ for (const failure of failures) {
84
+ console.error(`- ${failure}`);
85
+ }
86
+ process.exit(1);
87
+ }
88
+
89
+ console.log("CI adoption example check passed for examples/ci/adoption-smoke.yml.");
@@ -70,6 +70,7 @@ for (const path of [
70
70
  "scripts/check-site.mjs",
71
71
  "scripts/check-framework-tuning.mjs",
72
72
  "scripts/doctor-framework-tuning.mjs",
73
+ "scripts/check-ci-adoption.mjs",
73
74
  "scripts/check-fixtures.mjs",
74
75
  "scripts/report-fixtures.mjs",
75
76
  ".github/ISSUE_TEMPLATE/bug_report.yml",
@@ -82,6 +83,7 @@ for (const path of [
82
83
  "examples/github-action.yml",
83
84
  "examples/github-code-scanning.yml",
84
85
  "examples/ci/README.md",
86
+ "examples/ci/adoption-smoke.yml",
85
87
  "examples/presets/README.md",
86
88
  "examples/tuning/README.md",
87
89
  "examples/tuning/framework-tuning-cookbook.json",
@@ -106,6 +108,7 @@ requireText("README.md", /fixtures:report/, "fixture coverage report guidance");
106
108
  requireText("README.md", /fixtures:report -- --markdown/, "Markdown fixture report guidance");
107
109
  requireText("README.md", /FRAMEWORK_TUNING\.md/, "framework tuning guide link");
108
110
  requireText("README.md", /examples\/tuning/, "framework tuning cookbook link");
111
+ requireText("README.md", /adoption-smoke\.yml/, "adoption smoke CI link");
109
112
  requireText("README.md", /License: PolyForm Noncommercial/, "the noncommercial license badge");
110
113
  requireText("docs/PRODUCTION_READINESS.md", /npm package/i, "npm package readiness");
111
114
  requireText("docs/PRODUCTION_READINESS.md", /GitHub Action/i, "GitHub Action readiness");
@@ -121,6 +124,7 @@ requireText("docs/PRODUCTION_READINESS.md", /fixtures:report/, "fixture coverage
121
124
  requireText("docs/PRODUCTION_READINESS.md", /fixtures:report -- --markdown/, "Markdown fixture report readiness");
122
125
  requireText("docs/PRODUCTION_READINESS.md", /framework:tuning:check/, "framework tuning cookbook readiness");
123
126
  requireText("docs/PRODUCTION_READINESS.md", /framework:tuning:doctor/, "framework tuning cookbook doctor readiness");
127
+ requireText("docs/PRODUCTION_READINESS.md", /adoption-smoke\.yml/, "adoption smoke CI readiness");
124
128
  requireText("docs/PRODUCTION_READINESS.md", /quiet-pass/, "quiet-pass fixture readiness");
125
129
  requireText("docs/CLI.md", /jester doctor --json/, "doctor JSON CLI docs");
126
130
  requireText("docs/CLI.md", /quiet-pass fixture/, "quiet-pass fixture CLI docs");
@@ -133,6 +137,9 @@ requireText("docs/FRAMEWORK_TUNING.md", /Terraform/, "Terraform framework tuning
133
137
  requireText("docs/FRAMEWORK_TUNING.md", /jester tune <rule-id> --json/, "framework tuning command guidance");
134
138
  requireText("docs/FRAMEWORK_TUNING.md", /framework-tuning-cookbook\.json/, "framework tuning cookbook JSON link");
135
139
  requireText("docs/FRAMEWORK_TUNING.md", /framework:tuning:doctor/, "framework tuning doctor guidance");
140
+ requireText("docs/GITHUB_ACTIONS.md", /adoption-smoke\.yml/, "adoption smoke GitHub Actions docs");
141
+ requireText("docs/GITHUB_ACTIONS.md", /summary --kind command "git reset --hard"/, "adoption summary smoke docs");
142
+ requireText("docs/GITHUB_ACTIONS.md", /framework:tuning:doctor/, "adoption framework tuning doctor docs");
136
143
  requireText("docs/MAINTAINER_TRIAGE.md", /doctor --json/, "doctor JSON triage prompt");
137
144
  requireText("docs/MAINTAINER_TRIAGE.md", /tune <rule-id> --json/, "tune JSON triage prompt");
138
145
  requireText("docs/MAINTAINER_TRIAGE.md", /preset-review-cases\.json/, "fixture suite link");
@@ -143,6 +150,10 @@ requireText("examples/fixtures/README.md", /Adding A Fixture From A Report/, "fi
143
150
  requireText("examples/fixtures/README.md", /fixtures:check/, "fixture authoring check guidance");
144
151
  requireText("examples/fixtures/README.md", /fixtures:report/, "fixture coverage report guidance");
145
152
  requireText("examples/fixtures/README.md", /fixtures:report -- --markdown/, "Markdown fixture report guidance");
153
+ requireText("examples/ci/README.md", /adoption-smoke\.yml/, "adoption smoke CI index link");
154
+ requireText("examples/ci/adoption-smoke.yml", /npx -y memento-mori-jester@latest doctor/, "adoption smoke doctor command");
155
+ requireText("examples/ci/adoption-smoke.yml", /summary --kind command "git reset --hard"/, "adoption smoke summary command");
156
+ requireText("examples/ci/adoption-smoke.yml", /framework:tuning:doctor/, "adoption smoke tuning doctor command");
146
157
  requireText("examples/tuning/README.md", /framework-tuning-cookbook\.json/, "framework tuning cookbook JSON link");
147
158
  requireText("examples/tuning/README.md", /framework:tuning:doctor/, "framework tuning doctor guidance");
148
159
  requireText("examples/tuning/README.md", /jester tune <rule-id> --json|jester tune [a-z0-9-]+ --json/, "framework tuning command guidance");
@@ -164,10 +175,14 @@ requireText("scripts/doctor-framework-tuning.mjs", /dist.*cli\.js|cliPath/, "bui
164
175
  requireText("scripts/doctor-framework-tuning.mjs", /config.*init|config", "init"/, "generated preset config doctor");
165
176
  requireText("scripts/doctor-framework-tuning.mjs", /tune.*--json|tune", ruleId, "--json"/, "tune JSON doctor command");
166
177
  forbidText("scripts/doctor-framework-tuning.mjs", /src\/config\.ts|src\/types\.ts/, "source-only framework tuning doctor dependencies");
178
+ requireText("scripts/check-ci-adoption.mjs", /adoption-smoke\.yml/, "adoption smoke checker target");
179
+ requireText("scripts/check-ci-adoption.mjs", /pull_request_target/, "adoption smoke unsafe trigger guard");
180
+ requireText("scripts/check-ci-adoption.mjs", /framework:tuning:doctor/, "adoption smoke tuning doctor guard");
167
181
  requireText("package.json", /"fixtures:check": "node scripts\/check-fixtures\.mjs"/, "fixture authoring check script");
168
182
  requireText("package.json", /"fixtures:report": "node scripts\/report-fixtures\.mjs"/, "fixture coverage report script");
169
183
  requireText("package.json", /"framework:tuning:check": "node scripts\/check-framework-tuning\.mjs"/, "framework tuning cookbook check script");
170
184
  requireText("package.json", /"framework:tuning:doctor": "node scripts\/doctor-framework-tuning\.mjs"/, "framework tuning cookbook doctor script");
185
+ requireText("package.json", /"ci:adoption:check": "node scripts\/check-ci-adoption\.mjs"/, "CI adoption check script");
171
186
  requireText("package.json", /"promo:card": "node scripts\/render-social-card\.mjs"/, "social card render script");
172
187
  requireText("package.json", /"promo:card:check": "node scripts\/render-social-card\.mjs --check"/, "social card stale check script");
173
188
  requireText("package.json", /"promo:check": "node scripts\/check-promo-freshness\.mjs"/, "promo freshness check script");
@@ -176,6 +191,7 @@ requireText("package.json", /npm run fixtures:check/, "fixture authoring check i
176
191
  requireText("package.json", /npm run fixtures:report/, "fixture coverage report in npm test");
177
192
  requireText("package.json", /npm run framework:tuning:check/, "framework tuning cookbook check in npm test");
178
193
  requireText("package.json", /npm run framework:tuning:doctor/, "framework tuning cookbook doctor in npm test");
194
+ requireText("package.json", /npm run ci:adoption:check/, "CI adoption check in npm test");
179
195
  requireText("package.json", /npm run promo:check/, "promo freshness check in npm test");
180
196
  requireText("package.json", /npm run site:check/, "site check in npm test");
181
197
  requireText("scripts/check-promo-freshness.mjs", /--require-package-version/, "optional strict package-version promo check");