depwire-cli 0.9.30 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -8
- package/dist/{chunk-FUIZQCYB.js → chunk-5D36PY3Q.js} +10 -7
- package/dist/{chunk-WUSXCZXA.js → chunk-LV32EDYQ.js} +1703 -159
- package/dist/index.js +4 -4
- package/dist/mcpb-entry.js +2 -2
- package/dist/parser/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/dist/parser/grammars/tree-sitter-java.wasm +0 -0
- package/dist/sdk.js +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ This isn't a model problem. It's a context problem. The AI is flying blind.
|
|
|
39
39
|
|
|
40
40
|

|
|
41
41
|
|
|
42
|
+
Depwire is the context and safety layer for AI-generated code.
|
|
43
|
+
|
|
42
44
|
Depwire sits between your AI and your codebase. It builds a complete dependency graph using tree-sitter — deterministic, not probabilistic — and serves it to your AI through 17 MCP tools.
|
|
43
45
|
|
|
44
46
|
Four guarantees:
|
|
@@ -59,9 +61,9 @@ npm install -g depwire-cli
|
|
|
59
61
|
Three commands to understand any codebase:
|
|
60
62
|
|
|
61
63
|
```bash
|
|
62
|
-
depwire
|
|
63
|
-
depwire
|
|
64
|
-
depwire
|
|
64
|
+
depwire whatif # know what breaks before you change anything
|
|
65
|
+
depwire security # catch vulnerabilities before AI ships them
|
|
66
|
+
depwire viz # see your entire architecture instantly
|
|
65
67
|
```
|
|
66
68
|
|
|
67
69
|
---
|
|
@@ -103,7 +105,7 @@ Run without `--simulate` to open the browser UI — side-by-side arc diagrams sh
|
|
|
103
105
|
|
|
104
106
|
## Security scanner
|
|
105
107
|
|
|
106
|
-
AI
|
|
108
|
+
AI will confidently ship vulnerable code. Depwire stops it before production.
|
|
107
109
|
|
|
108
110
|
```bash
|
|
109
111
|
depwire security . # full repo scan
|
|
@@ -292,9 +294,57 @@ The SDK is the stable public API surface. All integrations should import from `d
|
|
|
292
294
|
|
|
293
295
|
## Language support
|
|
294
296
|
|
|
295
|
-
TypeScript, JavaScript, Python, Go, Rust, C — with cross-language edge detection between all supported languages.
|
|
297
|
+
TypeScript, JavaScript, Python, Go, Rust, C, C#, Java — with cross-language edge detection between all supported languages.
|
|
298
|
+
|
|
299
|
+
**Java / JVM** — classes, interfaces, enums, records, annotations, inner classes, anonymous classes, lambda expressions, Maven pom.xml and Gradle build file dependency edges, Spring Boot cross-language edges (@GetMapping, @PostMapping, @RequestMapping), JAX-RS / Jakarta EE route detection, Spring WebFlux RouterFunction support.
|
|
300
|
+
|
|
301
|
+
**C# / .NET** — classes, interfaces, records, structs, enums, delegates, file-scoped namespaces, primary constructors, global usings, .csproj ProjectReference and PackageReference edges, ASP.NET Core cross-language edges (attribute routing + Minimal API).
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## GitHub Action — PR Impact Analysis
|
|
306
|
+
|
|
307
|
+
Depwire integrates into your CI/CD pipeline via the [depwire-action](https://github.com/depwire/depwire-action) GitHub Action.
|
|
308
|
+
|
|
309
|
+
On every pull request it automatically posts a dependency impact report — which symbols changed, what breaks, health score before and after. Code reviewers see the architectural blast radius before merging.
|
|
310
|
+
|
|
311
|
+
Add to `.github/workflows/depwire.yml`:
|
|
312
|
+
|
|
313
|
+
```yaml
|
|
314
|
+
name: Depwire PR Impact
|
|
315
|
+
on:
|
|
316
|
+
pull_request:
|
|
317
|
+
branches: [main]
|
|
318
|
+
|
|
319
|
+
permissions:
|
|
320
|
+
contents: read
|
|
321
|
+
pull-requests: write
|
|
322
|
+
|
|
323
|
+
jobs:
|
|
324
|
+
depwire:
|
|
325
|
+
runs-on: ubuntu-latest
|
|
326
|
+
steps:
|
|
327
|
+
- uses: actions/checkout@v4
|
|
328
|
+
with:
|
|
329
|
+
fetch-depth: 0
|
|
330
|
+
- uses: actions/setup-node@v4
|
|
331
|
+
with:
|
|
332
|
+
node-version: '20'
|
|
333
|
+
- uses: depwire/depwire-action@v1
|
|
334
|
+
with:
|
|
335
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Block PRs that hurt your architecture:
|
|
339
|
+
|
|
340
|
+
```yaml
|
|
341
|
+
- uses: depwire/depwire-action@v1
|
|
342
|
+
with:
|
|
343
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
344
|
+
fail-on-score-drop: 5
|
|
345
|
+
```
|
|
296
346
|
|
|
297
|
-
|
|
347
|
+
[GitHub Marketplace](https://github.com/marketplace/actions/depwire-pr-impact) — [depwire-action repo](https://github.com/depwire/depwire-action)
|
|
298
348
|
|
|
299
349
|
---
|
|
300
350
|
|
|
@@ -312,7 +362,7 @@ C# / .NET support coming in v1.1.
|
|
|
312
362
|
**Shipped**
|
|
313
363
|
- Arc diagram visualization
|
|
314
364
|
- 17 MCP tools
|
|
315
|
-
- Multi-language support (TypeScript, JavaScript, Python, Go, Rust, C)
|
|
365
|
+
- Multi-language support (TypeScript, JavaScript, Python, Go, Rust, C, C#, Java)
|
|
316
366
|
- Architecture health score
|
|
317
367
|
- Dead code detection
|
|
318
368
|
- Temporal graph
|
|
@@ -324,7 +374,6 @@ C# / .NET support coming in v1.1.
|
|
|
324
374
|
- PR Impact GitHub Action
|
|
325
375
|
|
|
326
376
|
**Coming next**
|
|
327
|
-
- C# / .NET language support
|
|
328
377
|
- AI-suggested refactors
|
|
329
378
|
- VSCode extension
|
|
330
379
|
- Natural language architecture queries
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
parseTypeScriptFile,
|
|
17
17
|
scanSecurity,
|
|
18
18
|
searchSymbols
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-LV32EDYQ.js";
|
|
20
20
|
|
|
21
21
|
// src/viz/data.ts
|
|
22
22
|
import { basename } from "path";
|
|
@@ -122,23 +122,26 @@ function watchProject(projectRoot, callbacks) {
|
|
|
122
122
|
const watcher = chokidar.watch(projectRoot, watcherOptions);
|
|
123
123
|
console.error("[Watcher] Attaching event listeners...");
|
|
124
124
|
watcher.on("change", (absolutePath) => {
|
|
125
|
-
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h"];
|
|
125
|
+
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h", ".cs", ".csx", ".csproj", ".java"];
|
|
126
126
|
if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
|
|
127
|
+
const fileName = absolutePath.split("/").pop() || "";
|
|
128
|
+
if (!validExtensions.some((ext) => absolutePath.endsWith(ext)) && !["pom.xml", "build.gradle", "build.gradle.kts"].includes(fileName)) return;
|
|
127
129
|
if (absolutePath.endsWith("_test.go")) return;
|
|
128
130
|
const relativePath = absolutePath.replace(projectRoot + "/", "");
|
|
129
131
|
console.error(`[Watcher] Change event: ${relativePath}`);
|
|
130
132
|
callbacks.onFileChanged(relativePath);
|
|
131
133
|
});
|
|
132
134
|
watcher.on("add", (absolutePath) => {
|
|
133
|
-
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h"];
|
|
134
|
-
|
|
135
|
+
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h", ".cs", ".csx", ".csproj", ".java"];
|
|
136
|
+
const addFileName = absolutePath.split("/").pop() || "";
|
|
137
|
+
if (!validExtensions.some((ext) => absolutePath.endsWith(ext)) && !["pom.xml", "build.gradle", "build.gradle.kts"].includes(addFileName)) return;
|
|
135
138
|
if (absolutePath.endsWith("_test.go")) return;
|
|
136
139
|
const relativePath = absolutePath.replace(projectRoot + "/", "");
|
|
137
140
|
console.error(`[Watcher] Add event: ${relativePath}`);
|
|
138
141
|
callbacks.onFileAdded(relativePath);
|
|
139
142
|
});
|
|
140
143
|
watcher.on("unlink", (absolutePath) => {
|
|
141
|
-
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h"];
|
|
144
|
+
const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h", ".cs", ".csx", ".csproj", ".java"];
|
|
142
145
|
if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
|
|
143
146
|
if (absolutePath.endsWith("_test.go")) return;
|
|
144
147
|
const relativePath = absolutePath.replace(projectRoot + "/", "");
|
|
@@ -156,10 +159,10 @@ function watchProject(projectRoot, callbacks) {
|
|
|
156
159
|
for (const dir of dirs) {
|
|
157
160
|
const files = watched[dir];
|
|
158
161
|
fileCount += files.filter(
|
|
159
|
-
(f) => f.endsWith(".ts") || f.endsWith(".tsx") || f.endsWith(".js") || f.endsWith(".jsx") || f.endsWith(".mjs") || f.endsWith(".cjs") || f.endsWith(".py") || f.endsWith(".go") && !f.endsWith("_test.go") || f.endsWith(".rs") || f.endsWith(".c") || f.endsWith(".h")
|
|
162
|
+
(f) => f.endsWith(".ts") || f.endsWith(".tsx") || f.endsWith(".js") || f.endsWith(".jsx") || f.endsWith(".mjs") || f.endsWith(".cjs") || f.endsWith(".py") || f.endsWith(".go") && !f.endsWith("_test.go") || f.endsWith(".rs") || f.endsWith(".c") || f.endsWith(".h") || f.endsWith(".cs") || f.endsWith(".csx") || f.endsWith(".csproj") || f.endsWith(".java") || f === "pom.xml" || f === "build.gradle" || f === "build.gradle.kts"
|
|
160
163
|
).length;
|
|
161
164
|
}
|
|
162
|
-
console.error(`[Watcher] Watching ${fileCount} TypeScript/JavaScript/Python/Go/Rust/C files in ${dirs.length} directories`);
|
|
165
|
+
console.error(`[Watcher] Watching ${fileCount} TypeScript/JavaScript/Python/Go/Rust/C/C#/Java files in ${dirs.length} directories`);
|
|
163
166
|
});
|
|
164
167
|
return watcher;
|
|
165
168
|
}
|