@ecoma-io/archkeep 0.13.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 (131) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +262 -0
  3. package/cli.mjs +2792 -0
  4. package/index.mjs +85 -0
  5. package/lsp.mjs +81 -0
  6. package/nx.mjs +24 -0
  7. package/package.json +81 -0
  8. package/presets/clean-architecture.json +78 -0
  9. package/presets/ddd-bounded-contexts.json +88 -0
  10. package/presets/hexagonal.json +68 -0
  11. package/presets/layered.json +92 -0
  12. package/presets/modular-monolith.json +85 -0
  13. package/presets/vertical-slice.json +68 -0
  14. package/src/analysis/analyze.mjs +218 -0
  15. package/src/analysis/contract.md +259 -0
  16. package/src/analysis/go.mjs +414 -0
  17. package/src/analysis/manifest-util.mjs +68 -0
  18. package/src/analysis/python.mjs +1266 -0
  19. package/src/analysis/registry.mjs +74 -0
  20. package/src/analysis/rust.mjs +674 -0
  21. package/src/analysis/source-util.mjs +230 -0
  22. package/src/analysis/typescript.mjs +1034 -0
  23. package/src/analysis/vue.mjs +156 -0
  24. package/src/architecture-intent/intent-fingerprint.mjs +29 -0
  25. package/src/architecture-intent/judge.mjs +539 -0
  26. package/src/architecture-intent/model.mjs +703 -0
  27. package/src/architecture-intent/selectors.mjs +170 -0
  28. package/src/canonical.mjs +48 -0
  29. package/src/commands/README.md +266 -0
  30. package/src/commands/adr.mjs +248 -0
  31. package/src/commands/check.mjs +989 -0
  32. package/src/commands/context-command.mjs +212 -0
  33. package/src/commands/context.mjs +790 -0
  34. package/src/commands/custom-rules.mjs +428 -0
  35. package/src/commands/debt.mjs +218 -0
  36. package/src/commands/diff.mjs +523 -0
  37. package/src/commands/discover.mjs +159 -0
  38. package/src/commands/drift.mjs +473 -0
  39. package/src/commands/edge-constraints.mjs +355 -0
  40. package/src/commands/explain.mjs +359 -0
  41. package/src/commands/fitness.mjs +226 -0
  42. package/src/commands/graph.mjs +297 -0
  43. package/src/commands/health.mjs +213 -0
  44. package/src/commands/history.mjs +614 -0
  45. package/src/commands/impact.mjs +226 -0
  46. package/src/commands/plan-context-command.mjs +496 -0
  47. package/src/commands/policy.mjs +138 -0
  48. package/src/commands/provenance-command.mjs +352 -0
  49. package/src/commands/provenance.mjs +159 -0
  50. package/src/commands/reconcile.mjs +219 -0
  51. package/src/commands/report.mjs +553 -0
  52. package/src/commands/snapshot-meta.mjs +107 -0
  53. package/src/commands/waivers.mjs +240 -0
  54. package/src/config.mjs +1308 -0
  55. package/src/containment.mjs +234 -0
  56. package/src/custom-rules/evidence.mjs +340 -0
  57. package/src/custom-rules/host.mjs +1023 -0
  58. package/src/custom-rules/values.mjs +43 -0
  59. package/src/entry-point.mjs +55 -0
  60. package/src/errors.mjs +36 -0
  61. package/src/eslint-config.mjs +542 -0
  62. package/src/go-work.mjs +394 -0
  63. package/src/governance/adr-registry.mjs +539 -0
  64. package/src/governance/clock.mjs +69 -0
  65. package/src/governance/debt-ledger.mjs +274 -0
  66. package/src/governance/discovery-proposal.mjs +423 -0
  67. package/src/governance/fitness-registry.mjs +504 -0
  68. package/src/governance/fitness-rules.mjs +668 -0
  69. package/src/governance/metrics.mjs +392 -0
  70. package/src/governance/preset-fingerprints.json +16 -0
  71. package/src/governance/profile-registry.mjs +366 -0
  72. package/src/governance/provenance-record.mjs +177 -0
  73. package/src/governance/reconcile-candidates.mjs +301 -0
  74. package/src/governance/reconcile-score.mjs +503 -0
  75. package/src/governance/row-schema.mjs +208 -0
  76. package/src/governance/verdict.mjs +127 -0
  77. package/src/governance/waiver.mjs +105 -0
  78. package/src/graph/create-dependencies.mjs +96 -0
  79. package/src/intent/intent-manifest.json +347 -0
  80. package/src/intent/mask-non-code.mjs +640 -0
  81. package/src/lsp/boundary-config.mjs +225 -0
  82. package/src/lsp/diagnose.mjs +202 -0
  83. package/src/lsp/diagnostics.mjs +241 -0
  84. package/src/lsp/protocol.mjs +215 -0
  85. package/src/lsp/server.mjs +922 -0
  86. package/src/lsp/workspace-index.mjs +891 -0
  87. package/src/nx-json.mjs +95 -0
  88. package/src/options.mjs +611 -0
  89. package/src/process.mjs +91 -0
  90. package/src/providers/moon.mjs +733 -0
  91. package/src/providers/native/README.md +204 -0
  92. package/src/providers/native/coverage.mjs +74 -0
  93. package/src/providers/native/differential.fixtures.mjs +1277 -0
  94. package/src/providers/native/discover.mjs +431 -0
  95. package/src/providers/native/graph.mjs +234 -0
  96. package/src/providers/native/index.mjs +152 -0
  97. package/src/providers/native/model.mjs +755 -0
  98. package/src/providers/nx.mjs +178 -0
  99. package/src/report/README.md +89 -0
  100. package/src/report/adr-text.mjs +129 -0
  101. package/src/report/context-text.mjs +109 -0
  102. package/src/report/debt-text.mjs +105 -0
  103. package/src/report/diff-text.mjs +219 -0
  104. package/src/report/discover-text.mjs +186 -0
  105. package/src/report/drift-text.mjs +194 -0
  106. package/src/report/envelope-shape.mjs +161 -0
  107. package/src/report/evidence.mjs +157 -0
  108. package/src/report/explain-text.mjs +159 -0
  109. package/src/report/graph-text.mjs +116 -0
  110. package/src/report/health-text.mjs +123 -0
  111. package/src/report/history-text.mjs +204 -0
  112. package/src/report/impact-text.mjs +128 -0
  113. package/src/report/json.mjs +173 -0
  114. package/src/report/plan-context-text.mjs +159 -0
  115. package/src/report/provenance-text.mjs +78 -0
  116. package/src/report/reconcile-text.mjs +159 -0
  117. package/src/report/report-text.mjs +264 -0
  118. package/src/report/sarif.mjs +953 -0
  119. package/src/report/text.mjs +823 -0
  120. package/src/report/waivers-text.mjs +100 -0
  121. package/src/rules/README.md +123 -0
  122. package/src/rules/index.mjs +962 -0
  123. package/src/rules/match.mjs +1708 -0
  124. package/src/rules/messages.mjs +73 -0
  125. package/src/rules/reachability.mjs +224 -0
  126. package/src/rules/specifiers.mjs +300 -0
  127. package/src/rules/tags.mjs +238 -0
  128. package/src/rules/topology.mjs +333 -0
  129. package/src/tsconfig-paths.mjs +237 -0
  130. package/src/verdict.mjs +145 -0
  131. package/src/workspace.mjs +580 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Process spawning, held apart from `./workspace.mjs` so a caller that only
