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 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
  ![Depwire architecture](./assets/architecture.svg)
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 viz # open interactive arc diagram in browser
63
- depwire whatif # simulate changes before touching code
64
- depwire security # scan for vulnerabilities
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-generated code ships vulnerabilities. Depwire catches them before they reach production.
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
- C# / .NET support coming in v1.1.
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-WUSXCZXA.js";
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
- if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
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
  }