@hadden-industries/markdown-quality 0.1.0-alpha.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -5
- package/SECURITY.md +40 -0
- package/docs/ci-trust.md +19 -4
- package/docs/consumer-guide.md +5 -2
- package/docs/support-and-release.md +29 -5
- package/package.json +4 -3
- package/src/formatting.js +4 -0
package/README.md
CHANGED
|
@@ -4,11 +4,9 @@ This package supplies one CLI and library for Markdown layout, sentence lines, G
|
|
|
4
4
|
Consumers declare their authored-document scope in `.markdown-quality.json`.
|
|
5
5
|
The package preserves the existing AGPL-3.0-only license.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Alpha.3 corrects the archive header and retains every native executable/source/notice byte.
|
|
11
|
-
The corrected public tuple requires fresh registry qualification before use; both accepted pilots and recovery evidence still block stable v1.0.
|
|
7
|
+
Core and platform packages share one exact release version.
|
|
8
|
+
Install a release after its coordinated tuple passes registry and consumer qualification.
|
|
9
|
+
Registry publication and promotion to `latest` are separate outcomes.
|
|
12
10
|
|
|
13
11
|
```sh
|
|
14
12
|
markdown-quality check --root /path/to/repository
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Security policy
|
|
2
|
+
|
|
3
|
+
Before stable promotion, security support covers only the single candidate designated by npm's `pilot` tag.
|
|
4
|
+
After stable promotion, it covers only the latest stable release designated by `latest`, unless an explicit policy accepts another line.
|
|
5
|
+
Consumers should pin exact versions and qualify upgrades.
|
|
6
|
+
Older releases remaining downloadable does not imply maintenance or backport support.
|
|
7
|
+
The supported runtime is Node 24.21.0 on Windows x64 and Ubuntu 24.04 x64 with glibc 2.39, with the qualified core/native tuple and explicit preset.
|
|
8
|
+
|
|
9
|
+
Report suspected vulnerabilities privately through [GitHub private vulnerability reporting](https://github.com/Hadden-Industries/markdown-quality/security/advisories/new).
|
|
10
|
+
If unavailable or unsuitable, use `security@haddenindustries.com`.
|
|
11
|
+
Avoid public disclosure in issues or pull requests.
|
|
12
|
+
Include affected release, environment, impact, reproduction and possible mitigation, while minimizing credentials, personal data and unrelated document content.
|
|
13
|
+
|
|
14
|
+
Maksym Shostak / Hadden Industries owns manual report handling and dependency/advisory review.
|
|
15
|
+
No unattended monitoring or notification service is assumed.
|
|
16
|
+
Maintainer targets, accepted on 2026-10-05, are:
|
|
17
|
+
|
|
18
|
+
| Stage | Target |
|
|
19
|
+
| --------------------------------------------------- | ----------------------------------------------- |
|
|
20
|
+
| Acknowledge a private report | Five working days from receipt |
|
|
21
|
+
| Initial severity/reachability triage | Five further working days after acknowledgement |
|
|
22
|
+
| Confirmed critical/high fix or effective mitigation | Five working days from confirmation |
|
|
23
|
+
| Confirmed medium fix or effective mitigation | 30 calendar days from confirmation |
|
|
24
|
+
| Confirmed low fix or effective mitigation | 90 calendar days from confirmation |
|
|
25
|
+
|
|
26
|
+
These targets are not an SLA or guaranteed resolution.
|
|
27
|
+
A missed target requires a responsible owner, interim disposition or mitigation, and dated next review through the private reporting channel.
|
|
28
|
+
Upon observation, suspected critical/high issues block affected promotion immediately.
|
|
29
|
+
Prioritize active exploitation, exposed credentials, reachability, impact and exploit prerequisites regardless of score; [CVSS v4](https://www.first.org/cvss/v4.0/specification-document) informs documented severity.
|
|
30
|
+
|
|
31
|
+
Coordinate confirmed issues through private advisories and disclose after a qualified fix or effective mitigation, unless an overriding safety or legal reason is recorded.
|
|
32
|
+
Keep embargoed evidence and reporter information restricted.
|
|
33
|
+
Security fixes retain component/rights, native parity, corpus, platform, package, registry and consumer qualification requirements.
|
|
34
|
+
Containment, credential changes, registry deprecation and external messages require their applicable authorization.
|
|
35
|
+
|
|
36
|
+
Review dependency/advisory health at every release preparation and monthly while a release is maintained.
|
|
37
|
+
Native upgrades require fresh source/component rights, output/parity and platform qualification; no unattended adoption is authorized.
|
|
38
|
+
Retain release source, build inputs, notices, recipient delivery/qualification evidence and accepted recovery inputs for the maintained lifetime plus three years after support ends, honoring license obligations requiring more.
|
|
39
|
+
The retention period is an operational floor, not a legal interpretation.
|
|
40
|
+
Preserve AGPL-3.0-only and provide corresponding source/build materials and third-party notices to recipients.
|
package/docs/ci-trust.md
CHANGED
|
@@ -9,14 +9,16 @@ A private shared Action is optional and does not solve public caller access.
|
|
|
9
9
|
|
|
10
10
|
| Event | Trusted graph and policy | Acquisition | Candidate processing | Current status |
|
|
11
11
|
| ------------------------ | ----------------------------------------------------- | ----------------------------------------------- | ---------------------------------------------------- | -------------------------------------------- |
|
|
12
|
-
| Package pull request | Public locked dependencies and fixed native manifests | Public upstream inputs, no private secrets | Package tests run without elevated authority | Hosted qualification
|
|
13
|
-
| Pilot protected branch | Reviewed capability release and consumer policy | Public locked graph, lifecycle scripts disabled | Full authored scope without credentials |
|
|
12
|
+
| Package pull request | Public locked dependencies and fixed native manifests | Public upstream inputs, no private secrets | Package tests run without elevated authority | Hosted package qualification passed |
|
|
13
|
+
| Pilot protected branch | Reviewed capability release and consumer policy | Public locked graph, lifecycle scripts disabled | Full authored scope without credentials | Alpha.3 registry passed; pilot proof pending |
|
|
14
14
|
| Pilot same-repository PR | Reviewed base tooling and policy | Separate trusted acquisition | Candidate Markdown and link target tree only | Architecture selected; qualification pending |
|
|
15
15
|
| Pilot fork PR | Reviewed base tooling and policy | Separate trusted acquisition | Candidate data only; no candidate scripts or graph | Architecture selected; qualification pending |
|
|
16
16
|
| Tool or policy update PR | Existing accepted graph until review | New graph requires owner review | Never treat candidate graph or exclusions as trusted | Required review remains explicit |
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
Package tests and candidate/registry qualification have no registry secret or OIDC permission.
|
|
19
|
+
They install with lifecycle scripts disabled and qualify both OS targets.
|
|
20
|
+
The separately dispatched publisher grants OIDC issuance only to its main-restricted npm-publication job.
|
|
21
|
+
Its exact candidate/source/manifest gate precedes public pilot publication; registry qualification remains credential-free and latest promotion remains separately gated.
|
|
20
22
|
Packed-consumer tests acquire public JavaScript dependencies before testing offline frozen-lock reinstallation and runtime execution.
|
|
21
23
|
The source lock acquisition alone does not populate metadata for a fresh consumer install.
|
|
22
24
|
It cannot serve as evidence that a pilot's private access works.
|
|
@@ -27,6 +29,18 @@ Candidate checkout must not execute application tooling, Git hooks, package life
|
|
|
27
29
|
The checking process must not inherit checkout write credentials, npm configuration, or OIDC issuance authority.
|
|
28
30
|
Trusted policy review is required for any change to required scope or exclusions.
|
|
29
31
|
|
|
32
|
+
The owner accepted a manual trusted-run boundary for the two pilots on 2026-10-05.
|
|
33
|
+
GitHub required checks select a name/context and App identity, not a workflow revision or event.
|
|
34
|
+
App 15368 identifies GitHub Actions, including candidate-controlled jobs.
|
|
35
|
+
Preserve OwlAPI's `CI / required` and WebVOWL's `WebVOWL application`, `Dependency review`, and `CodeQL gate` required checks.
|
|
36
|
+
Before each pilot merge, the owner accepts the exact candidate head/tree and attributable trusted hosted run, including trusted workflow source, core/native hashes, policy/ignore digests, selected paths, run/job/check IDs, outputs and required-status readback.
|
|
37
|
+
Any changed candidate, base policy/workflow or tool identity invalidates that acceptance.
|
|
38
|
+
A same-name candidate job or green PR summary cannot substitute for this record.
|
|
39
|
+
This route provides manual owner enforcement; it does not claim automatic workflow-specific enforcement.
|
|
40
|
+
The pilot trusted-run boundary creates no separate App, paid entitlement, write-capable status reporter, OIDC authority or new secret.
|
|
41
|
+
Negative hosted probes must still show malformed-link failure, candidate policy/ignore non-authority, candidate marker non-execution and credential absence.
|
|
42
|
+
The single owner's own PR does not constitute independent human approval; any necessary integration route must be explicit and recorded.
|
|
43
|
+
|
|
30
44
|
Do not give publication or repository-write credentials to a PR-controlled dependency graph.
|
|
31
45
|
Do not execute candidate source in an elevated `pull_request_target` job.
|
|
32
46
|
Public capability archives are available to all recipients; source/notice and integrity obligations still apply.
|
|
@@ -38,3 +52,4 @@ The subsequent owner request selects public distribution and removes the paid-pr
|
|
|
38
52
|
Pilot cutover still requires exact public tuple readback, fresh credential-free installation, event/policy isolation and accepted consumer deltas.
|
|
39
53
|
|
|
40
54
|
References: [GitHub event trust](https://docs.github.com/en/actions/reference/security/securely-using-pull_request_target), [public scoped publication](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/), and [npm trusted publishing](https://docs.npmjs.com/trusted-publishers/).
|
|
55
|
+
Required-check identity limitations are documented in [GitHub ruleset troubleshooting](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/troubleshooting-rules).
|
package/docs/consumer-guide.md
CHANGED
|
@@ -4,11 +4,14 @@ Install an exact coordinated public release after registry availability is verif
|
|
|
4
4
|
Acquisition needs no npm account or token; disable lifecycle scripts.
|
|
5
5
|
|
|
6
6
|
```sh
|
|
7
|
-
npm install --save-dev --save-exact --ignore-scripts @hadden-industries/markdown-quality@
|
|
7
|
+
npm install --save-dev --save-exact --ignore-scripts @hadden-industries/markdown-quality@1.0.0
|
|
8
8
|
npm ci --ignore-scripts
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
The
|
|
11
|
+
The source candidate is `1.0.0`; confirm its registry availability and exact tuple qualification before using the command above.
|
|
12
|
+
Publication under `pilot` and promotion to `latest` are separate steps.
|
|
13
|
+
The previously qualified alpha.4 tuple remains immutable historical evidence.
|
|
14
|
+
Both consumer pilots must accept the exact stable tuple before promotion.
|
|
12
15
|
Keep the consumer lockfile.
|
|
13
16
|
An isolated `tooling/markdown` npm project supports consumers that do not use Node for their application.
|
|
14
17
|
Its commands must pass the actual repository root.
|
|
@@ -16,7 +16,7 @@ Changed defaults require a new preset major, and a package major when existing i
|
|
|
16
16
|
Dependency upgrades are classified from observed corpus and consumer deltas.
|
|
17
17
|
Never overwrite a published version.
|
|
18
18
|
|
|
19
|
-
The current
|
|
19
|
+
The current source prepares version 1.0.0 under the pilot tag; stable promotion remains gated.
|
|
20
20
|
Stable promotion requires the same qualified tuple on both platforms, public registry readback and unauthenticated installation, both pilot acceptances, and a timed restoration exercise.
|
|
21
21
|
Changed/referrer mode and later fleet adoptions remain deferred.
|
|
22
22
|
|
|
@@ -40,13 +40,23 @@ An upstream Cargo lock is a superset of features and development inputs and does
|
|
|
40
40
|
The original upstream license and per-asset repack identity are retained.
|
|
41
41
|
|
|
42
42
|
The owner selected public distribution after npm rejected the private publication with E402.
|
|
43
|
-
All three
|
|
43
|
+
All three packages declare public access and share the source candidate version 1.0.0.
|
|
44
|
+
It retains alpha.4's qualified native executable/source/notice bytes and avoids duplicate formatting of byte-identical documents while retaining independent prose checks and preservation/convergence checks.
|
|
45
|
+
The first alpha.3 hosted OWLAPI shadow checks passed correctness but exceeded the accepted 30-second budget on both platforms.
|
|
46
|
+
Alpha.3 and alpha.4 remain immutable historical evidence; every new tuple requires fresh transported-archive, registry, and exact-version pilot qualification before promotion.
|
|
44
47
|
The public alpha.2 archives remain immutable historical delivery evidence and are unqualified for Linux execution.
|
|
45
48
|
The packer normalizes the Linux npm member's executable mode with Python tarfile, verifies all member bytes are unchanged, and recomputes the final archive integrity.
|
|
46
49
|
Qualify the exact transported release archives on both platforms, rather than each platform's independently generated package.
|
|
47
50
|
The unpublished private alpha.1 candidate and all rejected attempts remain historical evidence.
|
|
48
51
|
Direct first publication uses explicit public access; a staged placeholder is unnecessary.
|
|
49
|
-
|
|
52
|
+
The manual publisher uses npm 12.2.0 in hosted CI and requires all three npm trusted-publisher mappings for this repository, publish.yml and the npm-publication environment.
|
|
53
|
+
That environment must permit exactly the main branch.
|
|
54
|
+
It verifies a successful same-source candidate run, all three same-attempt jobs, the approved manifest digest and exact frozen archive bytes before publishing native packages and then core under pilot.
|
|
55
|
+
Only the publication job has OIDC issuance permission; no long-lived npm token is supplied.
|
|
56
|
+
Both registry jobs use native npm signature/attestation verification and bind the verified provenance to the approved source, workflow and publication run.
|
|
57
|
+
Structural provenance fixtures do not establish cryptographic acceptance.
|
|
58
|
+
The workflow does not promote latest; both pilots and recovery must accept the exact tuple first.
|
|
59
|
+
GitHub artifacts expire after 30 days, so export the complete frozen source, manifest, archives and verification bundles to the retained evidence store before expiry, for the security policy's maintained-lifetime-plus-three-years floor.
|
|
50
60
|
Public installation needs no registry token, subscription, or OIDC authority.
|
|
51
61
|
Public npm provenance is eligible only through a qualified supported publisher; do not claim it for the local bootstrap.
|
|
52
62
|
Retain attributable source/build/repack evidence and qualify attestations separately.
|
|
@@ -66,8 +76,22 @@ One pilot rehearsal is required before stable promotion.
|
|
|
66
76
|
Security reports use GitHub's private vulnerability reporting route when enabled; otherwise contact the repository owner through the project's existing private channel.
|
|
67
77
|
No unattended observation service is assumed.
|
|
68
78
|
During this authorized session, critical/high reports block promotion immediately.
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
The owner accepted maintained support targets on 2026-10-05; see [the security policy](../SECURITY.md).
|
|
80
|
+
Maksym Shostak / Hadden Industries owns manual report handling and dependency/advisory review.
|
|
81
|
+
Private reporting is enabled for this repository, as read back from GitHub on 2026-10-05; the existing organization security mailbox is the fallback.
|
|
82
|
+
Review dependency/advisory health at each release preparation and monthly while maintained.
|
|
83
|
+
Retain release source, build inputs, notices, recipient delivery/qualification evidence, and accepted recovery inputs for the maintained release lifetime plus three years after support ends, honoring any applicable license obligations requiring more.
|
|
84
|
+
This is an operational retention floor, not a legal interpretation.
|
|
85
|
+
Before stable promotion, only the candidate designated by `pilot` is maintained; after stable promotion, only the latest stable release designated by `latest` is maintained unless another line is explicitly accepted.
|
|
86
|
+
Consumers remain exactly pinned and upgrades individually qualified; older downloadable releases have no implied support or backport promise.
|
|
87
|
+
|
|
88
|
+
Pilot qualification uses six consecutive valid full checks per frozen corpus/platform, excluding installation, with observed nearest-rank sample p95 at most 30 seconds.
|
|
89
|
+
With six samples, that is the observed maximum; it is not a statistical tail or arbitrary-repository guarantee.
|
|
90
|
+
The memory budgets are 512 MiB Windows Job Object committed memory and 512 MiB Linux whole-process-tree resident memory, reported separately as different metrics.
|
|
91
|
+
These budgets do not impose OS runtime limits or raise existing package limits.
|
|
92
|
+
Require zero unexpected errors or adjudicated false positives in the window and accepted fixture/probe corpus, retaining expected negative probes separately.
|
|
93
|
+
Rehearse one task-owned pilot restoration within 60 minutes through byte/sentinel readback and incumbent local checks; hosted required-status recovery remains separate acceptance evidence.
|
|
94
|
+
Accepted budgets do not establish that the pending Linux corpus, hosted pilots, or restoration have passed.
|
|
71
95
|
|
|
72
96
|
Provide AGPL corresponding source and build materials alongside object-code delivery to actual recipients.
|
|
73
97
|
Preserve third-party license texts and attribution.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hadden-industries/markdown-quality",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Shared, bounded Markdown formatting, GFM linting, and local-link checking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"assets",
|
|
22
22
|
"LICENSE",
|
|
23
23
|
"LICENSES",
|
|
24
|
+
"SECURITY.md",
|
|
24
25
|
"README.md",
|
|
25
26
|
"THIRD-PARTY-NOTICES.md",
|
|
26
27
|
"docs/consumer-guide.md",
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
"prettier": "3.9.9"
|
|
46
47
|
},
|
|
47
48
|
"optionalDependencies": {
|
|
48
|
-
"@hadden-industries/markdown-quality-win32-x64": "
|
|
49
|
-
"@hadden-industries/markdown-quality-linux-x64": "
|
|
49
|
+
"@hadden-industries/markdown-quality-win32-x64": "1.0.0",
|
|
50
|
+
"@hadden-industries/markdown-quality-linux-x64": "1.0.0"
|
|
50
51
|
}
|
|
51
52
|
}
|
package/src/formatting.js
CHANGED
|
@@ -32,6 +32,10 @@ export async function formatDocument(text, context, tool) {
|
|
|
32
32
|
};
|
|
33
33
|
const layout = await prettier.format(text, options);
|
|
34
34
|
const result = await prettier.format(runNative(tool, layout), options);
|
|
35
|
+
// Byte identity proves preservation and an observed fixed point of the entire
|
|
36
|
+
// deterministic formatter pipeline. The independent prose check still runs.
|
|
37
|
+
if (result === text)
|
|
38
|
+
return { output: result, diagnostics: checkProse(tool, result) };
|
|
35
39
|
if (
|
|
36
40
|
JSON.stringify(semantic(parse(text))) !==
|
|
37
41
|
JSON.stringify(semantic(parse(result)))
|