oss-signal 0.2.0 → 0.3.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 CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+
5
+ - Added GitHub Actions step summary output for readable workflow reports.
6
+ - Added a `summary` Action input for turning step summary output on or off.
7
+
3
8
  ## 0.2.0
4
9
 
5
10
  - Added direct GitHub repository audits for public repositories.
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # oss-signal
2
2
 
3
3
  [![CI](https://github.com/SalmonPlays/oss-signal/actions/workflows/ci.yml/badge.svg)](https://github.com/SalmonPlays/oss-signal/actions/workflows/ci.yml)
4
+ [![Repository health](https://github.com/SalmonPlays/oss-signal/actions/workflows/repository-health.yml/badge.svg)](https://github.com/SalmonPlays/oss-signal/actions/workflows/repository-health.yml)
4
5
  [![npm version](https://img.shields.io/npm/v/oss-signal.svg)](https://www.npmjs.com/package/oss-signal)
5
6
  [![npm downloads](https://img.shields.io/npm/dm/oss-signal.svg)](https://www.npmjs.com/package/oss-signal)
6
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
@@ -21,7 +22,7 @@ Open-source projects often fail quietly because the maintainer workflow is undoc
21
22
  - Contributors can attach a report to a cleanup issue or pull request.
22
23
  - Teams can gate release readiness with `--fail-under`.
23
24
  - Foundations and working groups can compare repository hygiene across many projects.
24
- - CI maintainers can add it as a GitHub Action and publish the report as an artifact.
25
+ - CI maintainers can add it as a GitHub Action, show the score in the workflow summary, and publish the report as an artifact.
25
26
 
26
27
  ## Install
27
28
 
@@ -137,14 +138,19 @@ oss-signal . --fail-under 80
137
138
  Add `oss-signal` directly to a GitHub Actions workflow:
138
139
 
139
140
  ```yaml
140
- - uses: SalmonPlays/oss-signal@v0.2.0
141
+ - uses: SalmonPlays/oss-signal@v0.3.0
141
142
  id: oss-signal
142
143
  with:
143
144
  fail-under: "80"
144
145
  output: oss-signal-report.md
146
+ summary: "true"
145
147
  - run: echo "score ${{ steps.oss-signal.outputs.score }} (${{ steps.oss-signal.outputs.grade }})"
146
148
  ```
147
149
 
150
+ The Action writes a concise GitHub Actions step summary by default, so reviewers can see the score and recommended next steps without downloading an artifact. Set `summary: "false"` to disable it.
151
+
152
+ ![oss-signal GitHub Actions summary](docs/assets/github-step-summary.svg)
153
+
148
154
  Full workflow example:
149
155
 
150
156
  ```yaml
@@ -160,11 +166,12 @@ jobs:
160
166
  runs-on: ubuntu-latest
161
167
  steps:
162
168
  - uses: actions/checkout@v4
163
- - uses: SalmonPlays/oss-signal@v0.2.0
169
+ - uses: SalmonPlays/oss-signal@v0.3.0
164
170
  id: oss-signal
165
171
  with:
166
172
  fail-under: "80"
167
173
  output: oss-signal-report.md
174
+ summary: "true"
168
175
  - uses: actions/upload-artifact@v4
169
176
  with:
170
177
  name: oss-signal-report
@@ -173,6 +180,8 @@ jobs:
173
180
 
174
181
  See [docs/examples/github-action-workflow.yml](docs/examples/github-action-workflow.yml) for a copyable workflow.
175
182
 
183
+ This repository dogfoods the public Action tag in [Repository health](.github/workflows/repository-health.yml), which runs `SalmonPlays/oss-signal@v0.3.0` against the repository and uploads the Markdown report artifact.
184
+
176
185
  You can also run the CLI directly in CI:
177
186
 
178
187
  ```yaml
package/action.yml CHANGED
@@ -17,6 +17,10 @@ inputs:
17
17
  description: Report file path.
18
18
  required: false
19
19
  default: oss-signal-report.md
20
+ summary:
21
+ description: Write a concise report to the GitHub Actions step summary.
22
+ required: false
23
+ default: "true"
20
24
  fail-under:
21
25
  description: Fail the action when the score is below this number.
22
26
  required: false
@@ -6,11 +6,13 @@ This page collects the public evidence that `oss-signal` is built for real open-
6
6
 
7
7
  - Repository: https://github.com/SalmonPlays/oss-signal
8
8
  - npm package: https://www.npmjs.com/package/oss-signal
9
- - GitHub Action tag: https://github.com/SalmonPlays/oss-signal/tree/v0.2.0
9
+ - GitHub Action tag: https://github.com/SalmonPlays/oss-signal/tree/v0.3.0
10
10
  - GitHub Action metadata: [action.yml](../action.yml)
11
+ - Public dogfood workflow: [.github/workflows/repository-health.yml](../.github/workflows/repository-health.yml)
11
12
  - Self-audit report: [docs/self-audit.md](self-audit.md)
12
13
  - GitHub URL audit report: [docs/examples/github-url-report.md](examples/github-url-report.md)
13
14
  - GitHub Action workflow example: [docs/examples/github-action-workflow.yml](examples/github-action-workflow.yml)
15
+ - Codex for Open Source application brief: [docs/codex-for-oss-application.md](codex-for-oss-application.md)
14
16
  - Rule reference: [docs/rules.md](rules.md)
15
17
 
16
18
  ## Maintainer Use Case
@@ -22,19 +24,19 @@ The CLI supports two practical modes:
22
24
  - Local repository audit for maintainers working in a clone.
23
25
  - Public GitHub repository audit for quick triage without cloning.
24
26
 
25
- It also ships as a GitHub Action, so maintainers can gate repository hygiene in CI and upload a Markdown report as a workflow artifact.
27
+ It also ships as a GitHub Action, so maintainers can gate repository hygiene in CI, show the result in the GitHub Actions step summary, and upload a Markdown report as a workflow artifact. This repository dogfoods the public Action tag through the Repository health workflow.
26
28
 
27
- ## Public Field Audits
29
+ ## Public Field Audits And PRs
28
30
 
29
31
  The tool has been used to generate maintainer-readiness reports for public repositories and convert them into respectful cleanup issues:
30
32
 
31
- | Repository | Report | Posted issue |
32
- | --- | --- | --- |
33
- | `platformatic/massimo` | [report](outreach/platformatic-massimo-report.md) | https://github.com/platformatic/massimo/issues/159 |
34
- | `supermarkt/checkjebon` | [report](outreach/supermarkt-checkjebon-report.md) | https://github.com/supermarkt/checkjebon/issues/22 |
35
- | `sammorrisdesign/interactive-feed` | [report](outreach/sammorrisdesign-interactive-feed-report.md) | https://github.com/sammorrisdesign/interactive-feed/issues/14 |
33
+ | Repository | Report | Posted issue | Follow-up PR |
34
+ | --- | --- | --- | --- |
35
+ | `platformatic/massimo` | [report](outreach/platformatic-massimo-report.md) | https://github.com/platformatic/massimo/issues/159 | https://github.com/platformatic/massimo/pull/160 |
36
+ | `supermarkt/checkjebon` | [report](outreach/supermarkt-checkjebon-report.md) | https://github.com/supermarkt/checkjebon/issues/22 | https://github.com/supermarkt/checkjebon/pull/23 |
37
+ | `sammorrisdesign/interactive-feed` | [report](outreach/sammorrisdesign-interactive-feed-report.md) | https://github.com/sammorrisdesign/interactive-feed/issues/14 | https://github.com/sammorrisdesign/interactive-feed/pull/15 |
36
38
 
37
- These issues are evidence of the intended maintainer workflow: run a deterministic audit, explain the missing signals, and give maintainers a small set of actionable improvements.
39
+ These issues and pull requests are evidence of the intended maintainer workflow: run a deterministic audit, explain the missing signals, and give maintainers a small set of actionable improvements. Each PR is intentionally limited to documentation or GitHub templates.
38
40
 
39
41
  ## Verification Commands
40
42
 
@@ -50,8 +52,9 @@ The current repository self-audit score is 100/100, the GitHub community profile
50
52
 
51
53
  Public CI evidence:
52
54
 
53
- - GitHub Action self-test job: https://github.com/SalmonPlays/oss-signal/actions/runs/26801682014/job/79009525705
54
- - CodeQL run: https://github.com/SalmonPlays/oss-signal/actions/runs/26801681976
55
+ - CI workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/ci.yml
56
+ - Repository health workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/repository-health.yml
57
+ - CodeQL workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/codeql.yml
55
58
 
56
59
  ## Boundaries
57
60
 
@@ -0,0 +1,24 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="920" height="470" viewBox="0 0 920 470" role="img" aria-labelledby="title desc">
2
+ <title id="title">oss-signal GitHub Actions step summary</title>
3
+ <desc id="desc">Example GitHub Actions step summary showing an oss-signal score of 100 out of 100.</desc>
4
+ <rect width="920" height="470" rx="18" fill="#ffffff"/>
5
+ <rect x="1" y="1" width="918" height="468" rx="18" fill="none" stroke="#d0d7de" stroke-width="2"/>
6
+ <rect x="0" y="0" width="920" height="58" rx="18" fill="#f6f8fa"/>
7
+ <text x="32" y="37" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="18" font-weight="700">GitHub Actions step summary</text>
8
+ <text x="32" y="106" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="30" font-weight="700">oss-signal</text>
9
+ <text x="32" y="154" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="20">Score: </text>
10
+ <text x="94" y="154" fill="#1a7f37" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="20" font-weight="700">100/100 (A)</text>
11
+ <rect x="32" y="190" width="520" height="152" rx="8" fill="#ffffff" stroke="#d0d7de"/>
12
+ <line x1="32" y1="238" x2="552" y2="238" stroke="#d0d7de"/>
13
+ <line x1="32" y1="286" x2="552" y2="286" stroke="#d0d7de"/>
14
+ <line x1="32" y1="342" x2="552" y2="342" stroke="#d0d7de"/>
15
+ <line x1="388" y1="190" x2="388" y2="342" stroke="#d0d7de"/>
16
+ <text x="54" y="222" fill="#57606a" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16" font-weight="700">Result</text>
17
+ <text x="444" y="222" fill="#57606a" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16" font-weight="700">Count</text>
18
+ <text x="54" y="270" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16">Passed</text>
19
+ <text x="478" y="270" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16">15</text>
20
+ <text x="54" y="318" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16">Failed</text>
21
+ <text x="486" y="318" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="16">0</text>
22
+ <text x="32" y="390" fill="#24292f" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="21" font-weight="700">Recommended next steps</text>
23
+ <text x="32" y="428" fill="#57606a" font-family="-apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="17">No missing maintainer-readiness checks found.</text>
24
+ </svg>
@@ -0,0 +1,76 @@
1
+ # Codex for Open Source Application Brief
2
+
3
+ Snapshot: 2026-06-02T11:20:40Z
4
+
5
+ This document summarizes why `oss-signal` is a fit for OpenAI's Codex for Open Source program. The official program page says open-source maintainers can apply, with emphasis on core maintainers, widely used public projects, and projects that play an important ecosystem role: https://developers.openai.com/community/codex-for-oss
6
+
7
+ ## Project
8
+
9
+ - Repository: https://github.com/SalmonPlays/oss-signal
10
+ - npm package: https://www.npmjs.com/package/oss-signal
11
+ - GitHub Action tag: https://github.com/SalmonPlays/oss-signal/tree/v0.3.0
12
+ - CI workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/ci.yml
13
+ - Repository health workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/repository-health.yml
14
+ - CodeQL workflow: https://github.com/SalmonPlays/oss-signal/actions/workflows/codeql.yml
15
+ - Maintainer evidence: [adoption-evidence.md](adoption-evidence.md)
16
+
17
+ ## What `oss-signal` Does
18
+
19
+ `oss-signal` is a dependency-light CLI and GitHub Action for OSS maintainers. It audits maintainer-readiness signals that lower recurring maintainer load:
20
+
21
+ - README, license, contribution, support, security, code of conduct, and changelog files.
22
+ - CI, tests, issue templates, pull request templates, Dependabot, and CodeQL-style security workflow.
23
+ - Package metadata and lockfile hygiene.
24
+
25
+ The output is a deterministic score plus actionable next steps in Markdown or JSON. The GitHub Action also writes a workflow step summary so maintainers and reviewers can see the result without downloading an artifact.
26
+
27
+ ## Why Codex Helps
28
+
29
+ This project is designed around repeatable maintainer workflows where Codex is useful:
30
+
31
+ - Run audits against public repositories without cloning.
32
+ - Convert findings into focused cleanup issues or pull requests.
33
+ - Keep repository hygiene visible in CI.
34
+ - Generate small contributor-facing files that maintainers can review quickly.
35
+ - Use Codex to turn audit findings into scoped documentation and workflow improvements.
36
+
37
+ ## Public Evidence
38
+
39
+ The repository currently has:
40
+
41
+ - A published npm package.
42
+ - A reusable GitHub Action with `score`, `grade`, `failed`, and `report-path` outputs.
43
+ - A v0.3.0 GitHub Action tag with step summary support.
44
+ - A public dogfood workflow that runs `SalmonPlays/oss-signal@v0.3.0` against the repository.
45
+ - CI and CodeQL workflows passing on `main`.
46
+ - A local self-audit score of 100/100.
47
+ - Public reports, issues, and PRs created from real repository audits.
48
+
49
+ ## Field Audits And Follow-Up PRs
50
+
51
+ | Repository | Report | Issue | PR | Status |
52
+ | --- | --- | --- | --- | --- |
53
+ | `platformatic/massimo` | [report](outreach/platformatic-massimo-report.md) | https://github.com/platformatic/massimo/issues/159 | https://github.com/platformatic/massimo/pull/160 | open, mergeable |
54
+ | `supermarkt/checkjebon` | [report](outreach/supermarkt-checkjebon-report.md) | https://github.com/supermarkt/checkjebon/issues/22 | https://github.com/supermarkt/checkjebon/pull/23 | open, mergeable |
55
+ | `sammorrisdesign/interactive-feed` | [report](outreach/sammorrisdesign-interactive-feed-report.md) | https://github.com/sammorrisdesign/interactive-feed/issues/14 | https://github.com/sammorrisdesign/interactive-feed/pull/15 | open, mergeable |
56
+
57
+ These PRs are intentionally small and maintainer-friendly. They add documentation or GitHub templates rather than changing product code.
58
+
59
+ ## Application Positioning
60
+
61
+ Recommended application angle:
62
+
63
+ `oss-signal` is not yet a widely adopted project, but it is a public OSS maintainer tool built specifically for repeatable Codex-assisted maintenance. The project already has a working CLI, npm distribution, GitHub Action, passing CI/CodeQL, self-audit evidence, and three public field-audit PRs. Codex support would be used to continue auditing repositories, prepare focused maintainer PRs, improve Action automation, and document repeatable OSS maintenance workflows.
64
+
65
+ ## Current Gaps
66
+
67
+ - External PRs are open but not yet merged.
68
+ - npm download metrics are still early because the package is newly published.
69
+ - The project needs more real maintainers using the Action in their own repositories.
70
+
71
+ ## Next Evidence To Collect
72
+
73
+ - One or more merged external PRs.
74
+ - A GitHub Release for v0.3.0 with release notes.
75
+ - A public workflow run in another repository using `SalmonPlays/oss-signal@v0.3.0`.
76
+ - npm download data once the registry starts reporting weekly/monthly counts.
@@ -10,11 +10,12 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
12
  - uses: actions/checkout@v4
13
- - uses: SalmonPlays/oss-signal@v0.2.0
13
+ - uses: SalmonPlays/oss-signal@v0.3.0
14
14
  id: oss-signal
15
15
  with:
16
16
  fail-under: "80"
17
17
  output: oss-signal-report.md
18
+ summary: "true"
18
19
  - uses: actions/upload-artifact@v4
19
20
  with:
20
21
  name: oss-signal-report
@@ -2,7 +2,7 @@
2
2
 
3
3
  Repository: `https://github.com/SalmonPlays/oss-signal`
4
4
  Source: GitHub (SalmonPlays/oss-signal@main)
5
- Generated: 2026-06-02T06:02:52.844Z
5
+ Generated: 2026-06-02T08:09:34.957Z
6
6
 
7
7
  Score: **100/100** (A)
8
8
 
@@ -13,8 +13,8 @@ Important notes:
13
13
 
14
14
  ## Audited Repositories
15
15
 
16
- | Repository | Local score | Draft | Posted issue |
17
- | --- | ---: | --- | --- |
18
- | `platformatic/massimo` | 58/100 | [issue draft](platformatic-massimo-issue-draft.md) | [#159](https://github.com/platformatic/massimo/issues/159) |
19
- | `supermarkt/checkjebon` | 21/100 | [issue draft](supermarkt-checkjebon-issue-draft.md) | [#22](https://github.com/supermarkt/checkjebon/issues/22) |
20
- | `sammorrisdesign/interactive-feed` | 31/100 | [issue draft](sammorrisdesign-interactive-feed-issue-draft.md) | [#14](https://github.com/sammorrisdesign/interactive-feed/issues/14) |
16
+ | Repository | Local score | Draft | Posted issue | Follow-up PR |
17
+ | --- | ---: | --- | --- | --- |
18
+ | `platformatic/massimo` | 58/100 | [issue draft](platformatic-massimo-issue-draft.md) | [#159](https://github.com/platformatic/massimo/issues/159) | [#160](https://github.com/platformatic/massimo/pull/160) |
19
+ | `supermarkt/checkjebon` | 21/100 | [issue draft](supermarkt-checkjebon-issue-draft.md) | [#22](https://github.com/supermarkt/checkjebon/issues/22) | [#23](https://github.com/supermarkt/checkjebon/pull/23) |
20
+ | `sammorrisdesign/interactive-feed` | 31/100 | [issue draft](sammorrisdesign-interactive-feed-issue-draft.md) | [#14](https://github.com/sammorrisdesign/interactive-feed/issues/14) | [#15](https://github.com/sammorrisdesign/interactive-feed/pull/15) |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Repository: `/Users/amon/Documents/Codex/2026-06-01/openai-s/outputs/oss-signal`
4
4
  Source: local
5
- Generated: 2026-06-02T06:02:50.825Z
5
+ Generated: 2026-06-02T08:09:32.913Z
6
6
 
7
7
  Score: **100/100** (A)
8
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oss-signal",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A dependency-light CLI that audits open-source repository maintenance readiness.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/action.js CHANGED
@@ -28,6 +28,10 @@ export async function runAction(env = process.env, stdout = process.stdout, stde
28
28
  "report-path": options.output ?? ""
29
29
  });
30
30
 
31
+ if (options.summary) {
32
+ await writeGitHubStepSummary(env.GITHUB_STEP_SUMMARY, report);
33
+ }
34
+
31
35
  if (typeof options.failUnder === "number" && report.score < options.failUnder) {
32
36
  stderr.write(`oss-signal: score ${report.score} is below fail-under ${options.failUnder}\n`);
33
37
  process.exitCode = 1;
@@ -48,7 +52,8 @@ export function parseActionInputs(env = process.env) {
48
52
  output: emptyToUndefined(getInput(env, "output")) ?? "oss-signal-report.md",
49
53
  failUnder: parseOptionalNumber(getInput(env, "fail-under"), "fail-under"),
50
54
  maxFiles: parseOptionalNumber(getInput(env, "max-files"), "max-files") ?? 20000,
51
- ref: emptyToUndefined(getInput(env, "ref"))
55
+ ref: emptyToUndefined(getInput(env, "ref")),
56
+ summary: parseOptionalBoolean(getInput(env, "summary"), "summary") ?? true
52
57
  };
53
58
  }
54
59
 
@@ -63,6 +68,36 @@ export async function writeGitHubOutput(outputFile, values) {
63
68
  await fs.appendFile(outputFile, `${body}\n`, "utf8");
64
69
  }
65
70
 
71
+ export async function writeGitHubStepSummary(summaryFile, report) {
72
+ if (!summaryFile) {
73
+ return;
74
+ }
75
+
76
+ const failedChecks = report.checks.filter((check) => !check.passed);
77
+ const nextSteps = failedChecks.length > 0
78
+ ? failedChecks.map((check) => `- **${check.label}:** ${check.fix}`).join("\n")
79
+ : "- No missing maintainer-readiness checks found.";
80
+
81
+ const body = [
82
+ "# oss-signal",
83
+ "",
84
+ `Score: **${report.score}/100 (${report.grade})**`,
85
+ "",
86
+ "| Result | Count |",
87
+ "| --- | ---: |",
88
+ `| Passed | ${report.summary.passed} |`,
89
+ `| Failed | ${report.summary.failed} |`,
90
+ `| Total checks | ${report.summary.total} |`,
91
+ "",
92
+ "## Recommended next steps",
93
+ "",
94
+ nextSteps,
95
+ ""
96
+ ].join("\n");
97
+
98
+ await fs.appendFile(summaryFile, body, "utf8");
99
+ }
100
+
66
101
  function getInput(env, name) {
67
102
  const directKey = `INPUT_${name.toUpperCase()}`;
68
103
  const normalizedKey = `INPUT_${name.toUpperCase().replaceAll("-", "_")}`;
@@ -82,6 +117,22 @@ function parseOptionalNumber(value, name) {
82
117
  return parsed;
83
118
  }
84
119
 
120
+ function parseOptionalBoolean(value, name) {
121
+ const normalized = emptyToUndefined(value)?.toLowerCase();
122
+ if (normalized === undefined) {
123
+ return undefined;
124
+ }
125
+
126
+ if (["1", "true", "yes", "on"].includes(normalized)) {
127
+ return true;
128
+ }
129
+ if (["0", "false", "no", "off"].includes(normalized)) {
130
+ return false;
131
+ }
132
+
133
+ throw new Error(`${name} must be a boolean`);
134
+ }
135
+
85
136
  function emptyToUndefined(value) {
86
137
  return value === undefined || value === "" ? undefined : value;
87
138
  }
package/src/index.js CHANGED
@@ -2,7 +2,7 @@ import { promises as fs } from "node:fs";
2
2
  import https from "node:https";
3
3
  import path from "node:path";
4
4
 
5
- export const VERSION = "0.2.0";
5
+ export const VERSION = "0.3.0";
6
6
 
7
7
  const COMMUNITY_FILES = [
8
8
  {