depwire-cli 0.9.30 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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,53 @@ 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# — with cross-language edge detection between all supported languages.
298
+
299
+ ---
300
+
301
+ ## GitHub Action — PR Impact Analysis
302
+
303
+ Depwire integrates into your CI/CD pipeline via the [depwire-action](https://github.com/depwire/depwire-action) GitHub Action.
304
+
305
+ 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.
306
+
307
+ Add to `.github/workflows/depwire.yml`:
308
+
309
+ ```yaml
310
+ name: Depwire PR Impact
311
+ on:
312
+ pull_request:
313
+ branches: [main]
314
+
315
+ permissions:
316
+ contents: read
317
+ pull-requests: write
318
+
319
+ jobs:
320
+ depwire:
321
+ runs-on: ubuntu-latest
322
+ steps:
323
+ - uses: actions/checkout@v4
324
+ with:
325
+ fetch-depth: 0
326
+ - uses: actions/setup-node@v4
327
+ with:
328
+ node-version: '20'
329
+ - uses: depwire/depwire-action@v1
330
+ with:
331
+ github-token: ${{ secrets.GITHUB_TOKEN }}
332
+ ```
333
+
334
+ Block PRs that hurt your architecture:
335
+
336
+ ```yaml
337
+ - uses: depwire/depwire-action@v1
338
+ with:
339
+ github-token: ${{ secrets.GITHUB_TOKEN }}
340
+ fail-on-score-drop: 5
341
+ ```
296
342
 
297
- C# / .NET support coming in v1.1.
343
+ [GitHub Marketplace](https://github.com/marketplace/actions/depwire-pr-impact) [depwire-action repo](https://github.com/depwire/depwire-action)
298
344
 
299
345
  ---
300
346
 
@@ -312,7 +358,7 @@ C# / .NET support coming in v1.1.
312
358
  **Shipped**
313
359
  - Arc diagram visualization
314
360
  - 17 MCP tools
315
- - Multi-language support (TypeScript, JavaScript, Python, Go, Rust, C)
361
+ - Multi-language support (TypeScript, JavaScript, Python, Go, Rust, C, C#)
316
362
  - Architecture health score
317
363
  - Dead code detection
318
364
  - Temporal graph
@@ -16,7 +16,7 @@ import {
16
16
  parseTypeScriptFile,
17
17
  scanSecurity,
18
18
  searchSymbols
19
- } from "./chunk-WUSXCZXA.js";
19
+ } from "./chunk-IYKS66CG.js";
20
20
 
21
21
  // src/viz/data.ts
22
22
  import { basename } from "path";
@@ -122,7 +122,7 @@ 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"];
126
126
  if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
127
127
  if (absolutePath.endsWith("_test.go")) return;
128
128
  const relativePath = absolutePath.replace(projectRoot + "/", "");
@@ -130,7 +130,7 @@ function watchProject(projectRoot, callbacks) {
130
130
  callbacks.onFileChanged(relativePath);
131
131
  });
132
132
  watcher.on("add", (absolutePath) => {
133
- const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h"];
133
+ const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h", ".cs", ".csx", ".csproj"];
134
134
  if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
135
135
  if (absolutePath.endsWith("_test.go")) return;
136
136
  const relativePath = absolutePath.replace(projectRoot + "/", "");
@@ -138,7 +138,7 @@ function watchProject(projectRoot, callbacks) {
138
138
  callbacks.onFileAdded(relativePath);
139
139
  });
140
140
  watcher.on("unlink", (absolutePath) => {
141
- const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h"];
141
+ const validExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".c", ".h", ".cs", ".csx", ".csproj"];
142
142
  if (!validExtensions.some((ext) => absolutePath.endsWith(ext))) return;
143
143
  if (absolutePath.endsWith("_test.go")) return;
144
144
  const relativePath = absolutePath.replace(projectRoot + "/", "");
@@ -156,10 +156,10 @@ function watchProject(projectRoot, callbacks) {
156
156
  for (const dir of dirs) {
157
157
  const files = watched[dir];
158
158
  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")
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") || f.endsWith(".cs") || f.endsWith(".csx") || f.endsWith(".csproj")
160
160
  ).length;
161
161
  }
162
- console.error(`[Watcher] Watching ${fileCount} TypeScript/JavaScript/Python/Go/Rust/C files in ${dirs.length} directories`);
162
+ console.error(`[Watcher] Watching ${fileCount} TypeScript/JavaScript/Python/Go/Rust/C/C# files in ${dirs.length} directories`);
163
163
  });
164
164
  return watcher;
165
165
  }