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.
Files changed (57) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/CODE_OF_CONDUCT.md +7 -0
  3. package/CONTRIBUTING.md +30 -0
  4. package/LICENSE +21 -0
  5. package/README.md +158 -0
  6. package/SECURITY.md +12 -0
  7. package/action.yml +45 -0
  8. package/dist/action-artifacts.d.ts +3 -0
  9. package/dist/action-artifacts.d.ts.map +1 -0
  10. package/dist/action-artifacts.js +38 -0
  11. package/dist/action-artifacts.js.map +1 -0
  12. package/dist/cli.d.ts +4 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +117 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/errors.d.ts +19 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +31 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/format.d.ts +8 -0
  21. package/dist/format.d.ts.map +1 -0
  22. package/dist/format.js +127 -0
  23. package/dist/format.js.map +1 -0
  24. package/dist/git.d.ts +3 -0
  25. package/dist/git.d.ts.map +1 -0
  26. package/dist/git.js +168 -0
  27. package/dist/git.js.map +1 -0
  28. package/dist/github-annotations.d.ts +3 -0
  29. package/dist/github-annotations.d.ts.map +1 -0
  30. package/dist/github-annotations.js +36 -0
  31. package/dist/github-annotations.js.map +1 -0
  32. package/dist/report-rules.d.ts +12 -0
  33. package/dist/report-rules.d.ts.map +1 -0
  34. package/dist/report-rules.js +207 -0
  35. package/dist/report-rules.js.map +1 -0
  36. package/dist/report.d.ts +3 -0
  37. package/dist/report.d.ts.map +1 -0
  38. package/dist/report.js +26 -0
  39. package/dist/report.js.map +1 -0
  40. package/dist/sarif.d.ts +3 -0
  41. package/dist/sarif.d.ts.map +1 -0
  42. package/dist/sarif.js +74 -0
  43. package/dist/sarif.js.map +1 -0
  44. package/dist/types.d.ts +52 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +11 -0
  47. package/dist/types.js.map +1 -0
  48. package/docs/CLAUDE_FOR_OSS_PLAYBOOK.md +31 -0
  49. package/docs/CONTRIBUTOR_BACKLOG.md +93 -0
  50. package/docs/RELEASE.md +38 -0
  51. package/docs/REPORT_SCHEMA.md +116 -0
  52. package/docs/ROADMAP.md +30 -0
  53. package/docs/examples/README.md +12 -0
  54. package/docs/examples/octocat-hello-world.md +44 -0
  55. package/docs/examples/sindresorhus-is.md +47 -0
  56. package/docs/report.schema.json +136 -0
  57. 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.
@@ -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,3 @@
1
+ import type { ActionId } from "./types.js";
2
+ export declare function artifactUriForAction(actionId: ActionId): string;
3
+ //# sourceMappingURL=action-artifacts.d.ts.map
@@ -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,4 @@
1
+ #!/usr/bin/env node
2
+ export declare function runScan(targetPath: string, rawOptions: unknown): Promise<string>;
3
+ export declare function main(argv: readonly string[]): Promise<void>;
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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"}