oss-pulse 0.1.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/CHANGELOG.md +26 -0
- package/CODE_OF_CONDUCT.md +7 -0
- package/CONTRIBUTING.md +30 -0
- package/LICENSE +21 -0
- package/README.md +158 -0
- package/SECURITY.md +12 -0
- package/action.yml +45 -0
- package/dist/action-artifacts.d.ts +3 -0
- package/dist/action-artifacts.d.ts.map +1 -0
- package/dist/action-artifacts.js +38 -0
- package/dist/action-artifacts.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +117 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/format.d.ts +8 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +127 -0
- package/dist/format.js.map +1 -0
- package/dist/git.d.ts +3 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +168 -0
- package/dist/git.js.map +1 -0
- package/dist/github-annotations.d.ts +3 -0
- package/dist/github-annotations.d.ts.map +1 -0
- package/dist/github-annotations.js +36 -0
- package/dist/github-annotations.js.map +1 -0
- package/dist/report-rules.d.ts +12 -0
- package/dist/report-rules.d.ts.map +1 -0
- package/dist/report-rules.js +207 -0
- package/dist/report-rules.js.map +1 -0
- package/dist/report.d.ts +3 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +26 -0
- package/dist/report.js.map +1 -0
- package/dist/sarif.d.ts +3 -0
- package/dist/sarif.d.ts.map +1 -0
- package/dist/sarif.js +74 -0
- package/dist/sarif.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/docs/CLAUDE_FOR_OSS_PLAYBOOK.md +31 -0
- package/docs/CONTRIBUTOR_BACKLOG.md +93 -0
- package/docs/RELEASE.md +38 -0
- package/docs/REPORT_SCHEMA.md +116 -0
- package/docs/ROADMAP.md +30 -0
- package/docs/examples/README.md +12 -0
- package/docs/examples/octocat-hello-world.md +44 -0
- package/docs/examples/sindresorhus-is.md +47 -0
- package/docs/report.schema.json +136 -0
- package/package.json +40 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 - 2026-07-08
|
|
4
|
+
|
|
5
|
+
Initial public release.
|
|
6
|
+
|
|
7
|
+
- Added `oss-pulse scan` for local git repository health reports.
|
|
8
|
+
- Added Markdown and JSON output formats.
|
|
9
|
+
- Added maintainer readiness checks for README, license, contribution guide, issue and pull request templates, security policy, CI workflow, release workflow, changelog, funding metadata, contributor activity, code of conduct, and recent commits.
|
|
10
|
+
- Added `--fail-under <score>` for CI score gates.
|
|
11
|
+
- Added `--summary-only` for compact Markdown summaries.
|
|
12
|
+
- Added GitHub Actions usage docs and composite action metadata.
|
|
13
|
+
- Added strict TypeScript checks, Biome linting, and Node CLI tests.
|
|
14
|
+
- Improved unsupported format errors with the accepted `json` and `markdown` values.
|
|
15
|
+
- Added README examples for local audits and GitHub pull request summaries.
|
|
16
|
+
- Added JSON report schema documentation for automation consumers.
|
|
17
|
+
- Added fixture-based integration tests for complete, sparse, and nested repository scans.
|
|
18
|
+
- Added public repository case studies for `octocat/Hello-World` and `sindresorhus/is`.
|
|
19
|
+
- Added good first issue template detection for starter contribution readiness.
|
|
20
|
+
- Split report scoring rules out of the report builder to keep the core report assembly small.
|
|
21
|
+
- Added `--format release-notes` for paste-ready maintainer release note drafts.
|
|
22
|
+
- Added `--format contributor-onboarding` for first-time contributor guidance.
|
|
23
|
+
- Added `--format triage-suggestions` for issue and pull request triage guidance.
|
|
24
|
+
- Hardened GitHub Action metadata and README input documentation.
|
|
25
|
+
- Added `--format sarif` for GitHub code scanning and security dashboard integrations.
|
|
26
|
+
- Added `--format github-annotations` for GitHub workflow annotations in CI logs.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project follows the Contributor Covenant Code of Conduct.
|
|
4
|
+
|
|
5
|
+
Be respectful, constructive, and specific. Harassment, personal attacks, and repeated disruptive behavior are not welcome.
|
|
6
|
+
|
|
7
|
+
Maintainers may remove comments, close issues, or block participants to keep the project healthy.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for helping `oss-pulse` become useful for real maintainers.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run check
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Development Loop
|
|
13
|
+
|
|
14
|
+
1. Add or update a test for the behavior.
|
|
15
|
+
2. Make the smallest implementation change.
|
|
16
|
+
3. Run `npm run check`.
|
|
17
|
+
4. Open a pull request with the behavior, verification command, and any follow-up work.
|
|
18
|
+
|
|
19
|
+
## Good First Contributions
|
|
20
|
+
|
|
21
|
+
Good starter issues are usually one of:
|
|
22
|
+
|
|
23
|
+
- add a maintainer file detector
|
|
24
|
+
- improve Markdown report wording
|
|
25
|
+
- add a focused test case
|
|
26
|
+
- document a real repository workflow
|
|
27
|
+
|
|
28
|
+
Keep pull requests small. A reviewer should be able to understand the behavior in one pass.
|
|
29
|
+
|
|
30
|
+
See [CONTRIBUTOR_BACKLOG.md](docs/CONTRIBUTOR_BACKLOG.md) for ready-to-file starter issues.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 oss-pulse contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# oss-pulse
|
|
2
|
+
|
|
3
|
+
`oss-pulse` turns local repository maintenance signals into a small health report that works in a terminal, CI job, or GitHub step summary.
|
|
4
|
+
|
|
5
|
+
The first release is intentionally narrow: it checks whether a repository has the surfaces that help outside contributors succeed.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
node dist/cli.js scan . --format markdown
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
After the package is published:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx --yes oss-pulse@0.1.0 scan . --format markdown
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## CLI
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
oss-pulse scan [path] --format markdown
|
|
25
|
+
oss-pulse scan [path] --format json
|
|
26
|
+
oss-pulse scan [path] --format release-notes
|
|
27
|
+
oss-pulse scan [path] --format contributor-onboarding
|
|
28
|
+
oss-pulse scan [path] --format triage-suggestions
|
|
29
|
+
oss-pulse scan [path] --format sarif
|
|
30
|
+
oss-pulse scan [path] --format github-annotations
|
|
31
|
+
oss-pulse scan [path] --format markdown --output pulse.md
|
|
32
|
+
oss-pulse scan [path] --format markdown --fail-under 80
|
|
33
|
+
oss-pulse scan [path] --format markdown --summary-only
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The report includes:
|
|
37
|
+
|
|
38
|
+
- maintainer readiness score
|
|
39
|
+
- README, license, contribution guide, issue templates, good first issue template, security policy, CI, release workflow, changelog, funding, and activity checks
|
|
40
|
+
- ranked next actions
|
|
41
|
+
- JSON output for automation
|
|
42
|
+
- JSON Schema for automation consumers at `docs/report.schema.json`
|
|
43
|
+
- Markdown output for GitHub summaries
|
|
44
|
+
- release notes draft output for maintainer updates
|
|
45
|
+
- contributor onboarding output for first-time contributors
|
|
46
|
+
- triage suggestions for issue queues and pull request review
|
|
47
|
+
- SARIF output for GitHub code scanning and security dashboards
|
|
48
|
+
- GitHub workflow annotations for visible CI warnings and errors
|
|
49
|
+
- optional CI failure when score is below `--fail-under`
|
|
50
|
+
- compact Markdown output with `--summary-only`
|
|
51
|
+
|
|
52
|
+
## Examples
|
|
53
|
+
|
|
54
|
+
Local pre-release audit:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm run build
|
|
58
|
+
node dist/cli.js scan . --format markdown --fail-under 80
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Pull request summary gate:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx --yes oss-pulse@0.1.0 scan . --format markdown --summary-only --fail-under 80 >> "$GITHUB_STEP_SUMMARY"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Release notes draft:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx --yes oss-pulse@0.1.0 scan . --format release-notes
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Contributor onboarding report:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx --yes oss-pulse@0.1.0 scan . --format contributor-onboarding
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Issue and pull request triage:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx --yes oss-pulse@0.1.0 scan . --format triage-suggestions
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
SARIF for code scanning:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npx --yes oss-pulse@0.1.0 scan . --format sarif --output oss-pulse.sarif
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
GitHub workflow annotations:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npx --yes oss-pulse@0.1.0 scan . --format github-annotations
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## GitHub Actions
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
name: OSS Pulse
|
|
101
|
+
|
|
102
|
+
on:
|
|
103
|
+
pull_request:
|
|
104
|
+
workflow_dispatch:
|
|
105
|
+
|
|
106
|
+
jobs:
|
|
107
|
+
pulse:
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
steps:
|
|
110
|
+
- uses: actions/checkout@v5
|
|
111
|
+
with:
|
|
112
|
+
fetch-depth: 0
|
|
113
|
+
- run: npx --yes oss-pulse@0.1.0 scan . --format markdown --summary-only --fail-under 80 >> "$GITHUB_STEP_SUMMARY"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Repository Action usage after publishing:
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
- uses: your-org/oss-pulse@v0.1.0
|
|
120
|
+
with:
|
|
121
|
+
path: "."
|
|
122
|
+
format: markdown
|
|
123
|
+
fail-under: "80"
|
|
124
|
+
summary-only: "true"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Action inputs:
|
|
128
|
+
|
|
129
|
+
| Input | Default | Description |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| `path` | `.` | Repository path to scan. |
|
|
132
|
+
| `format` | `markdown` | One of `markdown`, `json`, `release-notes`, `contributor-onboarding`, `triage-suggestions`, `sarif`, or `github-annotations`. |
|
|
133
|
+
| `fail-under` | `0` | Exit 1 when the score is below this threshold. |
|
|
134
|
+
| `summary-only` | `false` | Emit compact Markdown with score and next actions. |
|
|
135
|
+
|
|
136
|
+
After publishing the GitHub repository, prefer a pinned release tag for the repository Action instead of a branch name.
|
|
137
|
+
|
|
138
|
+
When `format` is `github-annotations`, the Action prints workflow commands to stdout so GitHub can render annotations in the checks UI.
|
|
139
|
+
|
|
140
|
+
## Why
|
|
141
|
+
|
|
142
|
+
Most maintainer tools wait until a project is already busy. `oss-pulse` starts earlier: it makes missing contribution paths visible before a community arrives.
|
|
143
|
+
|
|
144
|
+
This project is built for maintainers who want a practical route toward a healthier open source project and measurable public contribution history.
|
|
145
|
+
|
|
146
|
+
## Roadmap
|
|
147
|
+
|
|
148
|
+
See [ROADMAP.md](docs/ROADMAP.md) for the product path and [CONTRIBUTOR_BACKLOG.md](docs/CONTRIBUTOR_BACKLOG.md) for issues designed for first-time contributors.
|
|
149
|
+
|
|
150
|
+
For automation consumers, see [REPORT_SCHEMA.md](docs/REPORT_SCHEMA.md). For real repository examples, see [docs/examples](docs/examples/README.md).
|
|
151
|
+
|
|
152
|
+
## Contributing
|
|
153
|
+
|
|
154
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
155
|
+
|
|
156
|
+
## Release
|
|
157
|
+
|
|
158
|
+
See [RELEASE.md](docs/RELEASE.md) for the npm and GitHub release path.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
Please do not open public issues for vulnerabilities.
|
|
4
|
+
|
|
5
|
+
Email the maintainers with:
|
|
6
|
+
|
|
7
|
+
- affected version or commit
|
|
8
|
+
- reproduction steps
|
|
9
|
+
- expected impact
|
|
10
|
+
- any safe workaround
|
|
11
|
+
|
|
12
|
+
This early project does not yet have a fixed response SLA, but verified reports will be acknowledged before public disclosure.
|
package/action.yml
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: OSS Pulse
|
|
2
|
+
description: Turn repository maintenance signals into an actionable OSS health report.
|
|
3
|
+
|
|
4
|
+
inputs:
|
|
5
|
+
path:
|
|
6
|
+
description: Repository path to scan.
|
|
7
|
+
required: false
|
|
8
|
+
default: "."
|
|
9
|
+
format:
|
|
10
|
+
description: Output format. Supported values are markdown, json, release-notes, contributor-onboarding, triage-suggestions, sarif, and github-annotations.
|
|
11
|
+
required: false
|
|
12
|
+
default: markdown
|
|
13
|
+
fail-under:
|
|
14
|
+
description: Exit 1 when the repository score is below this threshold.
|
|
15
|
+
required: false
|
|
16
|
+
default: "0"
|
|
17
|
+
summary-only:
|
|
18
|
+
description: Emit compact Markdown with score and next actions.
|
|
19
|
+
required: false
|
|
20
|
+
default: "false"
|
|
21
|
+
|
|
22
|
+
runs:
|
|
23
|
+
using: composite
|
|
24
|
+
steps:
|
|
25
|
+
- shell: bash
|
|
26
|
+
run: npm ci && npm run build
|
|
27
|
+
working-directory: ${{ github.action_path }}
|
|
28
|
+
- shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
args=(scan --format="$OSS_PULSE_FORMAT" --fail-under="$OSS_PULSE_FAIL_UNDER")
|
|
31
|
+
if [ "$OSS_PULSE_SUMMARY_ONLY" = "true" ]; then
|
|
32
|
+
args+=(--summary-only)
|
|
33
|
+
fi
|
|
34
|
+
args+=(-- "$OSS_PULSE_PATH")
|
|
35
|
+
if [ "$OSS_PULSE_FORMAT" = "github-annotations" ]; then
|
|
36
|
+
node "$OSS_PULSE_ACTION_PATH/dist/cli.js" "${args[@]}"
|
|
37
|
+
else
|
|
38
|
+
node "$OSS_PULSE_ACTION_PATH/dist/cli.js" "${args[@]}" >> "$GITHUB_STEP_SUMMARY"
|
|
39
|
+
fi
|
|
40
|
+
env:
|
|
41
|
+
OSS_PULSE_ACTION_PATH: ${{ github.action_path }}
|
|
42
|
+
OSS_PULSE_FAIL_UNDER: ${{ inputs.fail-under }}
|
|
43
|
+
OSS_PULSE_FORMAT: ${{ inputs.format }}
|
|
44
|
+
OSS_PULSE_PATH: ${{ inputs.path }}
|
|
45
|
+
OSS_PULSE_SUMMARY_ONLY: ${{ inputs.summary-only }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-artifacts.d.ts","sourceRoot":"","sources":["../src/action-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAiC/D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function artifactUriForAction(actionId) {
|
|
2
|
+
switch (actionId) {
|
|
3
|
+
case "add-readme":
|
|
4
|
+
return "README.md";
|
|
5
|
+
case "add-license":
|
|
6
|
+
return "LICENSE";
|
|
7
|
+
case "add-contributing-guide":
|
|
8
|
+
return "CONTRIBUTING.md";
|
|
9
|
+
case "add-issue-template":
|
|
10
|
+
return ".github/ISSUE_TEMPLATE/bug_report.md";
|
|
11
|
+
case "add-good-first-issue-template":
|
|
12
|
+
return ".github/ISSUE_TEMPLATE/good_first_issue.md";
|
|
13
|
+
case "add-pull-request-template":
|
|
14
|
+
return ".github/PULL_REQUEST_TEMPLATE.md";
|
|
15
|
+
case "add-security-policy":
|
|
16
|
+
return "SECURITY.md";
|
|
17
|
+
case "add-ci-workflow":
|
|
18
|
+
return ".github/workflows/ci.yml";
|
|
19
|
+
case "add-release-workflow":
|
|
20
|
+
return ".github/workflows/release.yml";
|
|
21
|
+
case "add-changelog":
|
|
22
|
+
return "CHANGELOG.md";
|
|
23
|
+
case "add-funding":
|
|
24
|
+
return ".github/FUNDING.yml";
|
|
25
|
+
case "invite-contributors":
|
|
26
|
+
return ".github/ISSUE_TEMPLATE/good_first_issue.md";
|
|
27
|
+
case "add-code-of-conduct":
|
|
28
|
+
return "CODE_OF_CONDUCT.md";
|
|
29
|
+
case "resume-maintenance":
|
|
30
|
+
return "README.md";
|
|
31
|
+
default:
|
|
32
|
+
return assertNever(actionId);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function assertNever(value) {
|
|
36
|
+
throw new Error(`unexpected action id: ${value}`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=action-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-artifacts.js","sourceRoot":"","sources":["../src/action-artifacts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,WAAW,CAAA;QACpB,KAAK,aAAa;YAChB,OAAO,SAAS,CAAA;QAClB,KAAK,wBAAwB;YAC3B,OAAO,iBAAiB,CAAA;QAC1B,KAAK,oBAAoB;YACvB,OAAO,sCAAsC,CAAA;QAC/C,KAAK,+BAA+B;YAClC,OAAO,4CAA4C,CAAA;QACrD,KAAK,2BAA2B;YAC9B,OAAO,kCAAkC,CAAA;QAC3C,KAAK,qBAAqB;YACxB,OAAO,aAAa,CAAA;QACtB,KAAK,iBAAiB;YACpB,OAAO,0BAA0B,CAAA;QACnC,KAAK,sBAAsB;YACzB,OAAO,+BAA+B,CAAA;QACxC,KAAK,eAAe;YAClB,OAAO,cAAc,CAAA;QACvB,KAAK,aAAa;YAChB,OAAO,qBAAqB,CAAA;QAC9B,KAAK,qBAAqB;YACxB,OAAO,4CAA4C,CAAA;QACrD,KAAK,qBAAqB;YACxB,OAAO,oBAAoB,CAAA;QAC7B,KAAK,oBAAoB;YACvB,OAAO,WAAW,CAAA;QACpB;YACE,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAA;AACnD,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAmCA,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtF;AAkBD,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BjE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { RepositoryPathError, UnexpectedOutputFormatError } from "./errors.js";
|
|
7
|
+
import { formatContributorOnboarding, formatJson, formatMarkdown, formatMarkdownSummary, formatReleaseNotes, formatTriageSuggestions, } from "./format.js";
|
|
8
|
+
import { scanRepository } from "./git.js";
|
|
9
|
+
import { formatGithubAnnotations } from "./github-annotations.js";
|
|
10
|
+
import { buildReport } from "./report.js";
|
|
11
|
+
import { formatSarif } from "./sarif.js";
|
|
12
|
+
import { OUTPUT_FORMATS } from "./types.js";
|
|
13
|
+
const ScanOptionsSchema = z.object({
|
|
14
|
+
failUnder: z.coerce.number().int().min(0).max(100).optional(),
|
|
15
|
+
format: z.enum(OUTPUT_FORMATS).default("markdown"),
|
|
16
|
+
output: z.string().min(1).optional(),
|
|
17
|
+
summaryOnly: z.boolean().default(false),
|
|
18
|
+
});
|
|
19
|
+
export async function runScan(targetPath, rawOptions) {
|
|
20
|
+
const options = ScanOptionsSchema.parse(rawOptions);
|
|
21
|
+
return (await runScanWithOptions(targetPath, options)).output;
|
|
22
|
+
}
|
|
23
|
+
async function runScanWithOptions(targetPath, options) {
|
|
24
|
+
const signals = await scanRepository(targetPath);
|
|
25
|
+
const report = buildReport(signals);
|
|
26
|
+
const output = formatReport(report, options);
|
|
27
|
+
if (options.output !== undefined) {
|
|
28
|
+
await writeFile(options.output, output, "utf8");
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
failedThreshold: options.failUnder !== undefined && report.score < options.failUnder,
|
|
32
|
+
output,
|
|
33
|
+
score: report.score,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export async function main(argv) {
|
|
37
|
+
const program = new Command();
|
|
38
|
+
program
|
|
39
|
+
.name("oss-pulse")
|
|
40
|
+
.description("Turn repository maintenance signals into an actionable OSS health report.")
|
|
41
|
+
.version("0.1.0");
|
|
42
|
+
program
|
|
43
|
+
.command("scan")
|
|
44
|
+
.argument("[path]", "repository path", ".")
|
|
45
|
+
.option("--fail-under <score>", "exit 1 when score is below this threshold")
|
|
46
|
+
.option("-f, --format <format>", "output format: markdown, json, release-notes, contributor-onboarding, triage-suggestions, sarif, or github-annotations", "markdown")
|
|
47
|
+
.option("-o, --output <path>", "write report to a file")
|
|
48
|
+
.option("--summary-only", "emit compact Markdown with score and next actions")
|
|
49
|
+
.action(async (targetPath, options) => {
|
|
50
|
+
const scanOptions = ScanOptionsSchema.parse(options);
|
|
51
|
+
const result = await runScanWithOptions(targetPath, scanOptions);
|
|
52
|
+
if (scanOptions.output === undefined) {
|
|
53
|
+
process.stdout.write(result.output);
|
|
54
|
+
}
|
|
55
|
+
if (result.failedThreshold) {
|
|
56
|
+
process.exitCode = 1;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
await program.parseAsync([...argv], { from: "node" });
|
|
60
|
+
}
|
|
61
|
+
function formatReport(report, options) {
|
|
62
|
+
switch (options.format) {
|
|
63
|
+
case "json":
|
|
64
|
+
return formatJson(report);
|
|
65
|
+
case "markdown":
|
|
66
|
+
return options.summaryOnly ? formatMarkdownSummary(report) : formatMarkdown(report);
|
|
67
|
+
case "release-notes":
|
|
68
|
+
return formatReleaseNotes(report);
|
|
69
|
+
case "contributor-onboarding":
|
|
70
|
+
return formatContributorOnboarding(report);
|
|
71
|
+
case "triage-suggestions":
|
|
72
|
+
return formatTriageSuggestions(report);
|
|
73
|
+
case "sarif":
|
|
74
|
+
return formatSarif(report);
|
|
75
|
+
case "github-annotations":
|
|
76
|
+
return formatGithubAnnotations(report);
|
|
77
|
+
default:
|
|
78
|
+
return assertNever(options.format);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertNever(value) {
|
|
82
|
+
throw new UnexpectedOutputFormatError(value);
|
|
83
|
+
}
|
|
84
|
+
function isCliEntrypoint(argv) {
|
|
85
|
+
const scriptPath = argv[1];
|
|
86
|
+
return scriptPath !== undefined && import.meta.url === pathToFileURL(scriptPath).href;
|
|
87
|
+
}
|
|
88
|
+
if (isCliEntrypoint(process.argv)) {
|
|
89
|
+
main(process.argv).catch(handleCliFailure);
|
|
90
|
+
}
|
|
91
|
+
function handleCliFailure(error) {
|
|
92
|
+
if (error instanceof RepositoryPathError) {
|
|
93
|
+
process.stderr.write(`${error.message}\n`);
|
|
94
|
+
process.exitCode = 2;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof z.ZodError) {
|
|
98
|
+
process.stderr.write(formatZodError(error));
|
|
99
|
+
process.exitCode = 2;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
function formatZodError(error) {
|
|
105
|
+
const messages = error.issues.map(formatZodIssue);
|
|
106
|
+
return `invalid options: ${messages.join("; ")}\n`;
|
|
107
|
+
}
|
|
108
|
+
function formatZodIssue(issue) {
|
|
109
|
+
const path = issue.path.map(String).join(".") || "options";
|
|
110
|
+
switch (issue.code) {
|
|
111
|
+
case z.ZodIssueCode.invalid_enum_value:
|
|
112
|
+
return `${path}: expected one of ${issue.options.join(", ")}`;
|
|
113
|
+
default:
|
|
114
|
+
return `${path}: ${issue.message}`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class RepositoryPathError extends Error {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly reason: string;
|
|
4
|
+
readonly name = "RepositoryPathError";
|
|
5
|
+
constructor(path: string, reason: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class GitCommandError extends Error {
|
|
8
|
+
readonly command: readonly string[];
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly stderr: string;
|
|
11
|
+
readonly name = "GitCommandError";
|
|
12
|
+
constructor(command: readonly string[], cwd: string, stderr: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class UnexpectedOutputFormatError extends Error {
|
|
15
|
+
readonly format: never;
|
|
16
|
+
readonly name = "UnexpectedOutputFormatError";
|
|
17
|
+
constructor(format: never);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAI1C,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,QAAQ,CAAC,IAAI,yBAAwB;gBAG1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;CAI1B;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAItC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM;IALzB,QAAQ,CAAC,IAAI,qBAAoB;gBAGtB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM;CAI1B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IAGxC,QAAQ,CAAC,MAAM,EAAE,KAAK;IAFlC,QAAQ,CAAC,IAAI,iCAAgC;gBAExB,MAAM,EAAE,KAAK;CAGnC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class RepositoryPathError extends Error {
|
|
2
|
+
path;
|
|
3
|
+
reason;
|
|
4
|
+
name = "RepositoryPathError";
|
|
5
|
+
constructor(path, reason) {
|
|
6
|
+
super(`cannot scan ${path}: ${reason}`);
|
|
7
|
+
this.path = path;
|
|
8
|
+
this.reason = reason;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class GitCommandError extends Error {
|
|
12
|
+
command;
|
|
13
|
+
cwd;
|
|
14
|
+
stderr;
|
|
15
|
+
name = "GitCommandError";
|
|
16
|
+
constructor(command, cwd, stderr) {
|
|
17
|
+
super(`git ${command.join(" ")} failed in ${cwd}`);
|
|
18
|
+
this.command = command;
|
|
19
|
+
this.cwd = cwd;
|
|
20
|
+
this.stderr = stderr;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class UnexpectedOutputFormatError extends Error {
|
|
24
|
+
format;
|
|
25
|
+
name = "UnexpectedOutputFormatError";
|
|
26
|
+
constructor(format) {
|
|
27
|
+
super(`unexpected output format: ${format}`);
|
|
28
|
+
this.format = format;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAIjC;IACA;IAJF,IAAI,GAAG,qBAAqB,CAAA;IAErC,YACW,IAAY,EACZ,MAAc;QAEvB,KAAK,CAAC,eAAe,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;QAH9B,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAI7B;IACA;IACA;IALF,IAAI,GAAG,iBAAiB,CAAA;IAEjC,YACW,OAA0B,EAC1B,GAAW,EACX,MAAc;QAEvB,KAAK,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC,CAAA;QAJzC,YAAO,GAAP,OAAO,CAAmB;QAC1B,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAG/B;IAFZ,IAAI,GAAG,6BAA6B,CAAA;IAE7C,YAAqB,MAAa;QAChC,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAA;QADzB,WAAM,GAAN,MAAM,CAAO;IAElC,CAAC;CACF"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PulseReport } from "./types.js";
|
|
2
|
+
export declare function formatJson(report: PulseReport): string;
|
|
3
|
+
export declare function formatMarkdown(report: PulseReport): string;
|
|
4
|
+
export declare function formatMarkdownSummary(report: PulseReport): string;
|
|
5
|
+
export declare function formatReleaseNotes(report: PulseReport): string;
|
|
6
|
+
export declare function formatContributorOnboarding(report: PulseReport): string;
|
|
7
|
+
export declare function formatTriageSuggestions(report: PulseReport): string;
|
|
8
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4B1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAcjE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuB9D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4BvE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA2BnE"}
|