@nifrajs/cli 2.1.0 → 2.3.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.
Files changed (126) hide show
  1. package/README.md +25 -25
  2. package/dist/assure.d.ts +2 -2
  3. package/dist/assure.d.ts.map +1 -1
  4. package/dist/assure.js +17 -10
  5. package/dist/assure.js.map +1 -1
  6. package/dist/capabilities-tool.d.ts +7 -0
  7. package/dist/capabilities-tool.d.ts.map +1 -1
  8. package/dist/capabilities-tool.js +68 -16
  9. package/dist/capabilities-tool.js.map +1 -1
  10. package/dist/check.d.ts +64 -22
  11. package/dist/check.d.ts.map +1 -1
  12. package/dist/check.js +400 -83
  13. package/dist/check.js.map +1 -1
  14. package/dist/cli.d.ts +37 -0
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +291 -53
  17. package/dist/cli.js.map +1 -1
  18. package/dist/diff-tool.d.ts +3 -3
  19. package/dist/diff-tool.js +7 -7
  20. package/dist/docs-search.d.ts +3 -3
  21. package/dist/docs-search.js +6 -6
  22. package/dist/doctor.d.ts +8 -4
  23. package/dist/doctor.d.ts.map +1 -1
  24. package/dist/doctor.js +74 -14
  25. package/dist/doctor.js.map +1 -1
  26. package/dist/examples.d.ts +5 -5
  27. package/dist/examples.js +5 -5
  28. package/dist/init-agents.d.ts +14 -14
  29. package/dist/init-agents.js +14 -14
  30. package/dist/internal/typescript-import.d.ts +24 -0
  31. package/dist/internal/typescript-import.d.ts.map +1 -0
  32. package/dist/internal/typescript-import.js +32 -0
  33. package/dist/internal/typescript-import.js.map +1 -0
  34. package/dist/introspect.d.ts +12 -12
  35. package/dist/introspect.js +24 -24
  36. package/dist/levels-tool.d.ts +8 -8
  37. package/dist/levels-tool.d.ts.map +1 -1
  38. package/dist/levels-tool.js +33 -30
  39. package/dist/levels-tool.js.map +1 -1
  40. package/dist/load.d.ts +17 -6
  41. package/dist/load.d.ts.map +1 -1
  42. package/dist/load.js +45 -7
  43. package/dist/load.js.map +1 -1
  44. package/dist/manifest-tool.d.ts +1 -1
  45. package/dist/manifest-tool.d.ts.map +1 -1
  46. package/dist/manifest-tool.js +4 -2
  47. package/dist/manifest-tool.js.map +1 -1
  48. package/dist/mcp-docs-tools.d.ts +1 -1
  49. package/dist/mcp-docs-tools.d.ts.map +1 -1
  50. package/dist/mcp-docs-tools.js +14 -10
  51. package/dist/mcp-docs-tools.js.map +1 -1
  52. package/dist/mcp-http.d.ts +5 -5
  53. package/dist/mcp-http.js +7 -7
  54. package/dist/mcp-protocol.d.ts +2 -2
  55. package/dist/mcp-protocol.js +2 -2
  56. package/dist/mcp-render.d.ts +3 -3
  57. package/dist/mcp-render.js +15 -7
  58. package/dist/mcp-render.js.map +1 -1
  59. package/dist/mcp-run.d.ts +2 -2
  60. package/dist/mcp-run.js +2 -2
  61. package/dist/mcp.d.ts +14 -14
  62. package/dist/mcp.d.ts.map +1 -1
  63. package/dist/mcp.js +119 -47
  64. package/dist/mcp.js.map +1 -1
  65. package/dist/openapi-tool.d.ts +1 -1
  66. package/dist/openapi-tool.js +2 -2
  67. package/dist/pipeline-guard.d.ts +83 -0
  68. package/dist/pipeline-guard.d.ts.map +1 -0
  69. package/dist/pipeline-guard.js +136 -0
  70. package/dist/pipeline-guard.js.map +1 -0
  71. package/dist/port.d.ts +9 -9
  72. package/dist/port.js +27 -27
  73. package/dist/recipes/1.8.0.d.ts +2 -2
  74. package/dist/recipes/1.8.0.js +5 -5
  75. package/dist/recipes/index.d.ts +2 -2
  76. package/dist/recipes/index.js +1 -1
  77. package/dist/scaffold.d.ts +3 -3
  78. package/dist/scaffold.js +8 -8
  79. package/dist/sync-routes.d.ts +28 -0
  80. package/dist/sync-routes.d.ts.map +1 -0
  81. package/dist/sync-routes.js +55 -0
  82. package/dist/sync-routes.js.map +1 -0
  83. package/dist/types-search.d.ts +6 -6
  84. package/dist/types-search.d.ts.map +1 -1
  85. package/dist/types-search.js +53 -8
  86. package/dist/types-search.js.map +1 -1
  87. package/dist/upgrade.d.ts +7 -7
  88. package/dist/upgrade.js +12 -12
  89. package/dist/verification.d.ts +51 -0
  90. package/dist/verification.d.ts.map +1 -0
  91. package/dist/verification.js +80 -0
  92. package/dist/verification.js.map +1 -0
  93. package/docs/examples.json +178 -88
  94. package/docs/llms-full.txt +1766 -766
  95. package/docs/types.json +2171 -2807
  96. package/package.json +22 -11
  97. package/src/assure.ts +17 -18
  98. package/src/capabilities-tool.ts +82 -16
  99. package/src/check.ts +493 -100
  100. package/src/cli.ts +306 -54
  101. package/src/diff-tool.ts +8 -8
  102. package/src/docs-search.ts +6 -6
  103. package/src/doctor.ts +81 -16
  104. package/src/examples.ts +7 -7
  105. package/src/init-agents.ts +17 -17
  106. package/src/internal/typescript-import.ts +33 -0
  107. package/src/introspect.ts +28 -28
  108. package/src/levels-tool.ts +37 -31
  109. package/src/load.ts +65 -12
  110. package/src/manifest-tool.ts +4 -2
  111. package/src/mcp-docs-tools.ts +20 -10
  112. package/src/mcp-http.ts +7 -7
  113. package/src/mcp-protocol.ts +2 -2
  114. package/src/mcp-render.ts +15 -7
  115. package/src/mcp-run.ts +2 -2
  116. package/src/mcp.ts +127 -47
  117. package/src/openapi-tool.ts +2 -2
  118. package/src/pipeline-guard.ts +186 -0
  119. package/src/port.ts +31 -31
  120. package/src/recipes/1.8.0.ts +5 -5
  121. package/src/recipes/index.ts +2 -2
  122. package/src/scaffold.ts +8 -8
  123. package/src/sync-routes.ts +69 -0
  124. package/src/types-search.ts +57 -8
  125. package/src/upgrade.ts +12 -12
  126. package/src/verification.ts +123 -0
