memento-mori-jester 0.1.102 → 0.1.104
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 +12 -0
- package/README.md +6 -2
- package/ROADMAP.md +2 -0
- package/docs/MAINTAINER_TRIAGE.md +1 -1
- package/docs/PRODUCTION_READINESS.md +8 -4
- package/docs/RELEASE.md +2 -0
- package/docs/RELEASE_NOTES_v0.1.103.md +45 -0
- package/docs/RELEASE_NOTES_v0.1.104.md +47 -0
- package/examples/support/README.md +1 -1
- package/examples/support/installed-package-support.json +51 -0
- package/examples/support/installed-package-support.md +39 -0
- package/examples/support/support-examples-index.json +29 -0
- package/examples/support/support-examples-index.md +5 -1
- package/package.json +4 -3
- package/scripts/check-package-contents.mjs +265 -0
- package/scripts/check-production-readiness.mjs +34 -0
- package/scripts/check-support-triage.mjs +200 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ All notable changes to Memento Mori Jester are tracked here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.1.104
|
|
8
|
+
|
|
9
|
+
- Added checked `installed-package-support.md/json` notes so maintainers can verify and use support examples from the npm package rather than a repo checkout.
|
|
10
|
+
- Extended the support examples index, `npm run support:check`, and `npm run pack:contents:check` so package-relative support paths and repo-only path exclusions stay aligned.
|
|
11
|
+
- Updated README, maintainer triage docs, production-readiness docs, roadmap, and release notes for installed-package support provenance.
|
|
12
|
+
|
|
13
|
+
## 0.1.103
|
|
14
|
+
|
|
15
|
+
- Added `npm run pack:contents:check` to verify dry-run package contents include the support examples index, quickstart, lifecycle map, blank worksheet, and filled synthetic example.
|
|
16
|
+
- Wired `pack:dry` and `npm test` through the package contents smoke so release dry runs also exclude repo-local promo, site, private, cache, GitHub workflow, and credential-shaped files.
|
|
17
|
+
- Updated README, release docs, production-readiness docs, roadmap, and release notes for the package surface guard.
|
|
18
|
+
|
|
7
19
|
## 0.1.102
|
|
8
20
|
|
|
9
21
|
- Added a checked public-safe support examples quickstart for a 60-second maintainer handoff from incoming report to lifecycle map, blank worksheet, filled synthetic example, backlog record, and backlog review.
|
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ For trust-building output examples, see [examples/reports](examples/reports). `n
|
|
|
76
76
|
|
|
77
77
|
If one of those reports is confusing or stale, use the public-safe [report gallery feedback template](examples/reports/feedback-template.md). It asks for version, nearest gallery example, sanitized command/output summaries, and redacted diagnostics without private repo code or secrets.
|
|
78
78
|
|
|
79
|
-
Maintainers can use the checked [support examples quickstart](examples/support/support-examples-quickstart.md), [support examples index](examples/support/support-examples-index.md), [support lifecycle map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), synthetic [filled worksheet example](examples/support/support-lifecycle-filled-example.md), [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support backlog review](examples/support/backlog-review.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), and [support closeout checklist](examples/support/closeout-checklist.md) to turn sanitized reports into a docs example, fixture backlog item, or rule-review candidate without changing behavior first.
|
|
79
|
+
Maintainers can use the checked [support examples quickstart](examples/support/support-examples-quickstart.md), [support examples index](examples/support/support-examples-index.md), [installed-package support note](examples/support/installed-package-support.md), [support lifecycle map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), synthetic [filled worksheet example](examples/support/support-lifecycle-filled-example.md), [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support backlog review](examples/support/backlog-review.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), and [support closeout checklist](examples/support/closeout-checklist.md) to turn sanitized reports into a docs example, fixture backlog item, or rule-review candidate without changing behavior first.
|
|
80
80
|
|
|
81
81
|
Expected vibe:
|
|
82
82
|
|
|
@@ -452,6 +452,7 @@ More setup examples:
|
|
|
452
452
|
- [Report Gallery Feedback Template](examples/reports/feedback-template.md)
|
|
453
453
|
- [Support Examples Quickstart](examples/support/support-examples-quickstart.md)
|
|
454
454
|
- [Support Examples Index](examples/support/support-examples-index.md)
|
|
455
|
+
- [Installed Package Support Examples](examples/support/installed-package-support.md)
|
|
455
456
|
- [Support Lifecycle Map](examples/support/support-lifecycle-map.md)
|
|
456
457
|
- [Support Lifecycle Worksheet](examples/support/support-lifecycle-worksheet.md)
|
|
457
458
|
- [Filled Support Lifecycle Worksheet Example](examples/support/support-lifecycle-filled-example.md)
|
|
@@ -485,6 +486,7 @@ Framework CI examples:
|
|
|
485
486
|
- [Report Gallery Feedback Template](examples/reports/feedback-template.md)
|
|
486
487
|
- [Support Examples Quickstart](examples/support/support-examples-quickstart.md)
|
|
487
488
|
- [Support Examples Index](examples/support/support-examples-index.md)
|
|
489
|
+
- [Installed Package Support Examples](examples/support/installed-package-support.md)
|
|
488
490
|
- [Support Lifecycle Map](examples/support/support-lifecycle-map.md)
|
|
489
491
|
- [Support Lifecycle Worksheet](examples/support/support-lifecycle-worksheet.md)
|
|
490
492
|
- [Filled Support Lifecycle Worksheet Example](examples/support/support-lifecycle-filled-example.md)
|
|
@@ -551,10 +553,11 @@ Maintainers can use [docs/MAINTAINER_TRIAGE.md](docs/MAINTAINER_TRIAGE.md) to tu
|
|
|
551
553
|
Run `npm run fixtures:check` before merging fixture changes; it catches duplicate IDs, missing rule metadata, weak descriptions, unsafe-looking content, and duplicate content.
|
|
552
554
|
Run `npm run fixtures:report` to see fixture coverage by rule, rule family, preset slice, kind, verdict, quiet-pass boundaries, feasible pass-case gaps, and curation-next guidance before choosing the next fixture. Use `npm run fixtures:report -- --markdown` when you want a paste-ready summary for release notes or GitHub issues.
|
|
553
555
|
Run `npm run reports:check` after editing [examples/reports](examples/reports); it verifies the public report gallery against an installed package in a temporary consumer project.
|
|
554
|
-
Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support examples quickstart](examples/support/support-examples-quickstart.md), [support examples index](examples/support/support-examples-index.md), [support lifecycle map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), [filled worksheet example](examples/support/support-lifecycle-filled-example.md), [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support backlog review](examples/support/backlog-review.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), or [support closeout checklist](examples/support/closeout-checklist.md); it verifies the public templates ask for useful redacted context without inviting secrets or private code.
|
|
556
|
+
Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support examples quickstart](examples/support/support-examples-quickstart.md), [support examples index](examples/support/support-examples-index.md), [installed-package support note](examples/support/installed-package-support.md), [support lifecycle map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), [filled worksheet example](examples/support/support-lifecycle-filled-example.md), [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support backlog review](examples/support/backlog-review.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), or [support closeout checklist](examples/support/closeout-checklist.md); it verifies the public templates ask for useful redacted context without inviting secrets or private code.
|
|
555
557
|
Run `npm run promo:card` to regenerate the repo-local social preview card after changing its copy or design.
|
|
556
558
|
Run `npm run promo:check` after editing promo assets; it checks the current demo video, stills, docs, and fixture evidence numbers stay in sync.
|
|
557
559
|
Run `npm run site:check` after editing the repo-local landing page; it verifies the start command, demo links, social card, repo, release, and npm links.
|
|
560
|
+
Run `npm run pack:contents:check` when package contents change; it verifies the dry-run package includes the support examples index, quickstart, lifecycle map, blank worksheet, and filled synthetic example, while excluding repo-local promo, site, private, cache, and credential-shaped files.
|
|
558
561
|
|
|
559
562
|
For vulnerabilities, private code exposure, or credential-handling concerns, follow [SECURITY.md](SECURITY.md) instead of opening a public issue with sensitive details.
|
|
560
563
|
|
|
@@ -568,6 +571,7 @@ npm.cmd run consumer:quickstart:check
|
|
|
568
571
|
npm.cmd run reports:check
|
|
569
572
|
npm.cmd run promo:check
|
|
570
573
|
npm.cmd run production:check
|
|
574
|
+
npm.cmd run pack:contents:check
|
|
571
575
|
npm.cmd run pack:dry
|
|
572
576
|
git tag -a v0.1.x -m "Memento Mori Jester v0.1.x"
|
|
573
577
|
git push origin main
|
package/ROADMAP.md
CHANGED
|
@@ -6,6 +6,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
6
6
|
|
|
7
7
|
## Recently Shipped
|
|
8
8
|
|
|
9
|
+
- Checked installed-package support provenance in v0.1.104, showing maintainers how to verify and use support examples from the npm package with package-relative paths.
|
|
10
|
+
- Checked package contents support manifest smoke in v0.1.103, proving dry-run packages include the support examples index, quickstart, lifecycle map, blank worksheet, and filled synthetic example while excluding repo-local/private-ish files.
|
|
9
11
|
- Checked support examples quickstart in v0.1.102, giving maintainers a 60-second handoff path from incoming report to map, worksheet, synthetic example, backlog record, and backlog review.
|
|
10
12
|
- Checked support examples index in v0.1.101, telling maintainers when to use the lifecycle map, blank worksheet, and filled synthetic example.
|
|
11
13
|
- Checked filled support lifecycle worksheet example in v0.1.100, showing a synthetic `docs-example` report through report, triage, response, closeout, prioritization, backlog record, and backlog review.
|
|
@@ -21,7 +21,7 @@ For users who just need to understand what a healthy report looks like, point th
|
|
|
21
21
|
|
|
22
22
|
For users who say a gallery report is confusing, stale, or hard to compare with their local output, point them at [examples/reports/feedback-template.md](../examples/reports/feedback-template.md) or the GitHub [report gallery feedback issue template](../.github/ISSUE_TEMPLATE/report_gallery_feedback.yml). It asks for the nearest checked example, sanitized command and output summaries, version, and redacted diagnostics without asking for private code.
|
|
23
23
|
|
|
24
|
-
When a report has enough public-safe detail to triage, start with the checked [support examples quickstart](../examples/support/support-examples-quickstart.md) for a 60-second handoff path, or use the checked [support examples index](../examples/support/support-examples-index.md) to choose the right support artifact. Use the checked [support lifecycle map](../examples/support/support-lifecycle-map.md) for a quick scan of the path, then use the checked [support lifecycle worksheet](../examples/support/support-lifecycle-worksheet.md) to record each stage during active review. Use the synthetic [filled lifecycle worksheet example](../examples/support/support-lifecycle-filled-example.md) when you need to compare a real public-safe report against one completed `docs-example` path. Use the full [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to backlog review. Then compare it with the checked [support triage playbook](../examples/support). The playbook walks sanitized report-gallery and false-positive reports through first response, classification, and a follow-up outcome. Use [response-snippets.md](../examples/support/response-snippets.md) to reply consistently after choosing the outcome, then use [closeout-checklist.md](../examples/support/closeout-checklist.md) to record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened. Use [outcome-prioritization.md](../examples/support/outcome-prioritization.md) after closeout to decide whether the follow-up work is low-priority docs, medium-priority fixture backlog, or high-priority rule review. Use [backlog-records.md](../examples/support/backlog-records.md) when that prioritized follow-up needs a public-safe backlog artifact, then use [backlog-review.md](../examples/support/backlog-review.md) to revisit whether that artifact remains active or closes with no action.
|
|
24
|
+
When a report has enough public-safe detail to triage, start with the checked [support examples quickstart](../examples/support/support-examples-quickstart.md) for a 60-second handoff path, or use the checked [support examples index](../examples/support/support-examples-index.md) to choose the right support artifact. If you are working from an installed npm package instead of a repo checkout, use [installed-package-support.md](../examples/support/installed-package-support.md) to verify package-relative support paths with `npm explore memento-mori-jester -- npm run pack:contents:check`. Use the checked [support lifecycle map](../examples/support/support-lifecycle-map.md) for a quick scan of the path, then use the checked [support lifecycle worksheet](../examples/support/support-lifecycle-worksheet.md) to record each stage during active review. Use the synthetic [filled lifecycle worksheet example](../examples/support/support-lifecycle-filled-example.md) when you need to compare a real public-safe report against one completed `docs-example` path. Use the full [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to backlog review. Then compare it with the checked [support triage playbook](../examples/support). The playbook walks sanitized report-gallery and false-positive reports through first response, classification, and a follow-up outcome. Use [response-snippets.md](../examples/support/response-snippets.md) to reply consistently after choosing the outcome, then use [closeout-checklist.md](../examples/support/closeout-checklist.md) to record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened. Use [outcome-prioritization.md](../examples/support/outcome-prioritization.md) after closeout to decide whether the follow-up work is low-priority docs, medium-priority fixture backlog, or high-priority rule review. Use [backlog-records.md](../examples/support/backlog-records.md) when that prioritized follow-up needs a public-safe backlog artifact, then use [backlog-review.md](../examples/support/backlog-review.md) to revisit whether that artifact remains active or closes with no action.
|
|
25
25
|
|
|
26
26
|
Do not ask users to paste secrets, private code, customer data, live credentials, complete CI logs, or unredacted SARIF. If the report involves credential exposure, command execution, unexpected network access, private code disclosure, package publishing, or MCP data exposure, route it through [SECURITY.md](../SECURITY.md).
|
|
27
27
|
|
|
@@ -9,6 +9,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
9
9
|
- GitHub Releases and npm publishing are automated from annotated `v*` tags through GitHub Actions trusted publishing.
|
|
10
10
|
- CI runs tests and a package dry run on every push to `main` and pull request.
|
|
11
11
|
- The local playground, GitHub Action, MCP setup snippets, preset examples, fixtures, and release notes ship in the npm package.
|
|
12
|
+
- Package dry runs include a support examples manifest smoke so the installed-package support note, index, quickstart, lifecycle map, blank worksheet, and filled synthetic example keep shipping from the tarball.
|
|
12
13
|
- Repo-local promo assets stay outside the npm package, but `npm run promo:check` keeps the current demo video, stills, social card, docs, and fixture evidence numbers aligned.
|
|
13
14
|
- The repo-local landing page stays outside the npm package, but `npm run site:check` keeps its start command and public links aligned.
|
|
14
15
|
|
|
@@ -16,7 +17,8 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
16
17
|
|
|
17
18
|
- `package.json` includes repository, homepage, bugs, binaries, exports, public package files, and public publish access.
|
|
18
19
|
- `package-lock.json` version matches `package.json`.
|
|
19
|
-
- `npm run pack:dry` confirms the package includes `dist`, `docs`, `examples`, `scripts`, `README.md`, `CHANGELOG.md`, `ROADMAP.md`, and `LICENSE`.
|
|
20
|
+
- `npm run pack:dry` confirms the package includes `dist`, `docs`, `examples`, `scripts`, `README.md`, `CHANGELOG.md`, `ROADMAP.md`, and `LICENSE`, then runs `npm run pack:contents:check`.
|
|
21
|
+
- `npm run pack:contents:check` verifies the dry-run package includes the installed-package support note, support examples index, quickstart, lifecycle map, blank worksheet, and filled synthetic example, and excludes repo-local promo, site, private, cache, GitHub workflow, and credential-shaped files.
|
|
20
22
|
- `SECURITY.md` ships with the package so vulnerability reporting guidance is visible from the repository and npm tarball.
|
|
21
23
|
- `prepublishOnly` runs tests and a package dry run for local publish attempts.
|
|
22
24
|
|
|
@@ -47,7 +49,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
47
49
|
- `README.md` leads with a no-write first run, project bootstrap, agent setup, and optional hooks/CI.
|
|
48
50
|
- `docs/GETTING_STARTED.md`, `docs/CLI.md`, `docs/RELEASE.md`, and `docs/TRUSTED_PUBLISHING.md` cover the core adoption and release paths.
|
|
49
51
|
- `examples/reports` provides checked, public-safe report examples for fresh install diagnostics, summary output, blocked command reviews, and report-gallery feedback.
|
|
50
|
-
- `examples/support` provides a checked support examples quickstart, support examples index, compact support lifecycle map, active-review worksheet, synthetic filled worksheet example, and full support lifecycle overview covering report, triage, response, closeout, prioritization, backlog record, and backlog review, plus the supporting outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist.
|
|
52
|
+
- `examples/support` provides a checked support examples quickstart, support examples index, installed-package support note, compact support lifecycle map, active-review worksheet, synthetic filled worksheet example, and full support lifecycle overview covering report, triage, response, closeout, prioritization, backlog record, and backlog review, plus the supporting outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist.
|
|
51
53
|
- `site/index.html` gives maintainers a static one-page share surface that reuses the demo, social card, start command, and public links.
|
|
52
54
|
- Every public release has matching `CHANGELOG.md` notes and `docs/RELEASE_NOTES_vX.Y.Z.md`.
|
|
53
55
|
|
|
@@ -60,16 +62,17 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
60
62
|
- GitHub issue templates collect bug reports, false-positive reports, report-gallery feedback, and feature requests with the diagnostic context maintainers need.
|
|
61
63
|
- `SECURITY.md` routes vulnerability reports away from public issues and asks for redacted diagnostics.
|
|
62
64
|
- `docs/MAINTAINER_TRIAGE.md` explains how to turn useful false-positive reports into fixture coverage before changing rule logic.
|
|
63
|
-
- `examples/support` shows maintainers how to use the quickstart for a live 60-second handoff, choose the right support artifact from the examples index, scan the support lifecycle map, use the support lifecycle worksheet during active review, compare against a synthetic filled worksheet example, audit the full lifecycle overview, classify sanitized reports as a docs example, fixture backlog item, or rule-review candidate before changing behavior, then reply with public-safe response snippets, record the closeout, prioritize follow-up work, create a public-safe backlog record, and review aging records for keep-or-close decisions.
|
|
65
|
+
- `examples/support` shows maintainers how to use the quickstart for a live 60-second handoff, choose the right support artifact from the examples index, verify the same package-relative support artifacts from an installed npm package, scan the support lifecycle map, use the support lifecycle worksheet during active review, compare against a synthetic filled worksheet example, audit the full lifecycle overview, classify sanitized reports as a docs example, fixture backlog item, or rule-review candidate before changing behavior, then reply with public-safe response snippets, record the closeout, prioritize follow-up work, create a public-safe backlog record, and review aging records for keep-or-close decisions.
|
|
64
66
|
- `npm run fixtures:check` validates fixture IDs, metadata, unsafe-looking content, duplicate content, and explicit expected/absent rule intent.
|
|
65
67
|
- `npm run fixtures:report` shows fixture coverage by rule, rule family, preset slice, kind, verdict, quiet-pass rule boundaries, and feasible pass-case gaps so maintainers can pick the next fixture target; `npm run fixtures:report -- --markdown` produces a paste-ready maintainer snapshot.
|
|
66
68
|
- `npm run framework:tuning:check` keeps the framework tuning guide, cookbook JSON, cookbook README, and fixture IDs aligned.
|
|
67
69
|
- `npm run framework:tuning:doctor` runs the cookbook tune commands through the built CLI with temporary preset configs, so package consumers do not inherit stale recipes.
|
|
68
70
|
- `npm run consumer:quickstart:check` installs the package into a temporary minimal project and runs `doctor`, `summary`, and packaged framework tuning checks from that consumer side.
|
|
69
71
|
- `npm run reports:check` installs the package into a temporary minimal project and runs the report gallery's `doctor`, `summary`, and blocked-command examples through that consumer side.
|
|
70
|
-
- `npm run support:check` verifies issue templates, support docs, the report gallery feedback template, support examples quickstart, support examples index, support lifecycle map, support lifecycle worksheet, filled worksheet example, support lifecycle overview, outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist stay public-safe and ask for useful redacted context.
|
|
72
|
+
- `npm run support:check` verifies issue templates, support docs, the report gallery feedback template, support examples quickstart, support examples index, installed-package support note, support lifecycle map, support lifecycle worksheet, filled worksheet example, support lifecycle overview, outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist stay public-safe and ask for useful redacted context.
|
|
71
73
|
- `npm run promo:card` regenerates the deterministic social preview card, and `npm run promo:check` verifies current repo-local promo assets against the current fixture evidence before maintainers post or refresh the demo.
|
|
72
74
|
- `npm run site:check` verifies the static landing page before maintainers post or host it.
|
|
75
|
+
- `npm run pack:contents:check` verifies the npm package surface keeps the support examples manifest files and installed-package provenance note available while excluding repo-only or private-ish paths.
|
|
73
76
|
- npm publish has a manual workflow fallback, but the normal release path is tag-driven trusted publishing.
|
|
74
77
|
|
|
75
78
|
## Static Guard
|
|
@@ -93,6 +96,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
93
96
|
- support triage checks are wired into `npm test`.
|
|
94
97
|
- promo freshness checks are wired into `npm test`.
|
|
95
98
|
- site checks are wired into `npm test`.
|
|
99
|
+
- package contents checks are wired into `npm test` and `npm run pack:dry`.
|
|
96
100
|
|
|
97
101
|
`npm test` runs this check after the TypeScript build and unit tests.
|
|
98
102
|
|
package/docs/RELEASE.md
CHANGED
|
@@ -21,6 +21,7 @@ npm.cmd run support:check
|
|
|
21
21
|
npm.cmd run promo:card:check
|
|
22
22
|
npm.cmd run promo:check
|
|
23
23
|
npm.cmd run site:check
|
|
24
|
+
npm.cmd run pack:contents:check
|
|
24
25
|
npm.cmd run pack:dry
|
|
25
26
|
git diff --check
|
|
26
27
|
```
|
|
@@ -89,6 +90,7 @@ npx.cmd -y memento-mori-jester@latest config validate --config jester-security.c
|
|
|
89
90
|
npm.cmd run consumer:quickstart:check -- --package memento-mori-jester@latest
|
|
90
91
|
npm.cmd run reports:check -- --package memento-mori-jester@latest
|
|
91
92
|
npm.cmd run support:check
|
|
93
|
+
npm.cmd run pack:contents:check
|
|
92
94
|
```
|
|
93
95
|
|
|
94
96
|
## 4. MCP Copy-Paste
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.103
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
This release adds a checked package contents smoke so maintainers can prove the npm package surface still ships the support examples index, quickstart, lifecycle map, blank worksheet, and filled synthetic example while keeping repo-local/private-ish files out.
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added `scripts/check-package-contents.mjs`.
|
|
10
|
+
- Added `npm run pack:contents:check`.
|
|
11
|
+
- Updated `npm run pack:dry` so the normal dry-pack path also verifies package contents.
|
|
12
|
+
- Wired the package contents check into `npm test` and `npm run production:check`.
|
|
13
|
+
- Updated README, release docs, production-readiness docs, roadmap, and changelog.
|
|
14
|
+
|
|
15
|
+
## Public Interface Changes
|
|
16
|
+
|
|
17
|
+
- No CLI, MCP, config schema, rule, scoring, GitHub Action, or release automation changes.
|
|
18
|
+
- New maintainer script:
|
|
19
|
+
- `npm run pack:contents:check`
|
|
20
|
+
|
|
21
|
+
## Release Validation
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
npm.cmd test
|
|
25
|
+
npm.cmd run demo:svg:check
|
|
26
|
+
npm.cmd run promo:card:check
|
|
27
|
+
npm.cmd run promo:check
|
|
28
|
+
npm.cmd run support:check
|
|
29
|
+
npm.cmd run production:check
|
|
30
|
+
npm.cmd run pack:contents:check
|
|
31
|
+
npm.cmd run pack:dry
|
|
32
|
+
git diff --check
|
|
33
|
+
node .\dist\cli.js doctor
|
|
34
|
+
node .\dist\cli.js summary --kind command "git reset --hard"
|
|
35
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.103 package contents support manifest smoke"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Post-Publish Smoke
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
npm.cmd view memento-mori-jester version --silent
|
|
42
|
+
npx.cmd -y memento-mori-jester@latest doctor
|
|
43
|
+
npx.cmd -y memento-mori-jester@latest summary --kind command "git reset --hard"
|
|
44
|
+
npm.cmd run pack:contents:check
|
|
45
|
+
```
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.104
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
This release adds checked installed-package support provenance so maintainers can verify and use the support examples from the npm package, not only from a repo checkout.
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added `examples/support/installed-package-support.md`.
|
|
10
|
+
- Added `examples/support/installed-package-support.json`.
|
|
11
|
+
- Linked the installed-package support note from the support examples index and support README.
|
|
12
|
+
- Extended `npm run support:check` to validate the installed-package note, package-relative artifacts, `npm explore` verification command, and repo-only path exclusions.
|
|
13
|
+
- Extended `npm run pack:contents:check` so dry-run package contents prove the installed-package note and referenced support artifacts are included.
|
|
14
|
+
- Updated README, maintainer triage docs, production-readiness docs, roadmap, and changelog.
|
|
15
|
+
|
|
16
|
+
## Public Interface Changes
|
|
17
|
+
|
|
18
|
+
- No CLI, MCP, config schema, rule, scoring, GitHub Action, or release automation changes.
|
|
19
|
+
- New package docs/examples only:
|
|
20
|
+
- `examples/support/installed-package-support.md`
|
|
21
|
+
- `examples/support/installed-package-support.json`
|
|
22
|
+
|
|
23
|
+
## Release Validation
|
|
24
|
+
|
|
25
|
+
```powershell
|
|
26
|
+
npm.cmd test
|
|
27
|
+
npm.cmd run demo:svg:check
|
|
28
|
+
npm.cmd run promo:card:check
|
|
29
|
+
npm.cmd run promo:check
|
|
30
|
+
npm.cmd run support:check
|
|
31
|
+
npm.cmd run pack:contents:check
|
|
32
|
+
npm.cmd run production:check
|
|
33
|
+
npm.cmd run pack:dry
|
|
34
|
+
git diff --check
|
|
35
|
+
node .\dist\cli.js doctor
|
|
36
|
+
node .\dist\cli.js summary --kind command "git reset --hard"
|
|
37
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.104 installed-package support provenance"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Post-Publish Smoke
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
npm.cmd view memento-mori-jester version --silent
|
|
44
|
+
npx.cmd -y memento-mori-jester@latest doctor
|
|
45
|
+
npx.cmd -y memento-mori-jester@latest summary --kind command "git reset --hard"
|
|
46
|
+
npm.cmd run pack:contents:check
|
|
47
|
+
```
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This playbook shows how to handle sanitized adopter reports without turning every surprise into an immediate rule change. It pairs with [docs/MAINTAINER_TRIAGE.md](../../docs/MAINTAINER_TRIAGE.md), the [report gallery feedback template](../reports/feedback-template.md), and the GitHub issue templates.
|
|
4
4
|
|
|
5
|
-
Start with the checked [support examples quickstart](support-examples-quickstart.md) during a live maintainer handoff, or the checked [support examples index](support-examples-index.md) when you need to choose the right artifact. Use the compact checked [support lifecycle map](support-lifecycle-map.md) when you need a quick scan of the path: report, triage, response, closeout, prioritization, backlog record, and backlog review. Use the checked [support lifecycle worksheet](support-lifecycle-worksheet.md) during an active review so every stage has concrete checks and record fields, and compare against the synthetic [filled worksheet example](support-lifecycle-filled-example.md) when you need to see one completed `docs-example` path. Use the full checked [support lifecycle overview](support-lifecycle.md) when you need the outcome table in one place. The lifecycle sources are [support-examples-quickstart.json](support-examples-quickstart.json), [support-examples-index.json](support-examples-index.json), [support-lifecycle-map.json](support-lifecycle-map.json), [support-lifecycle-worksheet.json](support-lifecycle-worksheet.json), [support-lifecycle-filled-example.json](support-lifecycle-filled-example.json), and [support-lifecycle.json](support-lifecycle.json). Use [outcome-prioritization.md](outcome-prioritization.md) after closeout to decide whether follow-up work should become docs, fixture backlog, or rule-review work. Use [backlog-records.md](backlog-records.md) to turn that decision into a public-safe backlog artifact, then use [backlog-review.md](backlog-review.md) to decide whether the item stays active or closes with no action.
|
|
5
|
+
Start with the checked [support examples quickstart](support-examples-quickstart.md) during a live maintainer handoff, or the checked [support examples index](support-examples-index.md) when you need to choose the right artifact. Use [installed-package-support.md](installed-package-support.md) when proving those support examples from an installed npm package rather than a repo checkout. Use the compact checked [support lifecycle map](support-lifecycle-map.md) when you need a quick scan of the path: report, triage, response, closeout, prioritization, backlog record, and backlog review. Use the checked [support lifecycle worksheet](support-lifecycle-worksheet.md) during an active review so every stage has concrete checks and record fields, and compare against the synthetic [filled worksheet example](support-lifecycle-filled-example.md) when you need to see one completed `docs-example` path. Use the full checked [support lifecycle overview](support-lifecycle.md) when you need the outcome table in one place. The lifecycle sources are [installed-package-support.json](installed-package-support.json), [support-examples-quickstart.json](support-examples-quickstart.json), [support-examples-index.json](support-examples-index.json), [support-lifecycle-map.json](support-lifecycle-map.json), [support-lifecycle-worksheet.json](support-lifecycle-worksheet.json), [support-lifecycle-filled-example.json](support-lifecycle-filled-example.json), and [support-lifecycle.json](support-lifecycle.json). Use [outcome-prioritization.md](outcome-prioritization.md) after closeout to decide whether follow-up work should become docs, fixture backlog, or rule-review work. Use [backlog-records.md](backlog-records.md) to turn that decision into a public-safe backlog artifact, then use [backlog-review.md](backlog-review.md) to decide whether the item stays active or closes with no action.
|
|
6
6
|
|
|
7
7
|
The checked source is [triage-playbook.json](triage-playbook.json). Use [response-snippets.md](response-snippets.md) for copy-paste replies after a report is classified. The snippet source is [response-snippets.json](response-snippets.json). Use [closeout-checklist.md](closeout-checklist.md) to record what happened after the response. The closeout source is [closeout-checklist.json](closeout-checklist.json). The backlog source is [backlog-records.json](backlog-records.json). The review source is [backlog-review.json](backlog-review.json).
|
|
8
8
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Installed Package Support Examples",
|
|
3
|
+
"packageName": "memento-mori-jester",
|
|
4
|
+
"verifyCommand": "npm explore memento-mori-jester -- npm run pack:contents:check",
|
|
5
|
+
"packageRelativeRoot": "examples/support",
|
|
6
|
+
"packageRelativeArtifacts": [
|
|
7
|
+
"examples/support/support-examples-index.md",
|
|
8
|
+
"examples/support/support-examples-quickstart.md",
|
|
9
|
+
"examples/support/support-lifecycle-map.md",
|
|
10
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
11
|
+
"examples/support/support-lifecycle-filled-example.md"
|
|
12
|
+
],
|
|
13
|
+
"useWhen": "Use when a maintainer needs to verify or open the support examples from an installed npm package instead of a repository checkout.",
|
|
14
|
+
"steps": [
|
|
15
|
+
{
|
|
16
|
+
"id": "install-package",
|
|
17
|
+
"command": "npm install --save-dev memento-mori-jester",
|
|
18
|
+
"purpose": "Install the public package into a local maintainer or consumer project without requiring a source checkout."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "verify-package-contents",
|
|
22
|
+
"command": "npm explore memento-mori-jester -- npm run pack:contents:check",
|
|
23
|
+
"purpose": "Run the package's own contents smoke from inside the installed package."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "open-support-index",
|
|
27
|
+
"artifact": "examples/support/support-examples-index.md",
|
|
28
|
+
"purpose": "Choose between the quickstart, map, blank worksheet, and filled synthetic example using package-relative paths."
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"repoOnlyPathsNotRequired": [
|
|
32
|
+
"promo/",
|
|
33
|
+
"site/",
|
|
34
|
+
".github/",
|
|
35
|
+
"private/",
|
|
36
|
+
"secrets/",
|
|
37
|
+
"internal/",
|
|
38
|
+
"node_modules/",
|
|
39
|
+
"coverage/",
|
|
40
|
+
"tmp/",
|
|
41
|
+
"temp/",
|
|
42
|
+
".env",
|
|
43
|
+
".npmrc"
|
|
44
|
+
],
|
|
45
|
+
"requiredChecks": [
|
|
46
|
+
"npm run support:check",
|
|
47
|
+
"npm run pack:contents:check",
|
|
48
|
+
"npm run production:check"
|
|
49
|
+
],
|
|
50
|
+
"privacyGuardrail": "Installed-package support examples must stay public-safe: use package-relative paths, avoid secrets and private details, and route credential exposure, package publishing compromise, MCP data exposure, command execution risk, or exploitable security details through SECURITY.md."
|
|
51
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Installed Package Support Examples
|
|
2
|
+
|
|
3
|
+
This public-safe note shows maintainers how to use the checked support examples from an installed npm package instead of a repository checkout.
|
|
4
|
+
|
|
5
|
+
The checked source is [installed-package-support.json](installed-package-support.json). Use it with the [support examples index](support-examples-index.md), [support examples quickstart](support-examples-quickstart.md), [support lifecycle map](support-lifecycle-map.md), [support lifecycle worksheet](support-lifecycle-worksheet.md), and [filled synthetic example](support-lifecycle-filled-example.md).
|
|
6
|
+
|
|
7
|
+
## Verify From npm
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
npm install --save-dev memento-mori-jester
|
|
11
|
+
npm explore memento-mori-jester -- npm run pack:contents:check
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Open The Package-Relative Artifacts
|
|
15
|
+
|
|
16
|
+
The support examples are package-relative paths under `examples/support/`:
|
|
17
|
+
|
|
18
|
+
- `examples/support/support-examples-index.md`
|
|
19
|
+
- `examples/support/support-examples-quickstart.md`
|
|
20
|
+
- `examples/support/support-lifecycle-map.md`
|
|
21
|
+
- `examples/support/support-lifecycle-worksheet.md`
|
|
22
|
+
- `examples/support/support-lifecycle-filled-example.md`
|
|
23
|
+
|
|
24
|
+
When using an installed package, stay inside the package directory through `npm explore memento-mori-jester -- <command>` or your editor's package viewer. The support examples do not require repo-only `promo/`, `site/`, `.github/`, private, secret, internal, cache, or credential-shaped paths.
|
|
25
|
+
|
|
26
|
+
## Maintainer Path
|
|
27
|
+
|
|
28
|
+
1. Run the package contents check from the installed package.
|
|
29
|
+
2. Open the support examples index to choose the right artifact.
|
|
30
|
+
3. Use the quickstart for a 60-second route from incoming report to map, worksheet, filled synthetic example, backlog record, and backlog review.
|
|
31
|
+
4. Keep report details redacted and route secrets, private code, private paths, customer data, package publishing compromise, MCP exposure, command execution risk, or exploitable security details through `SECURITY.md`.
|
|
32
|
+
|
|
33
|
+
## Checks
|
|
34
|
+
|
|
35
|
+
```powershell
|
|
36
|
+
npm run support:check
|
|
37
|
+
npm run pack:contents:check
|
|
38
|
+
npm run production:check
|
|
39
|
+
```
|
|
@@ -17,6 +17,35 @@
|
|
|
17
17
|
"publicSafe": true,
|
|
18
18
|
"synthetic": true
|
|
19
19
|
},
|
|
20
|
+
"installedPackageProvenance": {
|
|
21
|
+
"label": "Installed Package Support Examples",
|
|
22
|
+
"file": "examples/support/installed-package-support.md",
|
|
23
|
+
"source": "examples/support/installed-package-support.json",
|
|
24
|
+
"useWhen": "Use when a maintainer needs to verify or open the support examples from an installed npm package instead of a repository checkout.",
|
|
25
|
+
"verifyCommand": "npm explore memento-mori-jester -- npm run pack:contents:check",
|
|
26
|
+
"packageRelativeArtifacts": [
|
|
27
|
+
"examples/support/support-examples-index.md",
|
|
28
|
+
"examples/support/support-examples-quickstart.md",
|
|
29
|
+
"examples/support/support-lifecycle-map.md",
|
|
30
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
31
|
+
"examples/support/support-lifecycle-filled-example.md"
|
|
32
|
+
],
|
|
33
|
+
"repoOnlyPathsNotRequired": [
|
|
34
|
+
"promo/",
|
|
35
|
+
"site/",
|
|
36
|
+
".github/",
|
|
37
|
+
"private/",
|
|
38
|
+
"secrets/",
|
|
39
|
+
"internal/",
|
|
40
|
+
"node_modules/",
|
|
41
|
+
"coverage/",
|
|
42
|
+
"tmp/",
|
|
43
|
+
"temp/",
|
|
44
|
+
".env",
|
|
45
|
+
".npmrc"
|
|
46
|
+
],
|
|
47
|
+
"publicSafe": true
|
|
48
|
+
},
|
|
20
49
|
"artifacts": [
|
|
21
50
|
{
|
|
22
51
|
"id": "lifecycle-map",
|
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
This public-safe index tells maintainers which checked support artifact to use during a report review. It keeps the compact map, blank worksheet, and filled synthetic example together so a support issue can move from first report to backlog review without guessing.
|
|
4
4
|
|
|
5
|
-
The checked source is [support-examples-index.json](support-examples-index.json). For live handoffs, use the checked [support examples quickstart](support-examples-quickstart.md). This index points at the [support lifecycle map](support-lifecycle-map.md), [support lifecycle worksheet](support-lifecycle-worksheet.md), and [filled lifecycle worksheet example](support-lifecycle-filled-example.md).
|
|
5
|
+
The checked source is [support-examples-index.json](support-examples-index.json). For live handoffs, use the checked [support examples quickstart](support-examples-quickstart.md). For installed-package provenance, use [installed-package-support.md](installed-package-support.md). This index points at the [support lifecycle map](support-lifecycle-map.md), [support lifecycle worksheet](support-lifecycle-worksheet.md), and [filled lifecycle worksheet example](support-lifecycle-filled-example.md).
|
|
6
6
|
|
|
7
7
|
## 60-Second Handoff
|
|
8
8
|
|
|
9
9
|
Use [support-examples-quickstart.md](support-examples-quickstart.md) when an incoming report needs a fast maintainer route from public-safety check to lifecycle map, blank worksheet, filled synthetic example, backlog record, and backlog review.
|
|
10
10
|
|
|
11
|
+
## Installed Package Provenance
|
|
12
|
+
|
|
13
|
+
Use [installed-package-support.md](installed-package-support.md) when proving these examples from the npm package. It uses `npm explore memento-mori-jester -- npm run pack:contents:check`, package-relative `examples/support/` paths, and no repo-only `promo/`, `site/`, `.github/`, private, secret, internal, cache, or credential-shaped paths.
|
|
14
|
+
|
|
11
15
|
## Which Artifact To Use
|
|
12
16
|
|
|
13
17
|
| Artifact | Use when | Required public-safe markers |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mori-jester",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.104",
|
|
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 ci:adoption:check && npm run consumer:quickstart:check && npm run reports:check && npm run support:check && 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 consumer:quickstart:check && npm run reports:check && npm run support:check && npm run promo:check && npm run site:check && npm run pack:contents: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",
|
|
@@ -57,7 +57,8 @@
|
|
|
57
57
|
"promo:check": "node scripts/check-promo-freshness.mjs",
|
|
58
58
|
"site:check": "node scripts/check-site.mjs",
|
|
59
59
|
"production:check": "node scripts/check-production-readiness.mjs",
|
|
60
|
-
"pack:
|
|
60
|
+
"pack:contents:check": "node scripts/check-package-contents.mjs",
|
|
61
|
+
"pack:dry": "npm pack --dry-run && npm run pack:contents:check",
|
|
61
62
|
"prepare": "npm run build",
|
|
62
63
|
"prepublishOnly": "npm test && npm run pack:dry"
|
|
63
64
|
},
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const root = join(scriptDir, "..");
|
|
9
|
+
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
10
|
+
const npmExecPath = process.env.npm_execpath;
|
|
11
|
+
const failures = [];
|
|
12
|
+
const packageJson = readJson("package.json");
|
|
13
|
+
|
|
14
|
+
const requiredPackageFiles = [
|
|
15
|
+
"dist/cli.js",
|
|
16
|
+
"dist/core.js",
|
|
17
|
+
"docs/RELEASE.md",
|
|
18
|
+
`docs/RELEASE_NOTES_v${packageJson.version}.md`,
|
|
19
|
+
"examples/support/installed-package-support.md",
|
|
20
|
+
"examples/support/installed-package-support.json",
|
|
21
|
+
"examples/support/support-examples-index.md",
|
|
22
|
+
"examples/support/support-examples-index.json",
|
|
23
|
+
"examples/support/support-examples-quickstart.md",
|
|
24
|
+
"examples/support/support-examples-quickstart.json",
|
|
25
|
+
"examples/support/support-lifecycle-map.md",
|
|
26
|
+
"examples/support/support-lifecycle-map.json",
|
|
27
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
28
|
+
"examples/support/support-lifecycle-worksheet.json",
|
|
29
|
+
"examples/support/support-lifecycle-filled-example.md",
|
|
30
|
+
"examples/support/support-lifecycle-filled-example.json",
|
|
31
|
+
"README.md",
|
|
32
|
+
"CHANGELOG.md",
|
|
33
|
+
"ROADMAP.md",
|
|
34
|
+
"SECURITY.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const requiredSupportFiles = [
|
|
39
|
+
"examples/support/installed-package-support.md",
|
|
40
|
+
"examples/support/installed-package-support.json",
|
|
41
|
+
"examples/support/support-examples-index.md",
|
|
42
|
+
"examples/support/support-examples-index.json",
|
|
43
|
+
"examples/support/support-examples-quickstart.md",
|
|
44
|
+
"examples/support/support-examples-quickstart.json",
|
|
45
|
+
"examples/support/support-lifecycle-map.md",
|
|
46
|
+
"examples/support/support-lifecycle-map.json",
|
|
47
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
48
|
+
"examples/support/support-lifecycle-worksheet.json",
|
|
49
|
+
"examples/support/support-lifecycle-filled-example.md",
|
|
50
|
+
"examples/support/support-lifecycle-filled-example.json"
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const forbiddenPackagePathRules = [
|
|
54
|
+
{ name: "repo-local promo assets", pattern: /^promo\// },
|
|
55
|
+
{ name: "repo-local site assets", pattern: /^site\// },
|
|
56
|
+
{ name: "GitHub workflow or issue-template files", pattern: /^\.github\// },
|
|
57
|
+
{ name: "git metadata", pattern: /^\.git(?:\/|$)/ },
|
|
58
|
+
{ name: "dependency or generated caches", pattern: /(^|\/)(?:node_modules|coverage|tmp|temp|\.next|dist-debug)(?:\/|$)/ },
|
|
59
|
+
{ name: "private or secret-named directories", pattern: /(^|\/)(?:private|secrets?|internal)(?:\/|$)/i },
|
|
60
|
+
{ name: "environment or credential files", pattern: /(^|\/)(?:\.env(?:\..*)?|\.npmrc|npm-debug\.log|yarn-error\.log|pnpm-debug\.log|.*\.(?:pem|p12|key))$/i }
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
const unsafeContentPatterns = [
|
|
64
|
+
{ name: "private key block", pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
|
|
65
|
+
{ name: "OpenAI-looking secret key", pattern: /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/ },
|
|
66
|
+
{ name: "Anthropic-looking secret key", pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/ },
|
|
67
|
+
{ name: "GitHub-looking token", pattern: /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/ },
|
|
68
|
+
{ name: "AWS access key id", pattern: /\bAKIA[0-9A-Z]{16}\b/ },
|
|
69
|
+
{ name: "Slack-looking token", pattern: /\bxox[baprs]-[A-Za-z0-9-]{20,}\b/ },
|
|
70
|
+
{ name: "absolute Unix home path", pattern: /(?:^|[\s"'`])\/(?:Users|home)\/[A-Za-z0-9._-]+/ },
|
|
71
|
+
{ name: "absolute Windows user path", pattern: /[A-Za-z]:\\Users\\[A-Za-z0-9._-]+\\/ }
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const pack = dryRunPack();
|
|
75
|
+
const files = new Set(pack.files.map((file) => normalizePath(file.path)));
|
|
76
|
+
|
|
77
|
+
if (pack.name !== packageJson.name) {
|
|
78
|
+
failures.push(`Dry-run package name should be ${packageJson.name}. Saw ${pack.name}.`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (pack.version !== packageJson.version) {
|
|
82
|
+
failures.push(`Dry-run package version should be ${packageJson.version}. Saw ${pack.version}.`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const file of requiredPackageFiles) {
|
|
86
|
+
if (!files.has(file)) {
|
|
87
|
+
failures.push(`Package dry run should include ${file}.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
for (const file of pack.files) {
|
|
92
|
+
const path = normalizePath(file.path);
|
|
93
|
+
for (const rule of forbiddenPackagePathRules) {
|
|
94
|
+
if (rule.pattern.test(path)) {
|
|
95
|
+
failures.push(`Package dry run should exclude ${rule.name}: ${path}.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for (const path of requiredSupportFiles) {
|
|
101
|
+
requireFile(path);
|
|
102
|
+
if (!existsSync(join(root, path))) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const content = read(path);
|
|
107
|
+
for (const unsafe of unsafeContentPatterns) {
|
|
108
|
+
if (unsafe.pattern.test(content)) {
|
|
109
|
+
failures.push(`${path} appears to contain ${unsafe.name}; package support examples must stay public-safe.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
checkInstalledPackageSupport();
|
|
115
|
+
|
|
116
|
+
if (failures.length > 0) {
|
|
117
|
+
console.error("Package contents check failed:");
|
|
118
|
+
for (const failure of failures) {
|
|
119
|
+
console.error(`- ${failure}`);
|
|
120
|
+
}
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
console.log("Package contents check passed.");
|
|
125
|
+
console.log(`PASS package ${pack.name}@${pack.version}`);
|
|
126
|
+
console.log(`PASS support examples included: ${requiredSupportFiles.length} files`);
|
|
127
|
+
console.log("PASS promo, site, GitHub workflow, cache, private, and credential-shaped files excluded");
|
|
128
|
+
|
|
129
|
+
function checkInstalledPackageSupport() {
|
|
130
|
+
const path = "examples/support/installed-package-support.json";
|
|
131
|
+
if (!existsSync(join(root, path))) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const note = readJson(path);
|
|
136
|
+
const expectedArtifacts = [
|
|
137
|
+
"examples/support/support-examples-index.md",
|
|
138
|
+
"examples/support/support-examples-quickstart.md",
|
|
139
|
+
"examples/support/support-lifecycle-map.md",
|
|
140
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
141
|
+
"examples/support/support-lifecycle-filled-example.md"
|
|
142
|
+
];
|
|
143
|
+
const expectedRepoOnlyPaths = ["promo/", "site/", ".github/", "private/", "secrets/", "internal/"];
|
|
144
|
+
|
|
145
|
+
if (note.packageName !== packageJson.name) {
|
|
146
|
+
failures.push(`${path}.packageName should be ${packageJson.name}.`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (note.verifyCommand !== "npm explore memento-mori-jester -- npm run pack:contents:check") {
|
|
150
|
+
failures.push(`${path}.verifyCommand should run the package contents check through npm explore.`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!Array.isArray(note.packageRelativeArtifacts) || note.packageRelativeArtifacts.join("|") !== expectedArtifacts.join("|")) {
|
|
154
|
+
failures.push(`${path}.packageRelativeArtifacts should list the checked package support artifacts in order.`);
|
|
155
|
+
} else {
|
|
156
|
+
for (const artifact of note.packageRelativeArtifacts) {
|
|
157
|
+
if (!files.has(artifact)) {
|
|
158
|
+
failures.push(`${path}.packageRelativeArtifacts references ${artifact}, but it is not in the package dry run.`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!Array.isArray(note.repoOnlyPathsNotRequired)) {
|
|
164
|
+
failures.push(`${path}.repoOnlyPathsNotRequired should be an array.`);
|
|
165
|
+
} else {
|
|
166
|
+
for (const repoOnlyPath of expectedRepoOnlyPaths) {
|
|
167
|
+
if (!note.repoOnlyPathsNotRequired.includes(repoOnlyPath)) {
|
|
168
|
+
failures.push(`${path}.repoOnlyPathsNotRequired should include ${repoOnlyPath}.`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
for (const file of files) {
|
|
172
|
+
if (file.startsWith(repoOnlyPath)) {
|
|
173
|
+
failures.push(`${path}.repoOnlyPathsNotRequired lists ${repoOnlyPath}, but ${file} is present in the package dry run.`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function dryRunPack() {
|
|
181
|
+
const output = runNpm(["pack", "--dry-run", "--json", "--ignore-scripts"]);
|
|
182
|
+
const parsed = parsePackJson(output);
|
|
183
|
+
if (!Array.isArray(parsed) || parsed.length !== 1 || typeof parsed[0] !== "object") {
|
|
184
|
+
fail("npm pack --dry-run --json should return one package entry.");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const [pack] = parsed;
|
|
188
|
+
if (!Array.isArray(pack.files)) {
|
|
189
|
+
fail("npm pack --dry-run --json output should include a files array.");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return pack;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function parsePackJson(output) {
|
|
196
|
+
const trimmed = output.trim();
|
|
197
|
+
if (!trimmed) {
|
|
198
|
+
fail("npm pack --dry-run --json returned no output.");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
try {
|
|
202
|
+
return JSON.parse(trimmed);
|
|
203
|
+
} catch {
|
|
204
|
+
const start = trimmed.indexOf("[");
|
|
205
|
+
const end = trimmed.lastIndexOf("]");
|
|
206
|
+
if (start >= 0 && end > start) {
|
|
207
|
+
return JSON.parse(trimmed.slice(start, end + 1));
|
|
208
|
+
}
|
|
209
|
+
fail(`Could not parse npm pack JSON output:\n${trimmed}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function read(path) {
|
|
214
|
+
return readFileSync(join(root, path), "utf8");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function readJson(path) {
|
|
218
|
+
return JSON.parse(read(path));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function requireFile(path) {
|
|
222
|
+
if (!existsSync(join(root, path))) {
|
|
223
|
+
failures.push(`${path} is missing.`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function normalizePath(path) {
|
|
228
|
+
return path.replaceAll("\\", "/");
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function runNpm(commandArgs) {
|
|
232
|
+
if (npmExecPath) {
|
|
233
|
+
return run(process.execPath, [npmExecPath, ...commandArgs]);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return run(npmCommand, commandArgs);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function run(command, commandArgs) {
|
|
240
|
+
const result = spawnSync(command, commandArgs, {
|
|
241
|
+
cwd: root,
|
|
242
|
+
encoding: "utf8",
|
|
243
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
244
|
+
env: {
|
|
245
|
+
...process.env,
|
|
246
|
+
npm_config_audit: "false",
|
|
247
|
+
npm_config_fund: "false"
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
if (result.error) {
|
|
252
|
+
throw result.error;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (result.status !== 0) {
|
|
256
|
+
const detail = [result.stdout, result.stderr].filter(Boolean).join("\n").trim();
|
|
257
|
+
fail(`${command} ${commandArgs.join(" ")} failed${detail ? `:\n${detail}` : "."}`);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return result.stdout;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function fail(message) {
|
|
264
|
+
throw new Error(message);
|
|
265
|
+
}
|
|
@@ -72,6 +72,7 @@ for (const path of [
|
|
|
72
72
|
"scripts/doctor-framework-tuning.mjs",
|
|
73
73
|
"scripts/check-ci-adoption.mjs",
|
|
74
74
|
"scripts/check-consumer-quickstart.mjs",
|
|
75
|
+
"scripts/check-package-contents.mjs",
|
|
75
76
|
"scripts/check-report-gallery.mjs",
|
|
76
77
|
"scripts/check-support-triage.mjs",
|
|
77
78
|
"scripts/check-fixtures.mjs",
|
|
@@ -100,6 +101,8 @@ for (const path of [
|
|
|
100
101
|
"examples/support/backlog-records.json",
|
|
101
102
|
"examples/support/closeout-checklist.md",
|
|
102
103
|
"examples/support/closeout-checklist.json",
|
|
104
|
+
"examples/support/installed-package-support.md",
|
|
105
|
+
"examples/support/installed-package-support.json",
|
|
103
106
|
"examples/support/outcome-prioritization.md",
|
|
104
107
|
"examples/support/outcome-prioritization.json",
|
|
105
108
|
"examples/support/response-snippets.md",
|
|
@@ -148,6 +151,7 @@ requireText("README.md", /feedback-template\.md/, "report gallery feedback templ
|
|
|
148
151
|
requireText("README.md", /examples\/support/, "support triage playbook link");
|
|
149
152
|
requireText("README.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
150
153
|
requireText("README.md", /support-examples-index\.md/, "support examples index link");
|
|
154
|
+
requireText("README.md", /installed-package-support\.md/, "installed package support link");
|
|
151
155
|
requireText("README.md", /response-snippets\.md/, "support response snippets link");
|
|
152
156
|
requireText("README.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
153
157
|
requireText("README.md", /support-lifecycle-map\.md/, "support lifecycle map link");
|
|
@@ -157,6 +161,7 @@ requireText("README.md", /support-lifecycle\.md/, "support lifecycle overview li
|
|
|
157
161
|
requireText("README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
|
|
158
162
|
requireText("README.md", /backlog-review\.md/, "support backlog review link");
|
|
159
163
|
requireText("README.md", /backlog-records\.md/, "support backlog records link");
|
|
164
|
+
requireText("README.md", /pack:contents:check/, "package contents check guidance");
|
|
160
165
|
requireText("README.md", /report gallery feedback/i, "report gallery feedback guidance");
|
|
161
166
|
requireText("README.md", /License: PolyForm Noncommercial/, "the noncommercial license badge");
|
|
162
167
|
requireText("docs/PRODUCTION_READINESS.md", /npm package/i, "npm package readiness");
|
|
@@ -180,6 +185,7 @@ requireText("docs/PRODUCTION_READINESS.md", /support:check/, "support triage rea
|
|
|
180
185
|
requireText("docs/PRODUCTION_READINESS.md", /examples\/support/, "support triage playbook readiness");
|
|
181
186
|
requireText("docs/PRODUCTION_READINESS.md", /support examples quickstart/i, "support examples quickstart readiness");
|
|
182
187
|
requireText("docs/PRODUCTION_READINESS.md", /support examples index/i, "support examples index readiness");
|
|
188
|
+
requireText("docs/PRODUCTION_READINESS.md", /installed-package support/i, "installed package support readiness");
|
|
183
189
|
requireText("docs/PRODUCTION_READINESS.md", /response snippets/i, "support response snippets readiness");
|
|
184
190
|
requireText("docs/PRODUCTION_READINESS.md", /closeout checklist/i, "support closeout checklist readiness");
|
|
185
191
|
requireText("docs/PRODUCTION_READINESS.md", /support lifecycle overview/i, "support lifecycle overview readiness");
|
|
@@ -189,6 +195,8 @@ requireText("docs/PRODUCTION_READINESS.md", /filled worksheet example/i, "filled
|
|
|
189
195
|
requireText("docs/PRODUCTION_READINESS.md", /outcome prioritization guide/i, "support outcome prioritization readiness");
|
|
190
196
|
requireText("docs/PRODUCTION_READINESS.md", /backlog review/i, "support backlog review readiness");
|
|
191
197
|
requireText("docs/PRODUCTION_READINESS.md", /backlog records/i, "support backlog records readiness");
|
|
198
|
+
requireText("docs/PRODUCTION_READINESS.md", /pack:contents:check/, "package contents check readiness");
|
|
199
|
+
requireText("docs/PRODUCTION_READINESS.md", /support examples manifest/i, "support examples manifest package readiness");
|
|
192
200
|
requireText("docs/PRODUCTION_READINESS.md", /quiet-pass/, "quiet-pass fixture readiness");
|
|
193
201
|
requireText("docs/CLI.md", /jester doctor --json/, "doctor JSON CLI docs");
|
|
194
202
|
requireText("docs/CLI.md", /quiet-pass fixture/, "quiet-pass fixture CLI docs");
|
|
@@ -215,6 +223,7 @@ requireText("docs/MAINTAINER_TRIAGE.md", /report_gallery_feedback\.yml/, "report
|
|
|
215
223
|
requireText("docs/MAINTAINER_TRIAGE.md", /examples\/support/, "support triage playbook link");
|
|
216
224
|
requireText("docs/MAINTAINER_TRIAGE.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
217
225
|
requireText("docs/MAINTAINER_TRIAGE.md", /support-examples-index\.md/, "support examples index link");
|
|
226
|
+
requireText("docs/MAINTAINER_TRIAGE.md", /installed-package-support\.md/, "installed package support link");
|
|
218
227
|
requireText("docs/MAINTAINER_TRIAGE.md", /response-snippets\.md/, "support response snippets link");
|
|
219
228
|
requireText("docs/MAINTAINER_TRIAGE.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
220
229
|
requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle-map\.md/, "support lifecycle map link");
|
|
@@ -258,6 +267,8 @@ requireText("examples/reports/feedback-template.md", /SECURITY\.md/, "feedback t
|
|
|
258
267
|
requireText("examples/support/README.md", /triage-playbook\.json/, "support triage playbook JSON link");
|
|
259
268
|
requireText("examples/support/README.md", /response-snippets\.md/, "support response snippets link");
|
|
260
269
|
requireText("examples/support/README.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
270
|
+
requireText("examples/support/README.md", /installed-package-support\.md/, "installed package support link");
|
|
271
|
+
requireText("examples/support/README.md", /installed-package-support\.json/, "installed package support JSON link");
|
|
261
272
|
requireText("examples/support/README.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
262
273
|
requireText("examples/support/README.md", /support-examples-quickstart\.json/, "support examples quickstart JSON link");
|
|
263
274
|
requireText("examples/support/README.md", /support-examples-index\.md/, "support examples index link");
|
|
@@ -291,6 +302,13 @@ requireText("examples/support/closeout-checklist.md", /candidate-opened/, "suppo
|
|
|
291
302
|
requireText("examples/support/closeout-checklist.json", /docs-clarification-closeout/, "support docs closeout record");
|
|
292
303
|
requireText("examples/support/closeout-checklist.json", /fixture-backlog-closeout/, "support fixture closeout record");
|
|
293
304
|
requireText("examples/support/closeout-checklist.json", /rule-review-closeout/, "support rule-review closeout record");
|
|
305
|
+
requireText("examples/support/installed-package-support.md", /Installed Package Support Examples/, "installed package support heading");
|
|
306
|
+
requireText("examples/support/installed-package-support.md", /npm explore memento-mori-jester -- npm run pack:contents:check/, "installed package support verify command");
|
|
307
|
+
requireText("examples/support/installed-package-support.md", /support-examples-index\.md/, "installed package support index path");
|
|
308
|
+
requireText("examples/support/installed-package-support.md", /repo-only `promo\/`, `site\/`, `\.github\/`/, "installed package support repo-only exclusions");
|
|
309
|
+
requireText("examples/support/installed-package-support.json", /Installed Package Support Examples/, "installed package support JSON title");
|
|
310
|
+
requireText("examples/support/installed-package-support.json", /packageRelativeArtifacts/, "installed package support package-relative artifacts");
|
|
311
|
+
requireText("examples/support/installed-package-support.json", /repoOnlyPathsNotRequired/, "installed package support repo-only exclusions JSON");
|
|
294
312
|
requireText("examples/support/support-examples-quickstart.md", /Support Examples Quickstart/, "support examples quickstart heading");
|
|
295
313
|
requireText("examples/support/support-examples-quickstart.md", /support-examples-quickstart\.json/, "support examples quickstart JSON link");
|
|
296
314
|
requireText("examples/support/support-examples-quickstart.md", /60-Second Path/, "support examples quickstart path");
|
|
@@ -309,6 +327,8 @@ requireText("examples/support/support-examples-quickstart.json", /npm run produc
|
|
|
309
327
|
requireText("examples/support/support-examples-index.md", /Support Examples Index/, "support examples index heading");
|
|
310
328
|
requireText("examples/support/support-examples-index.md", /support-examples-index\.json/, "support examples index JSON link");
|
|
311
329
|
requireText("examples/support/support-examples-index.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
330
|
+
requireText("examples/support/support-examples-index.md", /installed-package-support\.md/, "installed package support index link");
|
|
331
|
+
requireText("examples/support/support-examples-index.md", /Installed Package Provenance/, "installed package support provenance section");
|
|
312
332
|
requireText("examples/support/support-examples-index.md", /support-lifecycle-map\.md/, "support examples index map link");
|
|
313
333
|
requireText("examples/support/support-examples-index.md", /support-lifecycle-worksheet\.md/, "support examples index worksheet link");
|
|
314
334
|
requireText("examples/support/support-examples-index.md", /support-lifecycle-filled-example\.md/, "support examples index filled example link");
|
|
@@ -318,6 +338,8 @@ requireText("examples/support/support-examples-index.md", /SECURITY\.md/, "suppo
|
|
|
318
338
|
requireText("examples/support/support-examples-index.json", /Support Examples Index/, "support examples index JSON title");
|
|
319
339
|
requireText("examples/support/support-examples-index.json", /support-examples-quickstart\.md/, "support examples index JSON quickstart link");
|
|
320
340
|
requireText("examples/support/support-examples-index.json", /support-examples-quickstart\.json/, "support examples index JSON quickstart source");
|
|
341
|
+
requireText("examples/support/support-examples-index.json", /installedPackageProvenance/, "installed package support provenance JSON");
|
|
342
|
+
requireText("examples/support/support-examples-index.json", /installed-package-support\.md/, "installed package support JSON link");
|
|
321
343
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-map\.md/, "support examples index JSON map link");
|
|
322
344
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-worksheet\.md/, "support examples index JSON worksheet link");
|
|
323
345
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-filled-example\.md/, "support examples index JSON filled example link");
|
|
@@ -434,6 +456,14 @@ requireText("scripts/check-ci-adoption.mjs", /framework:tuning:doctor/, "adoptio
|
|
|
434
456
|
requireText("scripts/check-consumer-quickstart.mjs", /consumer-quickstart/, "consumer quickstart checker target");
|
|
435
457
|
requireText("scripts/check-consumer-quickstart.mjs", /memento-mori-jester@latest/, "consumer quickstart registry verification option");
|
|
436
458
|
requireText("scripts/check-consumer-quickstart.mjs", /framework:tuning:doctor/, "consumer quickstart tuning doctor guard");
|
|
459
|
+
requireText("scripts/check-package-contents.mjs", /support-examples-index\.md/, "package contents support examples index guard");
|
|
460
|
+
requireText("scripts/check-package-contents.mjs", /installed-package-support\.md/, "package contents installed package support guard");
|
|
461
|
+
requireText("scripts/check-package-contents.mjs", /npm explore memento-mori-jester -- npm run pack:contents:check/, "package contents installed package verify command");
|
|
462
|
+
requireText("scripts/check-package-contents.mjs", /support-examples-quickstart\.md/, "package contents support examples quickstart guard");
|
|
463
|
+
requireText("scripts/check-package-contents.mjs", /support-lifecycle-map\.md/, "package contents support lifecycle map guard");
|
|
464
|
+
requireText("scripts/check-package-contents.mjs", /support-lifecycle-worksheet\.md/, "package contents support lifecycle worksheet guard");
|
|
465
|
+
requireText("scripts/check-package-contents.mjs", /support-lifecycle-filled-example\.md/, "package contents filled worksheet example guard");
|
|
466
|
+
requireText("scripts/check-package-contents.mjs", /promo|site|private|credential/, "package contents forbidden file guard");
|
|
437
467
|
requireText("scripts/check-report-gallery.mjs", /report-gallery\.json/, "report gallery checker target");
|
|
438
468
|
requireText("scripts/check-report-gallery.mjs", /memento-mori-jester@latest/, "report gallery registry verification option");
|
|
439
469
|
requireText("scripts/check-report-gallery.mjs", /destructive-command-summary/, "report gallery summary guard");
|
|
@@ -442,6 +472,7 @@ requireText("scripts/check-support-triage.mjs", /feedback-template\.md/, "suppor
|
|
|
442
472
|
requireText("scripts/check-support-triage.mjs", /triage-playbook\.json/, "support triage playbook guard");
|
|
443
473
|
requireText("scripts/check-support-triage.mjs", /response-snippets\.json/, "support response snippets guard");
|
|
444
474
|
requireText("scripts/check-support-triage.mjs", /closeout-checklist\.json/, "support closeout checklist guard");
|
|
475
|
+
requireText("scripts/check-support-triage.mjs", /installed-package-support\.json/, "installed package support guard");
|
|
445
476
|
requireText("scripts/check-support-triage.mjs", /support-examples-quickstart\.json/, "support examples quickstart guard");
|
|
446
477
|
requireText("scripts/check-support-triage.mjs", /support-examples-index\.json/, "support examples index guard");
|
|
447
478
|
requireText("scripts/check-support-triage.mjs", /support-lifecycle\.json/, "support lifecycle overview guard");
|
|
@@ -460,6 +491,8 @@ requireText("package.json", /"ci:adoption:check": "node scripts\/check-ci-adopti
|
|
|
460
491
|
requireText("package.json", /"consumer:quickstart:check": "node scripts\/check-consumer-quickstart\.mjs"/, "consumer quickstart check script");
|
|
461
492
|
requireText("package.json", /"reports:check": "node scripts\/check-report-gallery\.mjs"/, "report gallery check script");
|
|
462
493
|
requireText("package.json", /"support:check": "node scripts\/check-support-triage\.mjs"/, "support triage check script");
|
|
494
|
+
requireText("package.json", /"pack:contents:check": "node scripts\/check-package-contents\.mjs"/, "package contents check script");
|
|
495
|
+
requireText("package.json", /"pack:dry": "npm pack --dry-run && npm run pack:contents:check"/, "package dry run contents guard");
|
|
463
496
|
requireText("package.json", /"promo:card": "node scripts\/render-social-card\.mjs"/, "social card render script");
|
|
464
497
|
requireText("package.json", /"promo:card:check": "node scripts\/render-social-card\.mjs --check"/, "social card stale check script");
|
|
465
498
|
requireText("package.json", /"promo:check": "node scripts\/check-promo-freshness\.mjs"/, "promo freshness check script");
|
|
@@ -474,6 +507,7 @@ requireText("package.json", /npm run reports:check/, "report gallery check in np
|
|
|
474
507
|
requireText("package.json", /npm run support:check/, "support triage check in npm test");
|
|
475
508
|
requireText("package.json", /npm run promo:check/, "promo freshness check in npm test");
|
|
476
509
|
requireText("package.json", /npm run site:check/, "site check in npm test");
|
|
510
|
+
requireText("package.json", /npm run pack:contents:check/, "package contents check in npm test");
|
|
477
511
|
requireText("scripts/check-promo-freshness.mjs", /--require-package-version/, "optional strict package-version promo check");
|
|
478
512
|
requireText("scripts/check-promo-freshness.mjs", /social-card\.svg/, "social-card freshness check");
|
|
479
513
|
requireText("scripts/check-site.mjs", /site\/index\.html/, "site index check");
|
|
@@ -31,6 +31,8 @@ const supportFiles = [
|
|
|
31
31
|
"examples/support/backlog-records.json",
|
|
32
32
|
"examples/support/closeout-checklist.md",
|
|
33
33
|
"examples/support/closeout-checklist.json",
|
|
34
|
+
"examples/support/installed-package-support.md",
|
|
35
|
+
"examples/support/installed-package-support.json",
|
|
34
36
|
"examples/support/outcome-prioritization.md",
|
|
35
37
|
"examples/support/outcome-prioritization.json",
|
|
36
38
|
"examples/support/README.md",
|
|
@@ -100,6 +102,8 @@ requireText("examples/reports/README.md", /examples\/support|Maintainer Triage P
|
|
|
100
102
|
requireText("examples/support/README.md", /Maintainer Triage Playbook/, "maintainer playbook heading");
|
|
101
103
|
requireText("examples/support/README.md", /backlog-review\.md/, "support backlog review link");
|
|
102
104
|
requireText("examples/support/README.md", /backlog-records\.md/, "support backlog records link");
|
|
105
|
+
requireText("examples/support/README.md", /installed-package-support\.md/, "installed package support link");
|
|
106
|
+
requireText("examples/support/README.md", /installed-package-support\.json/, "installed package support JSON link");
|
|
103
107
|
requireText("examples/support/README.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
104
108
|
requireText("examples/support/README.md", /support-examples-quickstart\.json/, "support examples quickstart JSON link");
|
|
105
109
|
requireText("examples/support/README.md", /support-examples-index\.md/, "support examples index link");
|
|
@@ -138,6 +142,20 @@ requireText("examples/support/closeout-checklist.md", /SECURITY\.md/, "closeout
|
|
|
138
142
|
requireText("examples/support/closeout-checklist.json", /docs-clarification-closeout/, "docs closeout record");
|
|
139
143
|
requireText("examples/support/closeout-checklist.json", /fixture-backlog-closeout/, "fixture closeout record");
|
|
140
144
|
requireText("examples/support/closeout-checklist.json", /rule-review-closeout/, "rule-review closeout record");
|
|
145
|
+
requireText("examples/support/installed-package-support.md", /Installed Package Support Examples/, "installed package support heading");
|
|
146
|
+
requireText("examples/support/installed-package-support.md", /installed-package-support\.json/, "installed package support JSON link");
|
|
147
|
+
requireText("examples/support/installed-package-support.md", /npm explore memento-mori-jester -- npm run pack:contents:check/, "installed package verify command");
|
|
148
|
+
requireText("examples/support/installed-package-support.md", /examples\/support\/support-examples-index\.md/, "installed package support index path");
|
|
149
|
+
requireText("examples/support/installed-package-support.md", /examples\/support\/support-examples-quickstart\.md/, "installed package support quickstart path");
|
|
150
|
+
requireText("examples/support/installed-package-support.md", /examples\/support\/support-lifecycle-map\.md/, "installed package support map path");
|
|
151
|
+
requireText("examples/support/installed-package-support.md", /examples\/support\/support-lifecycle-worksheet\.md/, "installed package support worksheet path");
|
|
152
|
+
requireText("examples/support/installed-package-support.md", /examples\/support\/support-lifecycle-filled-example\.md/, "installed package filled example path");
|
|
153
|
+
requireText("examples/support/installed-package-support.md", /promo\/|site\/|\.github\/|private|secret|credential-shaped/, "installed package repo-only exclusions");
|
|
154
|
+
requireText("examples/support/installed-package-support.md", /SECURITY\.md/, "installed package security redirect");
|
|
155
|
+
requireText("examples/support/installed-package-support.json", /Installed Package Support Examples/, "installed package support JSON title");
|
|
156
|
+
requireText("examples/support/installed-package-support.json", /memento-mori-jester/, "installed package support package name");
|
|
157
|
+
requireText("examples/support/installed-package-support.json", /pack:contents:check/, "installed package contents check");
|
|
158
|
+
requireText("examples/support/installed-package-support.json", /support-examples-index\.md/, "installed package JSON support index path");
|
|
141
159
|
requireText("examples/support/support-examples-quickstart.md", /Support Examples Quickstart/, "support examples quickstart heading");
|
|
142
160
|
requireText("examples/support/support-examples-quickstart.md", /support-examples-quickstart\.json/, "support examples quickstart JSON link");
|
|
143
161
|
requireText("examples/support/support-examples-quickstart.md", /60-Second Path/, "support examples quickstart path");
|
|
@@ -160,6 +178,8 @@ requireText("examples/support/support-examples-quickstart.json", /closed-no-acti
|
|
|
160
178
|
requireText("examples/support/support-examples-index.md", /Support Examples Index/, "support examples index heading");
|
|
161
179
|
requireText("examples/support/support-examples-index.md", /support-examples-index\.json/, "support examples index JSON link");
|
|
162
180
|
requireText("examples/support/support-examples-index.md", /support-examples-quickstart\.md/, "support examples quickstart link");
|
|
181
|
+
requireText("examples/support/support-examples-index.md", /installed-package-support\.md/, "installed package support link");
|
|
182
|
+
requireText("examples/support/support-examples-index.md", /Installed Package Provenance/, "installed package provenance section");
|
|
163
183
|
requireText("examples/support/support-examples-index.md", /60-Second Handoff/, "support examples index handoff section");
|
|
164
184
|
requireText("examples/support/support-examples-index.md", /support-lifecycle-map\.md/, "support examples index map link");
|
|
165
185
|
requireText("examples/support/support-examples-index.md", /support-lifecycle-worksheet\.md/, "support examples index worksheet link");
|
|
@@ -173,6 +193,8 @@ requireText("examples/support/support-examples-index.md", /npm run support:check
|
|
|
173
193
|
requireText("examples/support/support-examples-index.json", /Support Examples Index/, "support examples index JSON title");
|
|
174
194
|
requireText("examples/support/support-examples-index.json", /support-examples-quickstart\.md/, "support examples index JSON quickstart link");
|
|
175
195
|
requireText("examples/support/support-examples-index.json", /support-examples-quickstart\.json/, "support examples index JSON quickstart source");
|
|
196
|
+
requireText("examples/support/support-examples-index.json", /installed-package-support\.md/, "installed package support JSON link");
|
|
197
|
+
requireText("examples/support/support-examples-index.json", /pack:contents:check/, "installed package support JSON verify command");
|
|
176
198
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-map\.md/, "support examples index JSON map link");
|
|
177
199
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-worksheet\.md/, "support examples index JSON worksheet link");
|
|
178
200
|
requireText("examples/support/support-examples-index.json", /support-lifecycle-filled-example\.md/, "support examples index JSON filled example link");
|
|
@@ -360,6 +382,7 @@ requireText("package.json", /npm run support:check/, "support checker in npm tes
|
|
|
360
382
|
checkTriagePlaybook();
|
|
361
383
|
checkResponseSnippets();
|
|
362
384
|
checkCloseoutChecklist();
|
|
385
|
+
checkInstalledPackageSupport();
|
|
363
386
|
checkSupportExamplesQuickstart();
|
|
364
387
|
checkSupportExamplesIndex();
|
|
365
388
|
checkSupportLifecycleWorksheet();
|
|
@@ -971,6 +994,27 @@ function checkSupportExamplesIndex() {
|
|
|
971
994
|
return;
|
|
972
995
|
}
|
|
973
996
|
|
|
997
|
+
const expectedPackageArtifacts = [
|
|
998
|
+
"examples/support/support-examples-index.md",
|
|
999
|
+
"examples/support/support-examples-quickstart.md",
|
|
1000
|
+
"examples/support/support-lifecycle-map.md",
|
|
1001
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
1002
|
+
"examples/support/support-lifecycle-filled-example.md"
|
|
1003
|
+
];
|
|
1004
|
+
const expectedRepoOnlyPaths = [
|
|
1005
|
+
"promo/",
|
|
1006
|
+
"site/",
|
|
1007
|
+
".github/",
|
|
1008
|
+
"private/",
|
|
1009
|
+
"secrets/",
|
|
1010
|
+
"internal/",
|
|
1011
|
+
"node_modules/",
|
|
1012
|
+
"coverage/",
|
|
1013
|
+
"tmp/",
|
|
1014
|
+
"temp/",
|
|
1015
|
+
".env",
|
|
1016
|
+
".npmrc"
|
|
1017
|
+
];
|
|
974
1018
|
const expectedArtifacts = [
|
|
975
1019
|
{
|
|
976
1020
|
id: "lifecycle-map",
|
|
@@ -1045,6 +1089,40 @@ function checkSupportExamplesIndex() {
|
|
|
1045
1089
|
}
|
|
1046
1090
|
}
|
|
1047
1091
|
|
|
1092
|
+
if (index.installedPackageProvenance?.file !== "examples/support/installed-package-support.md") {
|
|
1093
|
+
failures.push(`${path}.installedPackageProvenance.file should point at examples/support/installed-package-support.md.`);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
if (index.installedPackageProvenance?.source !== "examples/support/installed-package-support.json") {
|
|
1097
|
+
failures.push(`${path}.installedPackageProvenance.source should point at examples/support/installed-package-support.json.`);
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
if (index.installedPackageProvenance?.verifyCommand !== "npm explore memento-mori-jester -- npm run pack:contents:check") {
|
|
1101
|
+
failures.push(`${path}.installedPackageProvenance.verifyCommand should run the package contents check through npm explore.`);
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
if (index.installedPackageProvenance?.publicSafe !== true) {
|
|
1105
|
+
failures.push(`${path}.installedPackageProvenance should be publicSafe.`);
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
if (typeof index.installedPackageProvenance?.useWhen !== "string" || index.installedPackageProvenance.useWhen.length < 60) {
|
|
1109
|
+
failures.push(`${path}.installedPackageProvenance.useWhen should explain installed-package use.`);
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
if (!Array.isArray(index.installedPackageProvenance?.packageRelativeArtifacts) || index.installedPackageProvenance.packageRelativeArtifacts.join("|") !== expectedPackageArtifacts.join("|")) {
|
|
1113
|
+
failures.push(`${path}.installedPackageProvenance.packageRelativeArtifacts should list the package support artifacts in order.`);
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
if (!Array.isArray(index.installedPackageProvenance?.repoOnlyPathsNotRequired)) {
|
|
1117
|
+
failures.push(`${path}.installedPackageProvenance.repoOnlyPathsNotRequired should be an array.`);
|
|
1118
|
+
} else {
|
|
1119
|
+
for (const repoOnlyPath of expectedRepoOnlyPaths) {
|
|
1120
|
+
if (!index.installedPackageProvenance.repoOnlyPathsNotRequired.includes(repoOnlyPath)) {
|
|
1121
|
+
failures.push(`${path}.installedPackageProvenance.repoOnlyPathsNotRequired should include ${repoOnlyPath}.`);
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1048
1126
|
if (!Array.isArray(index.artifacts) || index.artifacts.length !== expectedArtifacts.length) {
|
|
1049
1127
|
failures.push(`${path}.artifacts should contain exactly three indexed support artifacts.`);
|
|
1050
1128
|
} else {
|
|
@@ -1136,6 +1214,128 @@ function checkSupportExamplesIndex() {
|
|
|
1136
1214
|
}
|
|
1137
1215
|
}
|
|
1138
1216
|
|
|
1217
|
+
function checkInstalledPackageSupport() {
|
|
1218
|
+
const path = "examples/support/installed-package-support.json";
|
|
1219
|
+
const note = readJson(path);
|
|
1220
|
+
if (!note) {
|
|
1221
|
+
return;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
const expectedArtifacts = [
|
|
1225
|
+
"examples/support/support-examples-index.md",
|
|
1226
|
+
"examples/support/support-examples-quickstart.md",
|
|
1227
|
+
"examples/support/support-lifecycle-map.md",
|
|
1228
|
+
"examples/support/support-lifecycle-worksheet.md",
|
|
1229
|
+
"examples/support/support-lifecycle-filled-example.md"
|
|
1230
|
+
];
|
|
1231
|
+
const expectedRepoOnlyPaths = [
|
|
1232
|
+
"promo/",
|
|
1233
|
+
"site/",
|
|
1234
|
+
".github/",
|
|
1235
|
+
"private/",
|
|
1236
|
+
"secrets/",
|
|
1237
|
+
"internal/",
|
|
1238
|
+
"node_modules/",
|
|
1239
|
+
"coverage/",
|
|
1240
|
+
"tmp/",
|
|
1241
|
+
"temp/",
|
|
1242
|
+
".env",
|
|
1243
|
+
".npmrc"
|
|
1244
|
+
];
|
|
1245
|
+
const expectedSteps = [
|
|
1246
|
+
{
|
|
1247
|
+
id: "install-package",
|
|
1248
|
+
command: "npm install --save-dev memento-mori-jester"
|
|
1249
|
+
},
|
|
1250
|
+
{
|
|
1251
|
+
id: "verify-package-contents",
|
|
1252
|
+
command: "npm explore memento-mori-jester -- npm run pack:contents:check"
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
id: "open-support-index",
|
|
1256
|
+
artifact: "examples/support/support-examples-index.md"
|
|
1257
|
+
}
|
|
1258
|
+
];
|
|
1259
|
+
|
|
1260
|
+
if (note.title !== "Installed Package Support Examples") {
|
|
1261
|
+
failures.push(`${path}.title should be Installed Package Support Examples.`);
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
if (note.packageName !== "memento-mori-jester") {
|
|
1265
|
+
failures.push(`${path}.packageName should be memento-mori-jester.`);
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
if (note.verifyCommand !== "npm explore memento-mori-jester -- npm run pack:contents:check") {
|
|
1269
|
+
failures.push(`${path}.verifyCommand should run the package contents check through npm explore.`);
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
if (note.packageRelativeRoot !== "examples/support") {
|
|
1273
|
+
failures.push(`${path}.packageRelativeRoot should be examples/support.`);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
if (typeof note.useWhen !== "string" || note.useWhen.length < 75) {
|
|
1277
|
+
failures.push(`${path}.useWhen should explain installed-package support usage.`);
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
if (!Array.isArray(note.packageRelativeArtifacts) || note.packageRelativeArtifacts.join("|") !== expectedArtifacts.join("|")) {
|
|
1281
|
+
failures.push(`${path}.packageRelativeArtifacts should list the checked package support artifacts in order.`);
|
|
1282
|
+
} else {
|
|
1283
|
+
for (const artifact of note.packageRelativeArtifacts) {
|
|
1284
|
+
if (/^(?:promo|site|\.github|private|secrets?|internal)\//i.test(artifact)) {
|
|
1285
|
+
failures.push(`${path}.packageRelativeArtifacts should not reference repo-only path ${artifact}.`);
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
if (!Array.isArray(note.steps) || note.steps.length !== expectedSteps.length) {
|
|
1291
|
+
failures.push(`${path}.steps should contain exactly three installed-package steps.`);
|
|
1292
|
+
} else {
|
|
1293
|
+
for (const [index, step] of note.steps.entries()) {
|
|
1294
|
+
const expected = expectedSteps[index];
|
|
1295
|
+
if (step?.id !== expected.id) {
|
|
1296
|
+
failures.push(`${path}.steps[${index}].id should be ${expected.id}.`);
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
if (expected.command && step?.command !== expected.command) {
|
|
1300
|
+
failures.push(`${path}.steps[${index}].command should be ${expected.command}.`);
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
if (expected.artifact && step?.artifact !== expected.artifact) {
|
|
1304
|
+
failures.push(`${path}.steps[${index}].artifact should be ${expected.artifact}.`);
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
if (typeof step?.purpose !== "string" || step.purpose.length < 50) {
|
|
1308
|
+
failures.push(`${path}.steps[${index}].purpose should explain the installed-package step.`);
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
if (!Array.isArray(note.repoOnlyPathsNotRequired)) {
|
|
1314
|
+
failures.push(`${path}.repoOnlyPathsNotRequired should be an array.`);
|
|
1315
|
+
} else {
|
|
1316
|
+
for (const repoOnlyPath of expectedRepoOnlyPaths) {
|
|
1317
|
+
if (!note.repoOnlyPathsNotRequired.includes(repoOnlyPath)) {
|
|
1318
|
+
failures.push(`${path}.repoOnlyPathsNotRequired should include ${repoOnlyPath}.`);
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
const requiredChecks = ["npm run support:check", "npm run pack:contents:check", "npm run production:check"];
|
|
1324
|
+
if (!Array.isArray(note.requiredChecks)) {
|
|
1325
|
+
failures.push(`${path}.requiredChecks should be an array.`);
|
|
1326
|
+
} else {
|
|
1327
|
+
for (const check of requiredChecks) {
|
|
1328
|
+
if (!note.requiredChecks.includes(check)) {
|
|
1329
|
+
failures.push(`${path}.requiredChecks should include ${check}.`);
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
if (typeof note.privacyGuardrail !== "string" || !/package-relative|secrets|private|SECURITY\.md|MCP|exploitable/i.test(note.privacyGuardrail)) {
|
|
1335
|
+
failures.push(`${path}.privacyGuardrail should include installed-package public-safe guidance.`);
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1139
1339
|
function checkSupportExamplesQuickstart() {
|
|
1140
1340
|
const path = "examples/support/support-examples-quickstart.json";
|
|
1141
1341
|
const quickstart = readJson(path);
|