@niroai/niro 0.15.0 → 0.16.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/CHANGELOG.md CHANGED
@@ -4,6 +4,44 @@ Notable changes to `@niroai/niro`. Dates are release dates.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.16.0 — 2026-09-22
8
+
9
+ ### A reverse proxy's routing table is offered for upload
10
+
11
+ Most services do not call each other directly. They call a proxy, and a routing table decides who
12
+ really answers. That table is the only place the hop is written down, and the CLI was not offering
13
+ it, so the server never saw it and the graph stopped at the proxy.
14
+
15
+ Newly offered:
16
+
17
+ - `nginx.conf`, `haproxy.cfg`, `httpd.conf`, `apache2.conf`
18
+ - compose files named for their environment, not just `docker-compose.yml`: a Traefik routing table
19
+ lives in container labels, and those labels are routinely in `docker-compose.production.yml`
20
+ - Kubernetes Ingress manifests under the names teams actually use: `ingress.yaml`,
21
+ `*-ingress.yaml`, `*_ingress.yaml`
22
+
23
+ Deliberately still NOT offered: every `.yaml`. An Ingress can be in any file, and claiming all of
24
+ them would upload every Helm chart, kustomization and CI file in a repository to find the occasional
25
+ routing table. An Ingress under an unconventional name is a stated limit rather than a silent one.
26
+
27
+ Envoy was left out on purpose. A file that is uploaded and then read by nothing is cost with no
28
+ benefit, and the server has no Envoy reader yet.
29
+
30
+ ### A drift guard for the config list
31
+
32
+ `CONFIG_FILENAMES` is a hand-kept copy of the server's list and nothing compared the two.
33
+ `test/configFilenameDrift.test.js` now does, alongside the existing extension guard. This matters
34
+ more than it did: if the copies drift now, the CLI stops offering `nginx.conf`, the server never
35
+ receives it, and every connection through that proxy quietly disappears from the graph. The symptom
36
+ reads as "proxy support is broken" and is nowhere near the list that caused it.
37
+
38
+ ### Upgrade order
39
+
40
+ The server's filter remains the final say, so either order is safe: an older CLI offers fewer files,
41
+ and a newer CLI against an older server has its extra offers declined. The routing tables reach the
42
+ graph once both sides are current (ai-orchestrator `25131e94` or later). Repositories the server
43
+ clones itself are unaffected by this release; their files never went through the CLI.
44
+
7
45
  ## 0.15.0 — 2026-09-21
8
46
 
9
47
  ### Twenty more file types are offered for upload
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niroai/niro",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Niro \u2014 one package: the niro CLI plus the Niro MCP server (code intelligence for AI coding assistants).",
5
5
  "keywords": [
6
6
  "niro",
@@ -120,6 +120,9 @@ const CONFIG_FILENAMES = new Set([
120
120
  "application.yml.example", "application.yml.sample",
121
121
  "application.yaml.example", "application.yaml.sample",
122
122
  "dockerfile", "docker-compose.yml", "docker-compose.yaml",
123
+ // A reverse proxy's routing table is the only place the hop from a caller to the service that
124
+ // really answers is written down. MUST stay in step with SourceFileFilterService.CONFIG_FILENAMES.
125
+ "nginx.conf", "haproxy.cfg", "httpd.conf", "apache2.conf",
123
126
  ]);
124
127
 
125
128
  const CONFIG_WILDCARD_SUFFIXES = [".properties", ".yml", ".yaml"];
@@ -127,8 +130,19 @@ const CONFIG_WILDCARD_SUFFIXES = [".properties", ".yml", ".yaml"];
127
130
  // True for committed config/property/template files that carry env-var DEFAULTS,
128
131
  // false for secret-bearing files (bare .env, .env.local, .env.production, and
129
132
  // arbitrary *.properties). `lower` is the already-lowercased filename.
133
+ // Routing configs whose filename is a convention rather than a fixed name. Deliberately narrow:
134
+ // making every .yaml eligible would upload every chart and CI file in a repo. MUST stay in step with
135
+ // SourceFileFilterService.isRoutingManifestName.
136
+ function isRoutingManifestName(lower) {
137
+ if (!lower.endsWith(".yml") && !lower.endsWith(".yaml")) return false;
138
+ if (lower.startsWith("docker-compose") || lower.startsWith("compose.")) return true;
139
+ const stem = lower.slice(0, lower.lastIndexOf("."));
140
+ return stem === "ingress" || stem.endsWith("-ingress") || stem.endsWith("_ingress");
141
+ }
142
+
130
143
  function isConfigName(lower) {
131
144
  if (CONFIG_FILENAMES.has(lower)) return true;
145
+ if (isRoutingManifestName(lower)) return true;
132
146
  // Spring profile files: application-<profile>.{properties,yml,yaml}, profile
133
147
  // non-empty (reject "application-.properties").
134
148
  const prefix = "application-";