package/dist/upgrade.d.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  /**
2
- * `nifra upgrade <version>` — an executable, per-release upgrade runner. Framework and shared-package
2
+ * `nifra upgrade <version>` - an executable, per-release upgrade runner. Framework and shared-package
3
3
  * bumps otherwise spread the same mechanical edits across every consuming app by hand; a recipe turns
4
4
  * them into `detect → transform → verify`:
5
5
  *
6
- * 1. **pin sweep** — set every matching dependency to the target version across the workspace's
6
+ * 1. **pin sweep** - set every matching dependency to the target version across the workspace's
7
7
  * package.json files, preserving the caret/tilde/exact style and skipping `workspace:`/`link:` specs.
8
- * 2. **dependency moves** — replace removed packages with their supported successor without
8
+ * 2. **dependency moves** - replace removed packages with their supported successor without
9
9
  * reserializing package.json or leaving duplicate dependency keys.
10
- * 3. **import moves** — rewrite exact import specifiers to their updated module paths.
11
- * 4. **verify** — reuse the existing `nifra check` gate; no new verification surface.
10
+ * 3. **import moves** - rewrite exact import specifiers to their updated module paths.
11
+ * 4. **verify** - reuse the existing `nifra check` gate; no new verification surface.
12
12
  *
13
13
  * Dry-run by default (prints the plan, writes nothing); `--write` applies. Fail-closed on an unknown
14
14
  * target version or a missing package.json, and deterministic (same repo + target → same edits).
15
15
  *
16
16
  * Deliberately NOT a codemod engine: transforms are string/specifier-level only. Structural (AST)
17
- * transforms are a future addition — a recipe that needs one is the signal to add the engine, not before.
17
+ * transforms are a future addition - a recipe that needs one is the signal to add the engine, not before.
18
18
  */
19
19
  import { type UpgradeRecipe } from "./recipes/index.js";
