nexarch 0.1.29 → 0.1.31

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.
@@ -4,7 +4,7 @@ import { join } from "path";
4
4
  import process from "process";
5
5
  import { requireCredentials } from "../lib/credentials.js";
6
6
  import { callMcpTool, mcpInitialize, mcpListTools } from "../lib/mcp.js";
7
- const CLI_VERSION = "0.1.29";
7
+ const CLI_VERSION = "0.1.31";
8
8
  const AGENT_ENTITY_TYPE = "agent";
9
9
  const TECH_COMPONENT_ENTITY_TYPE = "technology_component";
10
10
  function parseFlag(args, flag) {
@@ -281,18 +281,17 @@ function scanProject(dir) {
281
281
  return { projectName, packageJsonCount: pkgPaths.length, detectedNames: Array.from(names), rootDepNames, subPackages };
282
282
  }
283
283
  // ─── Relationship type selection ──────────────────────────────────────────────
284
- function pickRelationshipType(toEntityTypeCode, fromEntityTypeCode = "application") {
284
+ function pickRelationshipType(toEntityTypeCode, _fromEntityTypeCode = "application") {
285
285
  switch (toEntityTypeCode) {
286
286
  case "model":
287
287
  return "uses_model";
288
288
  case "platform":
289
289
  case "platform_component":
290
+ // runs_on is the valid ontology relationship from application/tech to platform
291
+ return "runs_on";
290
292
  case "skill":
291
293
  return "uses";
292
294
  case "technology_component":
293
- // tech→tech depends_on is not allowed by ontology; use "uses" instead
294
- if (fromEntityTypeCode === "technology_component")
295
- return "uses";
296
295
  return "depends_on";
297
296
  default:
298
297
  return "depends_on";
@@ -544,8 +543,8 @@ ${subPackages.map((sp) => ` • ${sp.name} (${sp.relativePath})`).join("\n")
544
543
 
545
544
  RELATIONSHIP TYPE RULES:
546
545
  application → technology_component : --type "depends_on"
547
- technology_component → technology_component : --type "uses" (NOT depends_on)
548
- any → platform / platform_component : --type "uses"
546
+ technology_component → technology_component : --type "depends_on"
547
+ any → platform / platform_component : --type "runs_on" (NOT uses or depends_on)
549
548
  any → model : --type "uses_model"
550
549
 
551
550
  Pre-resolved dependencies per sub-package (wire these after registering each entity):
@@ -592,7 +591,8 @@ ${finalStep} — Identify architecturally significant components not auto-detect
592
591
  npx nexarch add-relationship \\
593
592
  --from "${projectExternalKey}" \\
594
593
  --to "<resolved-ref>" \\
595
- --type "uses"
594
+ --type "runs_on" # for platforms (Vercel, Neon, etc.)
595
+ # use --type "depends_on" for external APIs/SaaS (Stripe, Resend, etc.)
596
596
 
597
597
  3. If unresolved (not in the reference library), skip it for now — it will appear
598
598
  as a reference candidate on the next scan once you register an alias for it.
@@ -0,0 +1,52 @@
1
+ import process from "process";
2
+ import { requireCredentials } from "../lib/credentials.js";
3
+ import { callMcpTool } from "../lib/mcp.js";
4
+ function parseFlag(args, flag) {
5
+ return args.includes(flag);
6
+ }
7
+ function parseOptionValue(args, option) {
8
+ const idx = args.indexOf(option);
9
+ if (idx === -1)
10
+ return null;
11
+ const value = args[idx + 1];
12
+ if (!value || value.startsWith("--"))
13
+ return null;
14
+ return value;
15
+ }
16
+ function parseToolText(result) {
17
+ const text = result.content?.[0]?.text ?? "{}";
18
+ return JSON.parse(text);
19
+ }
20
+ export async function resolveNames(args) {
21
+ const asJson = parseFlag(args, "--json");
22
+ const namesRaw = parseOptionValue(args, "--names");
23
+ if (!namesRaw) {
24
+ console.error("error: --names <comma-separated list> is required");
25
+ process.exit(1);
26
+ }
27
+ const names = namesRaw
28
+ .split(",")
29
+ .map((n) => n.trim())
30
+ .filter(Boolean);
31
+ if (names.length === 0) {
32
+ console.error("error: --names must contain at least one name");
33
+ process.exit(1);
34
+ }
35
+ const creds = requireCredentials();
36
+ const mcpOpts = { companyId: creds.companyId };
37
+ const raw = await callMcpTool("nexarch_resolve_reference", { names, companyId: creds.companyId }, mcpOpts);
38
+ const result = parseToolText(raw);
39
+ if (asJson) {
40
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
41
+ return;
42
+ }
43
+ for (const entry of result.results ?? []) {
44
+ if (entry.resolved) {
45
+ console.log(`✓ ${entry.input} → ${entry.canonicalExternalRef} (${entry.entityTypeCode}${entry.entitySubtypeCode ? `/${entry.entitySubtypeCode}` : ""}) "${entry.canonicalName}"`);
46
+ }
47
+ else {
48
+ console.log(`✗ ${entry.input} — not found in reference library`);
49
+ }
50
+ }
51
+ console.log(`\n${result.summary?.resolved ?? 0}/${result.summary?.requested ?? 0} resolved`);
52
+ }
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ import { initProject } from "./commands/init-project.js";
14
14
  import { updateEntity } from "./commands/update-entity.js";
15
15
  import { addRelationship } from "./commands/add-relationship.js";
16
16
  import { registerAlias } from "./commands/register-alias.js";
17
+ import { resolveNames } from "./commands/resolve-names.js";
17
18
  const [, , command, ...args] = process.argv;
18
19
  const commands = {
19
20
  login,
@@ -28,6 +29,7 @@ const commands = {
28
29
  "update-entity": updateEntity,
29
30
  "add-relationship": addRelationship,
30
31
  "register-alias": registerAlias,
32
+ "resolve-names": resolveNames,
31
33
  };
32
34
  async function main() {
33
35
  if (command === "agent") {
@@ -114,6 +116,13 @@ Usage:
114
116
  --subtype <code>
115
117
  --description <text>
116
118
  --json
119
+ nexarch resolve-names
120
+ Look up one or more raw names (package names, platform
121
+ names) against the global reference library and return
122
+ their canonical external keys. Useful for gap-check
123
+ results before calling add-relationship.
124
+ Options: --names <csv> (required, e.g. "vercel,neon")
125
+ --json
117
126
  `);
118
127
  process.exit(command ? 1 : 0);
119
128
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexarch",
3
- "version": "0.1.29",
3
+ "version": "0.1.31",
4
4
  "description": "Connect AI coding tools to your Nexarch architecture workspace",
5
5
  "keywords": [
6
6
  "nexarch",