3
+ * needs to run a program does not also load `./workspace.mjs`'s import
4
+ * graph.
5
+ *
6
+ * That graph runs through `./analysis/analyze.mjs` to `./analysis/typescript.mjs`,
7
+ * which loads the TypeScript compiler at module scope. `./providers/nx.mjs`
8
+ * only ever needed `runProcess` — to spawn `nx graph` — and so does
9
+ * `./providers/native/` (`../AGENTS.md`, "`src/providers/` is the only
10
+ * layer allowed to build a graph"): a native workspace with no
11
+ * `tsconfig.base.json` at all still has to build one, and a provider that
12
+ * pulled in `typescript` just to run `git ls-files` would fail before the
13
+ * model it is judging ever mentioned TypeScript.
14
+ *
15
+ * `./workspace.mjs` re-exports both symbols below, so every import site that
16
+ * predates this split keeps working unchanged.
17
+ */
18
+ import { execFileSync } from "node:child_process";
19
+
20
+ /**
21
+ * The environment variables that point git at a repository OTHER than the one
22
+ * containing the directory it runs in. Each overrides `cwd`, so a spawn that
23
+ * inherits them reads a different tree than the caller asked for.
24
+ *
25
+ * A git hook is the case that matters, and it is where this tool runs: git
26
+ * exports `GIT_DIR` (and often `GIT_INDEX_FILE`) to every hook, so a `check`
27
+ * or a language server started from `pre-commit`/`pre-push` would list the
28
+ * ambient repository's files while resolving them against the root it was
29
+ * given. Every read then fails against a path that belongs to another tree —
30
+ * a verdict about the wrong workspace, or none at all.
31
+ *
32
+ * Which tree is judged is `root`'s decision alone. `GIT_CEILING_DIRECTORIES`
33
+ * is in the list for the same reason from the other direction: it can stop
34
+ * discovery before reaching the root the caller named.
35
+ */
36
+ const AMBIENT_GIT_REDIRECTS = [
37
+ "GIT_DIR",
38
+ "GIT_WORK_TREE",
39
+ "GIT_COMMON_DIR",
40
+ "GIT_INDEX_FILE",
41
+ "GIT_OBJECT_DIRECTORY",
42
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
43
+ "GIT_NAMESPACE",
44
+ "GIT_CEILING_DIRECTORIES",
45
+ ];
46
+
47
+ /**
48
+ * `env` with every ambient git redirect removed, for a spawn that must read
49
+ * the tree it is pointed at. Nx gets it too — it shells out to git itself, and
50
+ * a graph built from another repository's files is the same defect one layer
51
+ * further away.
52
+ *
53
+ * @param {Record<string, string|undefined>} [env]
54
+ * @returns {Record<string, string|undefined>}
55
+ */
56
+ export function environmentForTree(env = process.env) {
57
+ const clean = { ...env };
58
+ for (const name of AMBIENT_GIT_REDIRECTS) delete clean[name];
59
+ return clean;
60
+ }
61
+
62
+ /**
63
+ * Runs a program and returns its stdout, throwing an `Error` that names the
64
+ * program when it fails. The single seam every spawn in this project goes
65
+ * through, so a test drives the whole scan without a git repository or an Nx
66
+ * installation.
67
+ *
68
+ * @param {string} file Executable path.
69
+ * @param {string[]} args
70
+ * @param {string} cwd
71
+ * @param {Record<string, string|undefined>} [env] Optional environment
72
+ * override. When omitted, `environmentForTree()` is used — which strips
73
+ * ambient git redirects from `process.env`.
74
+ * @returns {string}
75
+ */
76
+ export function runProcess(file, args, cwd, env) {
77
+ try {
78
+ return execFileSync(file, args, {
79
+ cwd,
80
+ env: env ?? environmentForTree(),
81
+ encoding: "utf8",
82
+ maxBuffer: 64 * 1024 * 1024,
83
+ });
84
+ } catch (cause) {
85
+ throw new Error(
86
+ `archkeep: \`${[file, ...args].join(" ")}\` failed in ${cwd}: ` +
87
+ `${cause?.stderr || cause?.message || cause}`,
88
+ { cause },
89
+ );
90
+ }
91
+ }