projscan 3.0.7 → 3.0.9
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/CONTRIBUTING.md +209 -0
- package/DISCLAIMER.md +9 -0
- package/PRIVACY.md +41 -0
- package/README.md +46 -36
- package/SECURITY.md +42 -0
- package/TELEMETRY.md +100 -0
- package/THIRD-PARTY-NOTICES.md +52 -0
- package/TRADEMARKS.md +29 -0
- package/dist/cli/_shared.js +27 -0
- package/dist/cli/_shared.js.map +1 -1
- package/dist/cli/commands/feedback.js +3 -1
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/init.js +33 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +1 -0
- package/dist/cli/commands/telemetry.js +131 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adoption.d.ts +1 -1
- package/dist/core/adoption.js +7 -0
- package/dist/core/adoption.js.map +1 -1
- package/dist/core/telemetry.d.ts +114 -0
- package/dist/core/telemetry.js +442 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/grammars/tree-sitter-swift.wasm +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/tool-manifest.json +2 -2
- package/dist/utils/formatSupport.d.ts +5 -0
- package/dist/utils/formatSupport.js +5 -0
- package/dist/utils/formatSupport.js.map +1 -1
- package/package.json +10 -2
- package/public/projscan-icon.svg +23 -0
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Contributing to projscan
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing! Here's how to get started.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/abhiyoheswaran1/projscan.git
|
|
9
|
+
cd projscan
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Running locally
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Run the CLI directly from source
|
|
18
|
+
node dist/cli/index.js doctor
|
|
19
|
+
|
|
20
|
+
# Watch mode for development
|
|
21
|
+
npm run dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Running tests
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm test # Run all tests
|
|
28
|
+
npm run test:watch # Watch mode
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Linting and formatting
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm run lint # ESLint
|
|
35
|
+
npm run format # Prettier
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## How to Contribute
|
|
39
|
+
|
|
40
|
+
### Reporting Bugs
|
|
41
|
+
|
|
42
|
+
For security vulnerabilities, do not open a public issue. Follow [SECURITY.md](SECURITY.md).
|
|
43
|
+
|
|
44
|
+
For ordinary bugs, open an [issue](https://github.com/abhiyoheswaran1/projscan/issues/new?template=bug_report.md) with:
|
|
45
|
+
- Steps to reproduce
|
|
46
|
+
- Expected vs actual behavior
|
|
47
|
+
- Node.js version and OS
|
|
48
|
+
|
|
49
|
+
### Suggesting Features
|
|
50
|
+
|
|
51
|
+
Open an [issue](https://github.com/abhiyoheswaran1/projscan/issues/new?template=feature_request.md) describing:
|
|
52
|
+
- The problem you're trying to solve
|
|
53
|
+
- Your proposed solution
|
|
54
|
+
- Alternative approaches you've considered
|
|
55
|
+
|
|
56
|
+
### Submitting Pull Requests
|
|
57
|
+
|
|
58
|
+
1. Fork the repo and create a branch from `main`
|
|
59
|
+
2. Make your changes
|
|
60
|
+
3. Add or update tests as needed
|
|
61
|
+
4. Run `npm test` and `npm run lint` to verify
|
|
62
|
+
5. Write a clear PR description explaining the change
|
|
63
|
+
|
|
64
|
+
## Legal requirements for contributions
|
|
65
|
+
|
|
66
|
+
By contributing to projscan, you agree that your contribution will be licensed under the MIT License.
|
|
67
|
+
|
|
68
|
+
You also certify the [Developer Certificate of Origin 1.1](https://developercertificate.org/) for your contribution. In practical terms:
|
|
69
|
+
|
|
70
|
+
- you wrote the contribution, or you have the right to submit it under the project license
|
|
71
|
+
- you are not adding code, docs, images, datasets, or generated output that you cannot license to this project
|
|
72
|
+
- you understand that contributions are public and may be redistributed under the MIT License
|
|
73
|
+
|
|
74
|
+
Maintainers may ask for signed-off commits. Add a sign-off with:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git commit --amend --signoff
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Do not include secrets, private customer data, proprietary source code, or confidential vulnerability details in issues, pull requests, examples, screenshots, or fixtures.
|
|
81
|
+
|
|
82
|
+
The MIT License covers project code and docs. It does not grant rights to use the projscan or Baseframe Labs names, icons, or wordmarks in a way that implies endorsement. See [TRADEMARKS.md](TRADEMARKS.md).
|
|
83
|
+
|
|
84
|
+
## Project Structure
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
src/
|
|
88
|
+
├── cli/ # Command definitions (Commander.js)
|
|
89
|
+
├── core/ # Scanners, detectors, issue engine, hotspots, file inspector
|
|
90
|
+
│ └── languages/ # LanguageAdapter + per-language parsers (JS via babel, Python via tree-sitter)
|
|
91
|
+
├── analyzers/ # Issue checkers (eslint, prettier, test, architecture, deps, security, python*)
|
|
92
|
+
├── fixes/ # Auto-fix implementations (ESLint, Prettier, Vitest, EditorConfig)
|
|
93
|
+
├── reporters/ # Output formatters (console, JSON, markdown, SARIF)
|
|
94
|
+
├── mcp/ # MCP server - tools, prompts, resources for AI agents
|
|
95
|
+
└── utils/ # Shared utilities (config loader, changed-files, baseline, banner, logger)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Adding a language
|
|
99
|
+
|
|
100
|
+
As of 0.10, projscan has a `LanguageAdapter` interface (`src/core/languages/LanguageAdapter.ts`). Adding a new language means:
|
|
101
|
+
|
|
102
|
+
1. Implement the interface in `src/core/languages/<lang>Adapter.ts`. The Python adapter (`pythonAdapter.ts`) is the reference - it wraps a tree-sitter grammar, extracts imports/exports/symbol defs, resolves imports, and detects package roots.
|
|
103
|
+
2. Register the adapter in `src/core/languages/registry.ts`.
|
|
104
|
+
3. If the parser needs a grammar binary (e.g. another tree-sitter language), vendor the wasm under `dist/grammars/` via `scripts/copy-wasm.mjs` and add a test in `tests/integration/packSmokeTest.test.ts` that asserts it ships in the tarball.
|
|
105
|
+
4. Add language-specific analyzers under `src/analyzers/<lang>*.ts` (see `pythonTestCheck.ts`, `pythonLinterCheck.ts` for the pattern) and wire them into `src/core/issueEngine.ts`.
|
|
106
|
+
5. Add tests mirroring `tests/core/languages/pythonAdapter.*.test.ts` coverage (parse, imports, exports, resolver, package roots).
|
|
107
|
+
|
|
108
|
+
## Code Style
|
|
109
|
+
|
|
110
|
+
- TypeScript with strict mode
|
|
111
|
+
- ESLint + Prettier for formatting
|
|
112
|
+
- Keep dependencies minimal - avoid adding new runtime dependencies unless necessary
|
|
113
|
+
- Write tests for new analyzers and fixers
|
|
114
|
+
|
|
115
|
+
## Stable surface
|
|
116
|
+
|
|
117
|
+
The MCP tool inventory, CLI command list, and exit codes documented in `docs/STABILITY.md` are the **public contract**. CI runs `npm run check:stability` which compares the current build against `stability-baseline.json` checked into the repo root.
|
|
118
|
+
|
|
119
|
+
- **Adding** a new MCP tool, optional argument, or CLI command is fine - the guard prints additions but does not fail.
|
|
120
|
+
- **Removing** or **renaming** anything in the stable surface fails the guard. Either restore the surface or, if the change is intentional and warrants a major version bump, regenerate the baseline:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
npm run build
|
|
124
|
+
node scripts/check-stability.mjs --update
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Only run `--update` when you genuinely intend to break the contract (i.e. a major-version release). The friction is the point.
|
|
128
|
+
|
|
129
|
+
## Areas wanting help
|
|
130
|
+
|
|
131
|
+
Concrete on-ramps for new contributors. Each is scoped to fit a first PR. Pre-drafted starter tasks live under [`.github/seed-issues/`](.github/seed-issues/) — pick one and either claim its corresponding GitHub issue or open one and link the file.
|
|
132
|
+
|
|
133
|
+
- **New language adapters.** The `LanguageAdapter` interface (`src/core/languages/LanguageAdapter.ts`) is the cleanest entry point. Seven languages are wired today (JS, TS, Python, Go, Java, Ruby, Rust). The Python and Rust adapters are good references — Python for the simplest shape, Rust for a recent end-to-end example. Each adapter is ~200 LOC plus walkers (imports, exports, CC, per-fn CC, callSites) and a vendored tree-sitter grammar wasm. Pre-drafted tickets: [PHP](.github/seed-issues/02-add-php-language-adapter.md), [C#](.github/seed-issues/03-add-c-sharp-language-adapter.md). Plus a [step-by-step walkthrough doc](.github/seed-issues/08-doc-walkthrough-language-adapter.md) is itself an open issue.
|
|
134
|
+
- **New analyzers.** Issue checkers live in `src/analyzers/`. Each is a pure function `(rootPath, files) => Promise<Issue[]>`. Existing ones (`testCheck`, `prettierCheck`, `securityCheck`, `dependencyRiskCheck`, `cycleCheck`) are good shape templates. Wire into `src/core/issueEngine.ts`. Tests in `tests/analyzers/`.
|
|
135
|
+
- **New reporters.** Output formatters in `src/reporters/`. Implement the same surface as `consoleReporter.ts` / `markdownReporter.ts` / `jsonReporter.ts` / `htmlReporter.ts`. Pre-drafted tickets: [HTML for `pr-diff`](.github/seed-issues/04-html-reporter-for-pr-diff.md), [HTML for `coverage`](.github/seed-issues/05-html-reporter-for-coverage.md).
|
|
136
|
+
- **MCP tools.** Each tool is a `{name, description, inputSchema, handler}` object exported from `src/mcp/tools/<name>.ts` and registered in `src/mcp/tools.ts`. Mirror an existing one (e.g. `src/mcp/tools/coupling.ts` is a clean shape). Add a `tools/list` assertion to `tests/mcp/server.test.ts`.
|
|
137
|
+
- **Fix-suggest templates.** The rule-driven action-prompt registry in `src/core/fixSuggest.ts` covers ~12 issue families. Each new template is ~25 LOC. Pre-drafted ticket: [eslint-* template](.github/seed-issues/06-eslint-fix-suggest-template.md).
|
|
138
|
+
- **UX polish.** Small, high-leverage CLI ergonomics. Pre-drafted ticket: [impact-symbol disambiguation warning](.github/seed-issues/07-impact-cli-symbol-disambiguation.md).
|
|
139
|
+
- **Documentation.** `docs/GUIDE.md` covers the agent journey + per-command reference; tighter sections still wanted: per-analyzer "what triggers / how to silence" tables, monorepo setup walkthroughs, framework-specific guides.
|
|
140
|
+
|
|
141
|
+
### First-time contributor walkthrough
|
|
142
|
+
|
|
143
|
+
If you've never landed a PR on this repo before, the smallest possible loop:
|
|
144
|
+
|
|
145
|
+
```sh
|
|
146
|
+
# 1. Fork on GitHub, then locally:
|
|
147
|
+
git clone git@github.com:<your-username>/projscan.git
|
|
148
|
+
cd projscan
|
|
149
|
+
|
|
150
|
+
# 2. Verify the baseline works (no code changes yet)
|
|
151
|
+
npm install
|
|
152
|
+
npm test # 800+ tests, ~6s
|
|
153
|
+
npm run lint # eslint, no errors expected
|
|
154
|
+
npm run build # tsc + wasm copy + manifest generation
|
|
155
|
+
npm run check:stability # baseline diff; should be clean
|
|
156
|
+
|
|
157
|
+
# 3. Pick a seed issue, mirror the template it points at
|
|
158
|
+
# e.g. .github/seed-issues/06-eslint-fix-suggest-template.md
|
|
159
|
+
# -> open src/core/fixSuggest.ts, find the existing templates,
|
|
160
|
+
# mirror one, write tests, run npm test
|
|
161
|
+
|
|
162
|
+
# 4. Commit + push to your fork
|
|
163
|
+
git checkout -b feat/eslint-fix-template
|
|
164
|
+
git add -A
|
|
165
|
+
git commit -m "Add fix-suggest template for eslint-* rules"
|
|
166
|
+
git push origin feat/eslint-fix-template
|
|
167
|
+
|
|
168
|
+
# 5. Open a PR back to abhiyoheswaran1/projscan:main
|
|
169
|
+
# Reference the seed issue file in the PR description.
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
CI runs the same checks (`npm test`, `npm run lint`, `npm run check:stability`) on every PR. As long as those pass, a maintainer will review.
|
|
173
|
+
|
|
174
|
+
For larger work (refactors, cross-cutting changes), open an issue first to discuss the approach. We'd rather agree on the shape before you spend a weekend on it.
|
|
175
|
+
|
|
176
|
+
## Releasing
|
|
177
|
+
|
|
178
|
+
A release is a four-step ritual now that `.github/workflows/release.yml` does the heavy lifting. Steps 1-3 prep and ship the npm, GitHub Release, and MCP Registry surfaces; step 4 is the website surface that lives in the separate website repo.
|
|
179
|
+
|
|
180
|
+
1. **Bump version + write the CHANGELOG entry** in a PR against `main`:
|
|
181
|
+
- `package.json#version` → new semver (patch for fixes, minor for features, major if anything breaks).
|
|
182
|
+
- `.github/mcp-registry/server.json` — bump BOTH `version` fields (top-level and `packages[0].version`). Description must stay ≤ 100 chars (registry limit).
|
|
183
|
+
- `CHANGELOG.md` — add a `## [X.Y.Z] — YYYY-MM-DD` section at the top in Keep-a-Changelog format. Cover Added / Changed / Removed / Notes; be honest about tradeoffs. The release workflow slices this verbatim into the GitHub Release body.
|
|
184
|
+
- Sweep for "X tools" / "Y languages" counts in `README.md`, `docs/GUIDE.md`, `docs/ROADMAP.md` and update them.
|
|
185
|
+
- **Regenerate the dogfood health badge.** Run `npx projscan badge` against the prepped tree. If the letter or score in the README badge changed, update `README.md` to match. **A drop in letter (e.g., A → B) is a release blocker** — fix the underlying signal before tagging. (The badge is a static `img.shields.io/badge` snapshot, not a live endpoint, so it stays consistent until the next release intentionally moves it.)
|
|
186
|
+
- Run `npm run release:check`. It reports version/changelog drift, dirty worktree state, tag state, and the next release action. When there are no metadata or git blockers, it also runs the build, release gate, tests, lint, stability check, SBOM generation, and packed install smoke.
|
|
187
|
+
|
|
188
|
+
2. **Merge the PR.** Per the project's PR-and-review rule, every change including release prep goes through review. Wait for CI to pass on the merged `main` commit before tagging.
|
|
189
|
+
|
|
190
|
+
3. **Tag and push.** Tags are allowed from `main` only. Never tag or publish from a feature, fix, release, or temporary branch. From a clean, current `main` checkout, run:
|
|
191
|
+
```
|
|
192
|
+
git switch main
|
|
193
|
+
git pull --ff-only origin main
|
|
194
|
+
npm run release:check
|
|
195
|
+
git tag -a vX.Y.Z -m "Release vX.Y.Z"
|
|
196
|
+
git push origin vX.Y.Z
|
|
197
|
+
```
|
|
198
|
+
The `Release` workflow fires automatically. It validates versions, runs the full build / test / lint / stability gate, slices the CHANGELOG entry, publishes to npm with provenance, creates the GitHub Release with `dist/tool-manifest.json` and the SBOM attached, and republishes the MCP Registry metadata through GitHub OIDC. If anything fails before npm, no GitHub Release is created and no npm publish happens. If anything fails after npm, fix it and use the workflow's `workflow_dispatch` re-run with the same tag; npm, GitHub Release, and MCP Registry steps are idempotent.
|
|
199
|
+
|
|
200
|
+
4. **Bump the website's expectations** (separate repo). In the personal-website repo, open `tools.astro` (or wherever the EXPECTED block lives) and edit:
|
|
201
|
+
- The hardcoded **manifest URL pin** → swap `releases/download/vX.Y.Z/tool-manifest.json` for the new tag.
|
|
202
|
+
- `EXPECTED.minVersion` → the new version.
|
|
203
|
+
- `EXPECTED.requiredTools` → append any new MCP tool names the release added.
|
|
204
|
+
|
|
205
|
+
The website build refuses to run until all three edits are in. That friction is the feature — it prevents the docs page from drifting out of sync with the published tool surface. The changelog page is regenerated from `CHANGELOG.md` on `main` at build time, so the next site build naturally picks up the new entry.
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
By contributing, you agree that your contributions will be licensed under the MIT License. See [LICENSE](LICENSE), [DISCLAIMER.md](DISCLAIMER.md), and [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
|
package/DISCLAIMER.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Disclaimer
|
|
2
|
+
|
|
3
|
+
projscan is provided under the MIT License and ships without warranties. See [LICENSE](LICENSE) for the binding license terms.
|
|
4
|
+
|
|
5
|
+
projscan reports are developer-assistance signals. They are not legal, security, compliance, financial, or professional advice. A human maintainer remains responsible for release decisions, vulnerability handling, dependency review, and production changes.
|
|
6
|
+
|
|
7
|
+
Security, dataflow, supply-chain, and quality findings can be incomplete or wrong. Treat `block`, `caution`, and `proceed` verdicts as review inputs, not guarantees.
|
|
8
|
+
|
|
9
|
+
Local plugins run as local code when enabled. Only run plugins you trust.
|
package/PRIVACY.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# projscan Privacy Notice
|
|
2
|
+
|
|
3
|
+
projscan is a local, open-source developer tool. This notice applies to the projscan CLI, MCP server, package contents, generated local artifacts, and repository docs.
|
|
4
|
+
|
|
5
|
+
projscan is part of the Baseframe Labs family of products (https://www.baseframelabs.com). Baseframe Labs is an umbrella brand, not the legal subject of this notice. This notice applies to projscan only.
|
|
6
|
+
|
|
7
|
+
## Local-first behavior
|
|
8
|
+
|
|
9
|
+
By default, projscan runs on your machine and reads files in the repository where you run it. It does not upload source code, dependency data, scan results, telemetry, or usage analytics to a projscan service.
|
|
10
|
+
|
|
11
|
+
projscan may write local files when you ask it to, such as `.projscan-cache/`, `.projscan-feedback.json`, baselines, handoff files, generated policies, generated GitHub Actions, or reports.
|
|
12
|
+
|
|
13
|
+
## Commands that can involve network access
|
|
14
|
+
|
|
15
|
+
Some workflows can involve network access because they call external tooling or package managers:
|
|
16
|
+
|
|
17
|
+
- installing projscan with npm or running it through npx contacts the npm registry before projscan starts
|
|
18
|
+
- `projscan audit` shells out to npm audit behavior for the current project
|
|
19
|
+
- commands or modes that explicitly ask for registry checks may contact the configured package registry
|
|
20
|
+
- semantic search can download an optional local embedding model when the optional `@xenova/transformers` peer is installed and the user opts into semantic mode
|
|
21
|
+
- local analyzer or reporter plugins can do anything their code does; only enable plugins you trust
|
|
22
|
+
|
|
23
|
+
## Environment variables and secrets
|
|
24
|
+
|
|
25
|
+
projscan may pass `process.env` to child processes such as Git or npm so those tools work normally. projscan does not intentionally inspect `.env` values, API keys, session tokens, or private credentials for telemetry or product analytics.
|
|
26
|
+
|
|
27
|
+
Security analyzers may flag committed secret-looking strings in repository files. Those findings stay in local output unless you choose to copy, save, or publish them.
|
|
28
|
+
|
|
29
|
+
## Optional telemetry
|
|
30
|
+
|
|
31
|
+
Telemetry is off by default. Users can opt in with `projscan telemetry enable` or through the interactive `projscan init team` prompt. When enabled, projscan sends only anonymous product-health events: command category, success/failure, duration bucket, version/platform, setup booleans, repeat-use buckets, and optional feedback buckets. It does not send source code, file paths, repository names, branch names, package names, usernames, email addresses, raw findings, secrets, environment values, or scan reports.
|
|
32
|
+
|
|
33
|
+
See `TELEMETRY.md` for the full allowlist, controls, endpoint, and environment variables.
|
|
34
|
+
|
|
35
|
+
## Feedback artifacts
|
|
36
|
+
|
|
37
|
+
`projscan feedback` creates local JSON evidence about reviewer usefulness, minutes saved, prevented bad edits, false positives, owner clarity, next-command clarity, and repeat PR use. Treat that artifact as team data. Do not commit it if it contains private PR URLs, reviewer handles, or internal notes you do not want public.
|
|
38
|
+
|
|
39
|
+
## Contact
|
|
40
|
+
|
|
41
|
+
For privacy or security questions about projscan, contact support@baseframelabs.com.
|
package/README.md
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
**Agent-first code intelligence.** An MCP server that lets AI coding agents (Claude Code, Codex, Cursor, Gemini, Windsurf, Cline, Continue, Zed — any MCP-aware client) query your codebase — with a CLI for humans and a local plugin layer for team-specific policy and reporting.
|
|
11
11
|
|
|
12
|
-
[AI Agent Quick Start](#ai-agent-integration-mcp) · [CLI Quick Start](#quick-start) · [Commands](#commands) · [Full Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
12
|
+
[AI Agent Quick Start](#ai-agent-integration-mcp) · [CLI Quick Start](#quick-start) · [Commands](#commands) · [Full Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/GUIDE.md) · [Roadmap](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/ROADMAP.md)
|
|
13
13
|
|
|
14
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
14
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/projscan-reporter-plugin.png" alt="projscan reporter plugin running in a macOS-style terminal window with a team health summary" width="700">
|
|
15
15
|
|
|
16
16
|
</div>
|
|
17
17
|
|
|
@@ -19,23 +19,21 @@
|
|
|
19
19
|
|
|
20
20
|
## Why?
|
|
21
21
|
|
|
22
|
-
AI coding agents are becoming the primary interface to code.
|
|
22
|
+
AI coding agents are becoming the primary interface to code. When you ask an agent *"which files implement auth?"* or *"what breaks if I bump React from 18 to 19?"*, it needs structured repo context, not raw grep output.
|
|
23
23
|
|
|
24
|
-
**projscan is
|
|
24
|
+
**projscan is code intelligence built for agents.** MCP clients get a fast, AST-backed, context-budget-aware view of your codebase: semantic graph, dataflow risks, review verdicts, hotspots, ownership, preflight gates, fix prompts, impact analysis, and durable session context. Everything is local and offline.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
For teams, projscan turns that context into a repeatable PR habit. `projscan init team` creates policy, CI, ownership, and baseline memory. `projscan evidence-pack --pr-comment` gives reviewers a compact verdict with top risks, First Fix, owner routing, baseline trend memory, and exact next commands. `projscan feedback`, `projscan dogfood`, and `projscan trial` measure whether the loop actually saved time, prevented risky edits, and stayed trustworthy across real repos.
|
|
27
27
|
|
|
28
|
-
The
|
|
28
|
+
The local plugin platform lets teams add project-specific findings and render `doctor`, `analyze`, and `ci` in their own voice without changing the scan pipeline. Humans get the same information through the CLI.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
**Everything is offline-first. Zero network calls. No API keys.**
|
|
30
|
+
**Everything is local-first. No source upload. No API keys. Anonymous product telemetry is off by default and only runs after explicit opt-in.**
|
|
33
31
|
|
|
34
32
|
```bash
|
|
35
33
|
npx projscan
|
|
36
34
|
```
|
|
37
35
|
|
|
38
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
36
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/projscan-reporter-plugin.gif" alt="projscan doctor rendered through a local reporter plugin in a macOS-style terminal window" width="700">
|
|
39
37
|
|
|
40
38
|
Run `projscan doctor` for a focused health check:
|
|
41
39
|
|
|
@@ -43,7 +41,7 @@ Run `projscan doctor` for a focused health check:
|
|
|
43
41
|
npx projscan doctor
|
|
44
42
|
```
|
|
45
43
|
|
|
46
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
44
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20doctor.gif" alt="npx projscan doctor" width="700">
|
|
47
45
|
|
|
48
46
|
## Install
|
|
49
47
|
|
|
@@ -78,9 +76,10 @@ projscan quality-scorecard --format json # Dimensioned quality view
|
|
|
78
76
|
projscan release-train --format json # Product readiness plan
|
|
79
77
|
projscan evidence-pack --website-prompt # Approval packet with product evidence
|
|
80
78
|
projscan evidence-pack --pr-comment # PR comment with trust calibration + First Fix
|
|
79
|
+
projscan telemetry explain # See the default-off telemetry boundary
|
|
81
80
|
projscan feedback init --output .projscan-feedback.json # Create reviewer feedback evidence
|
|
82
81
|
projscan dogfood --repo ../api --repo ../web --format json # Multi-repo adoption proof loop
|
|
83
|
-
projscan trial --repo ../api --repo ../web --feedback .projscan-feedback.json --format json #
|
|
82
|
+
projscan trial --repo ../api --repo ../web --feedback .projscan-feedback.json --format json # Adoption-readiness report
|
|
84
83
|
projscan regression-plan --level full # Risk-based verification matrix
|
|
85
84
|
projscan handoff # Concise next-agent handoff
|
|
86
85
|
projscan handoff --write docs/agent-handoff.md # Persist next-agent handoff artifact
|
|
@@ -109,9 +108,9 @@ projscan plugin test .projscan-plugins/policy.projscan-plugin.json
|
|
|
109
108
|
PROJSCAN_PLUGINS_PREVIEW=1 projscan doctor --reporter team-radar
|
|
110
109
|
```
|
|
111
110
|
|
|
112
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
111
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20--help.gif" alt="npx projscan --help" width="700">
|
|
113
112
|
|
|
114
|
-
For a comprehensive walkthrough, see the **[Full Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
113
|
+
For a comprehensive walkthrough, see the **[Full Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/GUIDE.md)**.
|
|
115
114
|
|
|
116
115
|
## Commands
|
|
117
116
|
|
|
@@ -134,6 +133,7 @@ For a comprehensive walkthrough, see the **[Full Guide](https://github.com/abhiy
|
|
|
134
133
|
| `projscan evidence-pack` | Assemble approval evidence from planning, bug-hunt, workplan, preflight, trust calibration, First Fix, owner routing, and baseline trend memory |
|
|
135
134
|
| `projscan trial` | Produce one adoption-readiness report from onboarding, dogfood, feedback, trust signals, and website proof |
|
|
136
135
|
| `projscan feedback` | Capture measured reviewer feedback: minutes saved, prevented bad edits, false positives, and repeat PR use |
|
|
136
|
+
| `projscan telemetry` | Explicit default-off telemetry controls: status, enable, disable, and explain |
|
|
137
137
|
| `projscan dogfood` | Evaluate 1+ real repos for PR-comment readiness, repeat-use readiness, MCP readiness, and reviewer feedback prompts |
|
|
138
138
|
| `projscan regression-plan` | Build a smoke, focused, or full regression matrix from product risk signals |
|
|
139
139
|
| `projscan handoff` | Concise next-agent handoff from the current workplan |
|
|
@@ -175,31 +175,31 @@ projscan --help
|
|
|
175
175
|
<details>
|
|
176
176
|
<summary><strong>projscan structure</strong> - Directory tree with file counts</summary>
|
|
177
177
|
|
|
178
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
178
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20structure.gif" alt="npx projscan structure" width="700">
|
|
179
179
|
</details>
|
|
180
180
|
|
|
181
181
|
<details>
|
|
182
182
|
<summary><strong>projscan diagram</strong> - Architecture visualization</summary>
|
|
183
183
|
|
|
184
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
184
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20diagram.gif" alt="npx projscan diagram" width="700">
|
|
185
185
|
</details>
|
|
186
186
|
|
|
187
187
|
<details>
|
|
188
188
|
<summary><strong>projscan dependencies</strong> - Dependency analysis</summary>
|
|
189
189
|
|
|
190
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
190
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20dependencies.gif" alt="npx projscan dependencies" width="700">
|
|
191
191
|
</details>
|
|
192
192
|
|
|
193
193
|
<details>
|
|
194
194
|
<summary><strong>projscan explain</strong> - File explanation</summary>
|
|
195
195
|
|
|
196
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
196
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20explain.gif" alt="npx projscan explain" width="700">
|
|
197
197
|
</details>
|
|
198
198
|
|
|
199
199
|
<details>
|
|
200
200
|
<summary><strong>projscan badge</strong> - Health badge generation</summary>
|
|
201
201
|
|
|
202
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
202
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20badge.gif" alt="npx projscan badge" width="700">
|
|
203
203
|
</details>
|
|
204
204
|
|
|
205
205
|
### Output Formats
|
|
@@ -221,7 +221,7 @@ Run `projscan help` for the generated command-by-command support matrix.
|
|
|
221
221
|
|
|
222
222
|
projscan can load local plugins from `.projscan-plugins/` when `PROJSCAN_PLUGINS_PREVIEW=1` is set. The environment flag is kept for explicit local-code opt-in. Analyzer plugins emit normal projscan issues; reporter plugins render supported CLI commands with team-specific output.
|
|
223
223
|
|
|
224
|
-
**2.0 upgrade notes:** migrating from 1.x or authoring plugins? Start with the [2.0 Migration Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
224
|
+
**2.0 upgrade notes:** migrating from 1.x or authoring plugins? Start with the [2.0 Migration Guide](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/2.0-MIGRATION.md), then use [Plugin Authoring](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/PLUGIN-AUTHORING.md), the [Plugin Gallery](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/PLUGIN-GALLERY.md), and the [manifest schema](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/plugin.schema.json) as the stable contract.
|
|
225
225
|
|
|
226
226
|
```bash
|
|
227
227
|
projscan plugin list
|
|
@@ -230,9 +230,9 @@ PROJSCAN_PLUGINS_PREVIEW=1 projscan doctor --reporter team-radar
|
|
|
230
230
|
PROJSCAN_PLUGINS_PREVIEW=1 projscan ci --reporter team-radar --min-score 80
|
|
231
231
|
```
|
|
232
232
|
|
|
233
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
233
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/projscan-reporter-plugin.gif" alt="projscan local reporter plugin rendering a team health report" width="700">
|
|
234
234
|
|
|
235
|
-
Reporter plugins are intentionally CLI-only. MCP tools keep returning structured JSON-compatible payloads so agents can reason over stable data, while humans can get a polished local report for their team. Custom presentation, team-branded summaries, and white-label reports belong in reporter plugins rather than new core HTML theming flags. See [Plugin Authoring](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
235
|
+
Reporter plugins are intentionally CLI-only. MCP tools keep returning structured JSON-compatible payloads so agents can reason over stable data, while humans can get a polished local report for their team. Custom presentation, team-branded summaries, and white-label reports belong in reporter plugins rather than new core HTML theming flags. See [Plugin Authoring](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/PLUGIN-AUTHORING.md) for manifest shape, `render(context)`, validation, and the trust model.
|
|
236
236
|
|
|
237
237
|
### Options
|
|
238
238
|
|
|
@@ -363,10 +363,10 @@ projscan reads your source code so it can be useful; it does not send your sourc
|
|
|
363
363
|
|
|
364
364
|
### What projscan does NOT do
|
|
365
365
|
|
|
366
|
-
- **Send your source code off-machine.**
|
|
366
|
+
- **Send your source code off-machine.** File contents stay local; AST analysis runs in-process. The only projscan-owned network path is explicit opt-in telemetry, and those events are anonymous product-health buckets, not code or scan results.
|
|
367
367
|
- **Read environment variables for secrets.** `process.env` is forwarded to child processes (`git`, `npm`) so they can find their `PATH` — we never inspect `.env` values, API keys, or session tokens.
|
|
368
368
|
- **Execute command-line arguments as code.** Core CLI and MCP arguments are parsed as data, and projscan does not compose shell strings from user input. Local plugins are the explicit trust boundary: when `PROJSCAN_PLUGINS_PREVIEW=1` is set, projscan imports local modules declared in `.projscan-plugins/*.projscan-plugin.json` and runs their `check` / `render` exports.
|
|
369
|
-
- **Phone home
|
|
369
|
+
- **Phone home silently.** Telemetry is off by default. If you explicitly opt in with `projscan telemetry enable` or the interactive `projscan init team` prompt, projscan sends only anonymous product-health events; it never sends source code, file paths, repo names, branch names, package names, usernames, raw findings, or secrets. See [TELEMETRY.md](TELEMETRY.md).
|
|
370
370
|
- **Modify your repo without an explicit command.** `projscan fix` is the only command that writes to source files, and only when invoked. The cache directory `.projscan-cache/` is local-only and gitignored.
|
|
371
371
|
|
|
372
372
|
### What projscan DOES do, and what it costs
|
|
@@ -377,6 +377,7 @@ projscan reads your source code so it can be useful; it does not send your sourc
|
|
|
377
377
|
| Spawn `git` | `hotspots`, `pr-diff`, `review`, `diff` | git itself may fetch if you run `git fetch` separately; **projscan never invokes `git fetch`** | `env: process.env` is passed so `git` can find its config |
|
|
378
378
|
| Spawn `npm audit` | `audit` only | yes — by `npm`, not by projscan | runs against your local lockfile |
|
|
379
379
|
| Scan supply-chain IOCs | `doctor`, `preflight`, release validation | no | checks manifests, lockfiles, hidden editor hooks, and suspicious install-time payloads against bundled indicators |
|
|
380
|
+
| Anonymous telemetry | only after `projscan telemetry enable` or accepting the `projscan init team` prompt | yes — projscan-owned, default off | sends product-health buckets only; see [TELEMETRY.md](TELEMETRY.md) |
|
|
380
381
|
| Load local plugins | only with `PROJSCAN_PLUGINS_PREVIEW=1` | no | imports local JS modules declared in `.projscan-plugins/`; only enable plugins you trust |
|
|
381
382
|
| Load wasm grammars | first parse of a non-JS file | no | served from `dist/grammars/` inside the package; no fetch |
|
|
382
383
|
| Build embeddings | semantic search opt-in only | yes — by `@xenova/transformers`, on first use | model cached locally after first download; remove the peer dep to remove this code path entirely |
|
|
@@ -393,7 +394,7 @@ If you read projscan's [Socket report](https://socket.dev/npm/package/projscan),
|
|
|
393
394
|
### Audit it yourself
|
|
394
395
|
|
|
395
396
|
- **Source is open** at [github.com/abhiyoheswaran1/projscan](https://github.com/abhiyoheswaran1/projscan). The npm tarball matches the `dist/` produced by `npm run build` at the matching tag.
|
|
396
|
-
- **Public API surface is locked** by `scripts/check-stability.mjs`, which runs in CI on every PR and fails on any rename or removal of an MCP tool, CLI command, or exit code. See [`docs/STABILITY.md`](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
397
|
+
- **Public API surface is locked** by `scripts/check-stability.mjs`, which runs in CI on every PR and fails on any rename or removal of an MCP tool, CLI command, or exit code. See [`docs/STABILITY.md`](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/STABILITY.md).
|
|
397
398
|
- **Run it offline:** `npm install -g projscan` followed by anything except `audit` and `--mode semantic` works without network.
|
|
398
399
|
- **Drop privilege further:** in CI, run projscan in a sandbox that disallows network egress; everything except `audit` will pass.
|
|
399
400
|
|
|
@@ -423,14 +424,15 @@ For adoption proof, run the product against multiple real repos and capture firs
|
|
|
423
424
|
```sh
|
|
424
425
|
projscan evidence-pack --pr-comment
|
|
425
426
|
projscan feedback init --output .projscan-feedback.json
|
|
426
|
-
projscan feedback add --file .projscan-feedback.json --repo api --pr https://github.com/acme/api/pull/42 --reviewer @alice --useful true --minutes-saved 10
|
|
427
|
+
projscan feedback add --file .projscan-feedback.json --repo api --pr https://github.com/acme/api/pull/42 --reviewer @alice --useful true --minutes-saved 10 --owner-routing-clear true --next-command-clear true
|
|
428
|
+
projscan feedback summary --file .projscan-feedback.json --format json
|
|
427
429
|
projscan dogfood --repo ../api --repo ../web --repo ../worker --feedback .projscan-feedback.json --format json
|
|
428
430
|
projscan trial --repo ../api --repo ../web --repo ../worker --feedback .projscan-feedback.json --format json
|
|
429
431
|
```
|
|
430
432
|
|
|
431
|
-
The dogfood
|
|
433
|
+
The dogfood and trial reports check PR-comment readiness, repeat-use commands, MCP readiness, measured minutes saved, prevented bad edits, false positives, owner clarity, next-command clarity, and repeat PR usage before rollout.
|
|
432
434
|
|
|
433
|
-
The hotspots projscan finds in itself are real signals — the reporters in particular have grown organically across releases and
|
|
435
|
+
The hotspots projscan finds in itself are real signals — the reporters in particular have grown organically across releases and remain future refactor candidates in the roadmap. We choose to ship the signal honestly rather than tune the score to hide it.
|
|
434
436
|
|
|
435
437
|
## CI/CD Integration
|
|
436
438
|
|
|
@@ -443,7 +445,7 @@ projscan ci --changed-only # Gate only on this PR's diff
|
|
|
443
445
|
projscan ci --format sarif > projscan.sarif # SARIF for Code Scanning
|
|
444
446
|
```
|
|
445
447
|
|
|
446
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
448
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20ci%20--min-score%2070.gif" alt="npx projscan ci --min-score 70" width="700">
|
|
447
449
|
|
|
448
450
|
### GitHub Action (recommended)
|
|
449
451
|
|
|
@@ -512,7 +514,7 @@ Fields:
|
|
|
512
514
|
- `hotspots.limit` / `hotspots.since` - defaults for the `hotspots` command
|
|
513
515
|
- `monorepo.importPolicy` - cross-package import allow/deny rules in monorepos *(0.14+)*
|
|
514
516
|
|
|
515
|
-
See [`docs/GUIDE.md` → Configuration](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
517
|
+
See [`docs/GUIDE.md` → Configuration](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/GUIDE.md#configuration-projscanrc) for the full reference (field types, validation behavior, embedding config in `package.json`, monorepo `importPolicy` semantics).
|
|
516
518
|
|
|
517
519
|
## Tracking Health Over Time
|
|
518
520
|
|
|
@@ -525,7 +527,7 @@ projscan diff # Compare against baseline
|
|
|
525
527
|
projscan diff --format markdown # Markdown diff for PRs
|
|
526
528
|
```
|
|
527
529
|
|
|
528
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
530
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/npx%20projscan%20diff%20--save-baseline.gif" alt="npx projscan diff --save-baseline" width="700">
|
|
529
531
|
|
|
530
532
|
## Hotspots - Where to Fix First
|
|
531
533
|
|
|
@@ -614,7 +616,7 @@ Coverage is also automatically joined into `projscan hotspots` when one of those
|
|
|
614
616
|
|
|
615
617
|
**This is the primary way to use projscan.** `projscan mcp` starts an [MCP](https://modelcontextprotocol.io) server over stdio so AI coding agents can query your codebase with real structural accuracy - not regex, not grep.
|
|
616
618
|
|
|
617
|
-
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.
|
|
619
|
+
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v3.0.9/docs/projscan-agent-demo.gif" alt="projscan answering two agent questions: what breaks if I rename buildCodeGraph (impact analysis with definitions, direct callers, transitive reach), and where should I fix first (ranked hotspots with cyclomatic complexity)" width="700">
|
|
618
620
|
|
|
619
621
|
Two questions an agent asks; structural answers in milliseconds. *"What breaks if I rename `buildCodeGraph`?"* → 31 direct callers, 97 files reachable. *"Where should I fix first?"* → ranked hotspots with AST cyclomatic complexity, churn, and ownership signals.
|
|
620
622
|
|
|
@@ -811,7 +813,7 @@ Capability is advertised under `experimental.fileChanged` on `initialize` so cli
|
|
|
811
813
|
- **`projscan_apply_fix`** *(1.6)* - mechanically execute the safe fix templates. Default is dry-run; pass `confirm: true` to write. Atomic writes, per-apply rollback record at `.projscan-cache/rollbacks/<id>.json`. Reverse with `action: "rollback", rollback_id: ...`. Six templates supported at this release: `unused-dependency-*`, `missing-test-framework`, `missing-eslint`, `missing-prettier`, `missing-editorconfig`, `missing-readme`.
|
|
812
814
|
- **`projscan_taint`** *(1.6)* - source-to-sink reachability over the per-function call graph. Built-in defaults cover common JS / Python sources (`process.env`, `req.body`, etc.) and sinks (`exec`, `eval`, `db.query`, etc.). Project-specific names go in `.projscanrc.json` `taint`. `projscan_review` automatically diffs taint flows between base and head and **blocks any PR that introduces a new flow**. In 3.0.2, review surfaces hardened `newDataflowRisks`, compact `graphEvidence`, and graph-readiness gates for safer handoff.
|
|
813
815
|
|
|
814
|
-
Analyzer plugins can optionally read graph/dataflow context through `check(rootPath, files, context)` while staying on manifest schema v1. The packaged `graph-context` example shows `context.getSemanticGraph()` and `context.getDataflow()` in a real analyzer. For analyzer and reporter plugin authoring, manifest validation, `--reporter <name>`, and the trust model, see [Plugin Authoring](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.
|
|
816
|
+
Analyzer plugins can optionally read graph/dataflow context through `check(rootPath, files, context)` while staying on manifest schema v1. The packaged `graph-context` example shows `context.getSemanticGraph()` and `context.getDataflow()` in a real analyzer. For analyzer and reporter plugin authoring, manifest validation, `--reporter <name>`, and the trust model, see [Plugin Authoring](https://github.com/abhiyoheswaran1/projscan/blob/v3.0.9/docs/PLUGIN-AUTHORING.md).
|
|
815
817
|
|
|
816
818
|
### Context-window budgeting
|
|
817
819
|
|
|
@@ -880,11 +882,19 @@ projscan caches parsed ASTs at `.projscan-cache/graph.json` (auto-gitignored). F
|
|
|
880
882
|
|
|
881
883
|
## Contributing
|
|
882
884
|
|
|
883
|
-
Contributions are welcome
|
|
885
|
+
Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a PR. Contributions are accepted under the MIT License and the DCO 1.1 certification described there.
|
|
886
|
+
|
|
887
|
+
## Legal and Trust
|
|
884
888
|
|
|
885
|
-
|
|
889
|
+
- License: [MIT](LICENSE)
|
|
890
|
+
- Disclaimer: [DISCLAIMER.md](DISCLAIMER.md)
|
|
891
|
+
- Security policy: [SECURITY.md](SECURITY.md)
|
|
892
|
+
- Privacy notice: [PRIVACY.md](PRIVACY.md)
|
|
893
|
+
- Telemetry policy: [TELEMETRY.md](TELEMETRY.md)
|
|
894
|
+
- Trademark and brand policy: [TRADEMARKS.md](TRADEMARKS.md)
|
|
895
|
+
- Third-party notices: [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)
|
|
886
896
|
|
|
887
|
-
|
|
897
|
+
projscan is free and open source. The CLI and MCP server are local-first and do not upload source code or scan results to a projscan service. Anonymous product telemetry is default-off and only runs after explicit opt-in.
|
|
888
898
|
|
|
889
899
|
<p align="center">
|
|
890
900
|
<a href="https://www.baseframelabs.com" target="_blank" rel="noopener" title="Part of Baseframe Labs">
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
Please do not report security vulnerabilities in public GitHub issues.
|
|
6
|
+
|
|
7
|
+
Email vulnerability reports to support@baseframelabs.com with:
|
|
8
|
+
|
|
9
|
+
- affected projscan version
|
|
10
|
+
- operating system and Node.js version
|
|
11
|
+
- steps to reproduce
|
|
12
|
+
- impact you believe the issue has
|
|
13
|
+
- whether the report includes secret material or private repository data
|
|
14
|
+
|
|
15
|
+
We will acknowledge reports as soon as practical and will coordinate a fix, disclosure notes, and release timing based on severity.
|
|
16
|
+
|
|
17
|
+
## Supported versions
|
|
18
|
+
|
|
19
|
+
Security fixes target the latest published npm version of `projscan`. Older versions may receive guidance, but we do not promise backports unless a maintainer explicitly says so in the advisory.
|
|
20
|
+
|
|
21
|
+
## Scope
|
|
22
|
+
|
|
23
|
+
In scope:
|
|
24
|
+
|
|
25
|
+
- vulnerabilities in the `projscan` CLI, MCP server, local plugin loader, generated GitHub Action templates, and packaged runtime artifacts
|
|
26
|
+
- cases where projscan unintentionally reads, exposes, uploads, or persists sensitive local data
|
|
27
|
+
- supply-chain or package-integrity issues in the published npm package
|
|
28
|
+
|
|
29
|
+
Out of scope:
|
|
30
|
+
|
|
31
|
+
- vulnerabilities in a user's repository that projscan reports
|
|
32
|
+
- issues caused only by untrusted local plugins enabled through `PROJSCAN_PLUGINS_PREVIEW=1`
|
|
33
|
+
- npm, Git, or operating-system behavior outside projscan's control
|
|
34
|
+
- social engineering, spam, or denial-of-service reports without a concrete projscan defect
|
|
35
|
+
|
|
36
|
+
## Safe harbor
|
|
37
|
+
|
|
38
|
+
Good-faith testing is welcome when it avoids harm, privacy violations, data destruction, service disruption, and access to systems or data you do not own. Stop testing and contact us if you reach sensitive data.
|
|
39
|
+
|
|
40
|
+
## Security contact and brand note
|
|
41
|
+
|
|
42
|
+
Baseframe Labs is the umbrella brand for this product family. It is not currently a formed legal entity. Please do not address legal notices to Baseframe Labs with any corporate designator.
|