20
20
  export interface UpgradeOptions {
@@ -64,7 +64,7 @@ export interface UpgradePlan {
64
64
  */
65
65
  export declare function rewriteVersionSpec(spec: string, toVersion: string): string | null;
66
66
  /**
67
- * Apply pin rules to one package.json's TEXT (format-preserving — targeted string replaces, never a
67
+ * Apply pin rules to one package.json's TEXT (format-preserving - targeted string replaces, never a
68
68
  * JSON re-serialize that would reorder keys or drop comments-as-formatting). Returns the new text and
69
69
  * the changes made.
70
70
  */
package/dist/upgrade.js CHANGED
@@ -1,20 +1,20 @@
1
1
  /**
2
- * `nifra upgrade <version>` — an executable, per-release upgrade runner. Framework and shared-package
2
+ * `nifra upgrade <version>` - an executable, per-release upgrade runner. Framework and shared-package
3
3
  * bumps otherwise spread the same mechanical edits across every consuming app by hand; a recipe turns
4
4
  * them into `detect → transform → verify`:
5
5
  *
6
- * 1. **pin sweep** — set every matching dependency to the target version across the workspace's
6
+ * 1. **pin sweep** - set every matching dependency to the target version across the workspace's
7
7
  * package.json files, preserving the caret/tilde/exact style and skipping `workspace:`/`link:` specs.
8
- * 2. **dependency moves** — replace removed packages with their supported successor without
8
+ * 2. **dependency moves** - replace removed packages with their supported successor without
9
9
  * reserializing package.json or leaving duplicate dependency keys.
10
- * 3. **import moves** — rewrite exact import specifiers to their updated module paths.
11
- * 4. **verify** — reuse the existing `nifra check` gate; no new verification surface.
10
+ * 3. **import moves** - rewrite exact import specifiers to their updated module paths.
11
+ * 4. **verify** - reuse the existing `nifra check` gate; no new verification surface.
12
12
  *
13
13
  * Dry-run by default (prints the plan, writes nothing); `--write` applies. Fail-closed on an unknown
14
14
  * target version or a missing package.json, and deterministic (same repo + target → same edits).
15
15
  *
16
16
  * Deliberately NOT a codemod engine: transforms are string/specifier-level only. Structural (AST)
17
- * transforms are a future addition — a recipe that needs one is the signal to add the engine, not before.
17
+ * transforms are a future addition - a recipe that needs one is the signal to add the engine, not before.
18
18
  */
19
19
  import { readFileSync, writeFileSync } from "node:fs";
20
20
  import { join, relative } from "node:path";
@@ -26,8 +26,8 @@ const DEP_FIELDS = [
26
26
  "peerDependencies",
27
27
  "optionalDependencies",
28
28
  ];
29
- // Only a bare semver spec is rewritten. Anything else — workspace:*, link:/file:, npm: aliases, git
30
- // urls, "*", "latest", or a multi-part range — is intentionally left untouched (skipped, not guessed).
29
+ // Only a bare semver spec is rewritten. Anything else - workspace:*, link:/file:, npm: aliases, git
30
+ // urls, "*", "latest", or a multi-part range - is intentionally left untouched (skipped, not guessed).
31
31
  const SEMVER_SPEC = /^([\^~]|>=|<=|>|<|=)?\s*(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
32
32
  /**
33
33
  * Rewrite a dependency version spec to `toVersion`, preserving the range operator (`^`, `~`, …).
@@ -43,7 +43,7 @@ export function rewriteVersionSpec(spec, toVersion) {
43
43
  }
44
44
  const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
45
45
  /**
46
- * Apply pin rules to one package.json's TEXT (format-preserving — targeted string replaces, never a
46
+ * Apply pin rules to one package.json's TEXT (format-preserving - targeted string replaces, never a
47
47
  * JSON re-serialize that would reorder keys or drop comments-as-formatting). Returns the new text and
48
48
  * the changes made.
49
49
  */
@@ -268,7 +268,7 @@ function renderPlan(plan, write) {
268
268
  if (plan.pins.length === 0 &&
269
269
  plan.dependencyMoves.length === 0 &&
270
270
  plan.importMoves.length === 0) {
271
- lines.push("Already up to date — no changes.");
271
+ lines.push("Already up to date - no changes.");
272
272
  return lines.join("\n");
273
273
  }
274
274
  if (plan.dependencyMoves.length > 0) {
@@ -325,7 +325,7 @@ export async function runUpgrade(cwd, options) {
325
325
  readFileSync(join(cwd, "package.json"), "utf8");
326
326
  }
327
327
  catch {
328
- console.error(`[nifra] no package.json in ${relative(process.cwd(), cwd) || "."} — run from a project root`);
328
+ console.error(`[nifra] no package.json in ${relative(process.cwd(), cwd) || "."} - run from a project root`);
329
329
  return false;
330
330
  }
331
331
  const write = options.write === true;
@@ -342,7 +342,7 @@ export async function runUpgrade(cwd, options) {
342
342
  const ok = await runCheck(cwd, { json: false });
343
343
  if (!ok) {
344
344
  if (!options.json)
345
- console.error("\n[nifra] upgrade applied but `nifra check` failed — review above.");
345
+ console.error("\n[nifra] upgrade applied but `nifra check` failed - review above.");
346
346
  return false;
347
347
  }
348
348
  }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * One project verification, four commands. `nifra check`, `nifra assure`, `nifra levels`, and
3
+ * `nifra capabilities` are not separate audits - they are renderings of the same reflected project: the
4
+ * typed-contract scan, the route-assurance evaluation, and the static capability provenance. Historically
5
+ * each command re-derived the slice it needed, so a caller had to know which command ran which policy (and
6
+ * `levels` paid for the capability walk twice). `collectProjectVerification` runs each underlying policy
7
+ * exactly once and hands back a single value; the commands become thin formatters over subsets of it -
8
+ * `check`/`assure`/`levels` read their view directly, and `capabilities snapshot`/`check` read the same
9
+ * capability report before writing or diffing the lockfile.
10
+ *
11
+ * The typed-contract check is the one heavy pass (source walk + optional `tsc`), and `nifra assure`
12
+ * never needs it, so it is exposed as a lazily-invoked `check()` rather than computed up front.
13
+ */
14
+ import { type AssuranceConfig, type AssuranceReport } from "@nifrajs/core/assurance";
15
+ import { type CapabilityProjectReport } from "./capabilities-tool.js";
16
+ import { type CheckResult } from "./check.js";
17
+ export interface CollectProjectVerificationOptions {
18
+ /** Assurance config path, default `nifra.assurance.ts`. Honored by the assurance + levels views. */
19
+ readonly config?: string;
20
+ /** Skip the `tsc` pass in the check view (the agent inner-loop mode). */
21
+ readonly lintsOnly?: boolean;
22
+ /** Cancels the check view's typecheck. */
23
+ readonly signal?: AbortSignal;
24
+ /** Cap the check view's diagnostics (the `levels` L0 and MCP paths set this). */
25
+ readonly maxDiagnostics?: number;
26
+ }
27
+ export interface ProjectVerification {
28
+ readonly cwd: string;
29
+ /** Whether `nifra.assurance.ts` (or the requested `config` path) exists. */
30
+ readonly assuranceConfigPresent: boolean;
31
+ /** The loaded assurance config, when it loaded cleanly. */
32
+ readonly config?: AssuranceConfig;
33
+ /** The error from loading/evaluating the config, if any; the assurance views surface or throw it. */
34
+ readonly configError?: unknown;
35
+ /** `evaluateRouteAssurance` over the config's source + policy. Present whenever {@link config} is. */
36
+ readonly routeAssurance?: AssuranceReport;
37
+ /** Static capability provenance, when the config declares a capabilities policy. */
38
+ readonly capability?: CapabilityProjectReport;
39
+ /**
40
+ * The typed-contract check (scanners + typecheck + the assurance-fed capability/manifest diagnostics).
41
+ * Lazy and memoized: `nifra assure` never calls it, so that command pays nothing for the source walk.
42
+ */
43
+ check(): Promise<CheckResult>;
44
+ }
45
+ /**
46
+ * Run each verification policy once and return the unified value. The config is loaded (and reflected)
47
+ * a single time; the resulting route-assurance + capability evidence is both returned for the assurance
48
+ * views and fed into the check view, so nothing is computed twice.
49
+ */
50
+ export declare function collectProjectVerification(cwd: string, options?: CollectProjectVerificationOptions): Promise<ProjectVerification>;
51
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAA8B,KAAK,WAAW,EAAsB,MAAM,YAAY,CAAA;AAE7F,MAAM,WAAW,iCAAiC;IAChD,oGAAoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAA;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,qGAAqG;IACrG,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,sGAAsG;IACtG,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAA;IACzC,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAA;IAC7C;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * One project verification, four commands. `nifra check`, `nifra assure`, `nifra levels`, and
3
+ * `nifra capabilities` are not separate audits - they are renderings of the same reflected project: the
4
+ * typed-contract scan, the route-assurance evaluation, and the static capability provenance. Historically
5
+ * each command re-derived the slice it needed, so a caller had to know which command ran which policy (and
6
+ * `levels` paid for the capability walk twice). `collectProjectVerification` runs each underlying policy
7
+ * exactly once and hands back a single value; the commands become thin formatters over subsets of it -
8
+ * `check`/`assure`/`levels` read their view directly, and `capabilities snapshot`/`check` read the same
9
+ * capability report before writing or diffing the lockfile.
10
+ *
11
+ * The typed-contract check is the one heavy pass (source walk + optional `tsc`), and `nifra assure`
12
+ * never needs it, so it is exposed as a lazily-invoked `check()` rather than computed up front.
13
+ */
14
+ import { existsSync } from "node:fs";
15
+ import { resolve } from "node:path";
16
+ import { evaluateRouteAssurance, } from "@nifrajs/core/assurance";
17
+ import { collectCapabilityProjectReport, } from "./capabilities-tool.js";
18
+ import { collectCheckResult } from "./check.js";
19
+ /**
20
+ * Run each verification policy once and return the unified value. The config is loaded (and reflected)
21
+ * a single time; the resulting route-assurance + capability evidence is both returned for the assurance
22
+ * views and fed into the check view, so nothing is computed twice.
23
+ */
24
+ export async function collectProjectVerification(cwd, options = {}) {
25
+ const { loadAssuranceConfig, DEFAULT_ASSURANCE_CONFIG } = await import("./assure.js");
26
+ const configPath = resolve(cwd, options.config ?? DEFAULT_ASSURANCE_CONFIG);
27
+ const assuranceConfigPresent = existsSync(configPath);
28
+ let config;
29
+ let configError;
30
+ let routeAssurance;
31
+ let capability;
32
+ // One try mirrors `check`'s single catch: any failure to load or reflect the config becomes the
33
+ // `configError` each view then renders in its own idiom (a diagnostic, a throw, a failed rung).
34
+ try {
35
+ config = await loadAssuranceConfig(cwd, options.config);
36
+ routeAssurance = evaluateRouteAssurance(config.source, config.policy, {
37
+ ...(config.capabilities !== undefined
38
+ ? { definitions: config.capabilities.definitions }
39
+ : {}),
40
+ });
41
+ if (config.capabilities !== undefined) {
42
+ capability = await collectCapabilityProjectReport(cwd, config.source, config.capabilities);
43
+ }
44
+ }
45
+ catch (error) {
46
+ configError = error;
47
+ config = undefined;
48
+ routeAssurance = undefined;
49
+ capability = undefined;
50
+ }
51
+ // The check view's assurance inputs. Fed to `check()` only when no custom config path was requested,
52
+ // so `nifra check` (which always reads the default `nifra.assurance.ts`) and `levels` L0 keep reading
53
+ // exactly the config they read before; a `--config` override stays a route-assurance/levels concern.
54
+ const checkContext = {
55
+ present: assuranceConfigPresent,
56
+ ...(config !== undefined ? { config } : {}),
57
+ ...(configError !== undefined ? { error: configError } : {}),
58
+ ...(routeAssurance !== undefined ? { routeAssurance } : {}),
59
+ ...(capability !== undefined ? { capability } : {}),
60
+ };
61
+ let checkResult;
62
+ return Object.freeze({
63
+ cwd,
64
+ assuranceConfigPresent,
65
+ ...(config !== undefined ? { config } : {}),
66
+ ...(configError !== undefined ? { configError } : {}),
67
+ ...(routeAssurance !== undefined ? { routeAssurance } : {}),
68
+ ...(capability !== undefined ? { capability } : {}),
69
+ check() {
70
+ checkResult ??= collectCheckResult(cwd, {
71
+ lintsOnly: options.lintsOnly ?? false,
72
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
73
+ ...(options.maxDiagnostics !== undefined ? { maxDiagnostics: options.maxDiagnostics } : {}),
74
+ ...(options.config === undefined ? { assurance: checkContext } : {}),
75
+ });
76
+ return checkResult;
77
+ },
78
+ });
79
+ }
80
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}