infrawise 0.15.1 → 0.16.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
@@ -1,12 +1,27 @@
1
- # Infrawise
2
-
3
- [![npm version](https://img.shields.io/npm/v/infrawise)](https://www.npmjs.com/package/infrawise)
4
- [![Publish to npm](https://github.com/Sidd27/infrawise/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/Sidd27/infrawise/actions/workflows/npm-publish.yml)
5
- [![CI](https://github.com/Sidd27/infrawise/actions/workflows/ci.yml/badge.svg)](https://github.com/Sidd27/infrawise/actions/workflows/ci.yml)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
- [![infrawise MCP server](https://glama.ai/mcp/servers/Sidd27/infrawise/badges/score.svg)](https://glama.ai/mcp/servers/Sidd27/infrawise)
8
-
9
- **[sidd27.github.io/infrawise](https://sidd27.github.io/infrawise/) Understand your infrastructure, not just your code.**
1
+ <p align="center">
2
+ <a href="https://sidd27.github.io/infrawise/">
3
+ <img src="https://raw.githubusercontent.com/Sidd27/infrawise/main/website/public/logo-400.png" alt="Infrawise logo" width="130" />
4
+ </a>
5
+ </p>
6
+
7
+ <h1 align="center">Infrawise</h1>
8
+
9
+ <p align="center"><b>Your AI coding assistant finally knows your infra.</b></p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/infrawise"><img src="https://img.shields.io/npm/v/infrawise" alt="npm version" /></a>
13
+ <a href="https://github.com/Sidd27/infrawise/actions/workflows/npm-publish.yml"><img src="https://github.com/Sidd27/infrawise/actions/workflows/npm-publish.yml/badge.svg" alt="Publish to npm" /></a>
14
+ <a href="https://github.com/Sidd27/infrawise/actions/workflows/ci.yml"><img src="https://github.com/Sidd27/infrawise/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT" /></a>
16
+ <a href="https://scorecard.dev/viewer/?uri=github.com/Sidd27/infrawise"><img src="https://api.securityscorecards.dev/projects/github.com/Sidd27/infrawise/badge" alt="OpenSSF Scorecard" /></a>
17
+ <a href="https://glama.ai/mcp/servers/Sidd27/infrawise"><img src="https://glama.ai/mcp/servers/Sidd27/infrawise/badges/score.svg" alt="infrawise MCP server" /></a>
18
+ </p>
19
+
20
+ <p align="center">
21
+ <a href="https://sidd27.github.io/infrawise/">Website</a> ·
22
+ <a href="https://sidd27.github.io/infrawise/getting-started/installation/">Docs</a> ·
23
+ <a href="#quick-start">Quick start</a>
24
+ </p>
10
25
 
11
26
  Infrawise gives AI coding assistants deterministic infrastructure awareness.
12
27
 
@@ -119,6 +134,14 @@ infrawise start --cursor
119
134
 
120
135
  Writes `.cursor/mcp.json` and opens Cursor. All 21 infrawise tools are available in Cursor's MCP panel.
121
136
 
137
+ ### VS Code
138
+
139
+ ```bash
140
+ infrawise start --vscode
141
+ ```
142
+
143
+ Writes `.vscode/mcp.json` (merging with any existing MCP servers) and opens VS Code. The tools are available to Copilot agent mode via the MCP servers panel.
144
+
122
145
  ### Any editor (no flag)
123
146
 
124
147
  ```bash
@@ -182,6 +205,7 @@ Add to your editor's MCP config:
182
205
  | `infrawise start` | **Primary command** — probe env, generate config, analyze, write editor MCP config |
183
206
  | `infrawise start --claude` | Same as above, then opens Claude Code |
184
207
  | `infrawise start --cursor` | Same as above, then opens Cursor |
208
+ | `infrawise start --vscode` | Same as above, then opens VS Code (merges into `.vscode/mcp.json`) |
185
209
  | `infrawise start --interactive` | Run the guided setup wizard instead of auto-discovery |
186
210
  | `infrawise start --rediscover` | Delete `infrawise.yaml` + `.infrawise/`, then re-probe and re-analyze |
187
211
  | `infrawise analyze` | Force a full re-scan — useful after major infrastructure changes |
@@ -234,13 +234,15 @@ function servicesFromDoc(doc) {
234
234
  }
235
235
  async function extractAllowedServices(roleArn, cfg) {
236
236
  const client = new IAMClient(clientConfig(cfg));
237
- const roleName = roleArn.split('/').pop();
237
+ const roleName = roleArn.split('/').pop() ?? roleArn;
238
238
  const services = new Set();
239
239
  try {
240
240
  let marker;
241
241
  do {
242
242
  const res = await client.send(new ListAttachedRolePoliciesCommand({ RoleName: roleName, Marker: marker }));
243
243
  for (const policy of res.AttachedPolicies ?? []) {
244
+ if (!policy.PolicyArn)
245
+ continue;
244
246
  try {
245
247
  const meta = await client.send(new GetPolicyCommand({ PolicyArn: policy.PolicyArn }));
246
248
  const versionId = meta.Policy?.DefaultVersionId;
@@ -34,6 +34,31 @@ function writeCursorMcp(configAbsPath) {
34
34
  fs.writeFileSync(path.join(dir, 'mcp.json'), JSON.stringify(entry, null, 2), 'utf-8');
35
35
  log.success('Cursor config written', '.cursor/mcp.json');
36
36
  }
37
+ export function writeVscodeMcp(configAbsPath) {
38
+ const dir = '.vscode';
39
+ if (!fs.existsSync(dir))
40
+ fs.mkdirSync(dir, { recursive: true });
41
+ const file = path.join(dir, 'mcp.json');
42
+ // VS Code's mcp.json commonly holds other servers — merge, never overwrite
43
+ let existing = {};
44
+ if (fs.existsSync(file)) {
45
+ try {
46
+ existing = JSON.parse(fs.readFileSync(file, 'utf-8'));
47
+ }
48
+ catch {
49
+ log.warn('.vscode/mcp.json is not valid JSON — replacing it');
50
+ }
51
+ }
52
+ const servers = existing['servers'] ?? {};
53
+ servers['infrawise'] = {
54
+ type: 'stdio',
55
+ command: 'infrawise',
56
+ args: ['serve', '--stdio', '--config', configAbsPath],
57
+ };
58
+ existing['servers'] = servers;
59
+ fs.writeFileSync(file, JSON.stringify(existing, null, 2), 'utf-8');
60
+ log.success('VS Code config written', '.vscode/mcp.json');
61
+ }
37
62
  function launchEditor(editor) {
38
63
  return new Promise((resolve) => {
39
64
  if (editor === 'claude') {
@@ -117,14 +142,23 @@ export async function runStart(options = {}) {
117
142
  writeMcpJson(configAbsPath);
118
143
  if (options.cursor)
119
144
  writeCursorMcp(configAbsPath);
145
+ if (options.vscode)
146
+ writeVscodeMcp(configAbsPath);
120
147
  // Launch editor or print instructions
121
- const editor = options.claude ? 'claude' : options.cursor ? 'cursor' : null;
148
+ const editor = options.claude
149
+ ? 'claude'
150
+ : options.cursor
151
+ ? 'cursor'
152
+ : options.vscode
153
+ ? 'code'
154
+ : null;
122
155
  if (!editor) {
123
156
  console.log('');
124
157
  console.log(chalk.bold(' Setup complete — open your editor to start.'));
125
158
  console.log('');
126
159
  console.log(chalk.dim(' Claude Code: claude'));
127
160
  console.log(chalk.dim(' Cursor: cursor .'));
161
+ console.log(chalk.dim(' VS Code: code .'));
128
162
  console.log('');
129
163
  console.log(chalk.dim(' Next time just open your editor — no infrawise command needed.'));
130
164
  console.log('');
package/dist/cli/index.js CHANGED
@@ -21,6 +21,7 @@ program
21
21
  .option('-c, --config <path>', 'Path to infrawise.yaml', 'infrawise.yaml')
22
22
  .option('--claude', 'Write .mcp.json and open Claude Code')
23
23
  .option('--cursor', 'Write .cursor/mcp.json and open Cursor')
24
+ .option('--vscode', 'Write .vscode/mcp.json and open VS Code')
24
25
  .option('--interactive', 'Run interactive setup wizard instead of auto-discovery')
25
26
  .option('--rediscover', 'Delete existing infrawise.yaml and re-probe the environment')
26
27
  .action(async (options) => {
@@ -29,6 +30,7 @@ program
29
30
  config: options.config !== 'infrawise.yaml' ? options.config : undefined,
30
31
  claude: options.claude,
31
32
  cursor: options.cursor,
33
+ vscode: options.vscode,
32
34
  interactive: options.interactive,
33
35
  rediscover: options.rediscover,
34
36
  });
@@ -501,8 +501,7 @@ export function createMcpServer() {
501
501
  const indexNamesFor = (nodeId) => currentGraph.edges
502
502
  .filter((e) => e.from === nodeId && e.type === 'uses_index')
503
503
  .map((e) => currentGraph.nodes.find((n) => n.id === e.to))
504
- .filter((n) => n?.type === 'index')
505
- .map((n) => n.name);
504
+ .flatMap((n) => (n?.type === 'index' ? [n.name] : []));
506
505
  const results = tables.map((requested) => {
507
506
  const lower = requested.toLowerCase();
508
507
  const matches = tableNodes.filter((t) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infrawise",
3
- "version": "0.15.1",
3
+ "version": "0.16.1",
4
4
  "mcpName": "io.github.Sidd27/infrawise",
5
5
  "description": "CLI-first infrastructure intelligence platform — analyzes DynamoDB, PostgreSQL, MySQL, MongoDB, SQS, SNS, SSM, Secrets Manager, Lambda, S3, API Gateway, CloudWatch Logs and exposes findings as an MCP server for Claude Code",
6
6
  "keywords": [
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "devDependencies": {
113
113
  "@types/js-yaml": "^4.0.9",
114
- "@types/node": "^25.8.0",
114
+ "@types/node": "^26.1.0",
115
115
  "@types/pg": "^8.11.0",
116
116
  "@typescript-eslint/eslint-plugin": "^8.61.1",
117
117
  "@typescript-eslint/parser": "^8.61.1",