@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.
- package/LICENSE +202 -0
- package/README.md +262 -0
- package/cli.mjs +2792 -0
- package/index.mjs +85 -0
- package/lsp.mjs +81 -0
- package/nx.mjs +24 -0
- package/package.json +81 -0
- package/presets/clean-architecture.json +78 -0
- package/presets/ddd-bounded-contexts.json +88 -0
- package/presets/hexagonal.json +68 -0
- package/presets/layered.json +92 -0
- package/presets/modular-monolith.json +85 -0
- package/presets/vertical-slice.json +68 -0
- package/src/analysis/analyze.mjs +218 -0
- package/src/analysis/contract.md +259 -0
- package/src/analysis/go.mjs +414 -0
- package/src/analysis/manifest-util.mjs +68 -0
- package/src/analysis/python.mjs +1266 -0
- package/src/analysis/registry.mjs +74 -0
- package/src/analysis/rust.mjs +674 -0
- package/src/analysis/source-util.mjs +230 -0
- package/src/analysis/typescript.mjs +1034 -0
- package/src/analysis/vue.mjs +156 -0
- package/src/architecture-intent/intent-fingerprint.mjs +29 -0
- package/src/architecture-intent/judge.mjs +539 -0
- package/src/architecture-intent/model.mjs +703 -0
- package/src/architecture-intent/selectors.mjs +170 -0
- package/src/canonical.mjs +48 -0
- package/src/commands/README.md +266 -0
- package/src/commands/adr.mjs +248 -0
- package/src/commands/check.mjs +989 -0
- package/src/commands/context-command.mjs +212 -0
- package/src/commands/context.mjs +790 -0
- package/src/commands/custom-rules.mjs +428 -0
- package/src/commands/debt.mjs +218 -0
- package/src/commands/diff.mjs +523 -0
- package/src/commands/discover.mjs +159 -0
- package/src/commands/drift.mjs +473 -0
- package/src/commands/edge-constraints.mjs +355 -0
- package/src/commands/explain.mjs +359 -0
- package/src/commands/fitness.mjs +226 -0
- package/src/commands/graph.mjs +297 -0
- package/src/commands/health.mjs +213 -0
- package/src/commands/history.mjs +614 -0
- package/src/commands/impact.mjs +226 -0
- package/src/commands/plan-context-command.mjs +496 -0
- package/src/commands/policy.mjs +138 -0
- package/src/commands/provenance-command.mjs +352 -0
- package/src/commands/provenance.mjs +159 -0
- package/src/commands/reconcile.mjs +219 -0
- package/src/commands/report.mjs +553 -0
- package/src/commands/snapshot-meta.mjs +107 -0
- package/src/commands/waivers.mjs +240 -0
- package/src/config.mjs +1308 -0
- package/src/containment.mjs +234 -0
- package/src/custom-rules/evidence.mjs +340 -0
- package/src/custom-rules/host.mjs +1023 -0
- package/src/custom-rules/values.mjs +43 -0
- package/src/entry-point.mjs +55 -0
- package/src/errors.mjs +36 -0
- package/src/eslint-config.mjs +542 -0
- package/src/go-work.mjs +394 -0
- package/src/governance/adr-registry.mjs +539 -0
- package/src/governance/clock.mjs +69 -0
- package/src/governance/debt-ledger.mjs +274 -0
- package/src/governance/discovery-proposal.mjs +423 -0
- package/src/governance/fitness-registry.mjs +504 -0
- package/src/governance/fitness-rules.mjs +668 -0
- package/src/governance/metrics.mjs +392 -0
- package/src/governance/preset-fingerprints.json +16 -0
- package/src/governance/profile-registry.mjs +366 -0
- package/src/governance/provenance-record.mjs +177 -0
- package/src/governance/reconcile-candidates.mjs +301 -0
- package/src/governance/reconcile-score.mjs +503 -0
- package/src/governance/row-schema.mjs +208 -0
- package/src/governance/verdict.mjs +127 -0
- package/src/governance/waiver.mjs +105 -0
- package/src/graph/create-dependencies.mjs +96 -0
- package/src/intent/intent-manifest.json +347 -0
- package/src/intent/mask-non-code.mjs +640 -0
- package/src/lsp/boundary-config.mjs +225 -0
- package/src/lsp/diagnose.mjs +202 -0
- package/src/lsp/diagnostics.mjs +241 -0
- package/src/lsp/protocol.mjs +215 -0
- package/src/lsp/server.mjs +922 -0
- package/src/lsp/workspace-index.mjs +891 -0
- package/src/nx-json.mjs +95 -0
- package/src/options.mjs +611 -0
- package/src/process.mjs +91 -0
- package/src/providers/moon.mjs +733 -0
- package/src/providers/native/README.md +204 -0
- package/src/providers/native/coverage.mjs +74 -0
- package/src/providers/native/differential.fixtures.mjs +1277 -0
- package/src/providers/native/discover.mjs +431 -0
- package/src/providers/native/graph.mjs +234 -0
- package/src/providers/native/index.mjs +152 -0
- package/src/providers/native/model.mjs +755 -0
- package/src/providers/nx.mjs +178 -0
- package/src/report/README.md +89 -0
- package/src/report/adr-text.mjs +129 -0
- package/src/report/context-text.mjs +109 -0
- package/src/report/debt-text.mjs +105 -0
- package/src/report/diff-text.mjs +219 -0
- package/src/report/discover-text.mjs +186 -0
- package/src/report/drift-text.mjs +194 -0
- package/src/report/envelope-shape.mjs +161 -0
- package/src/report/evidence.mjs +157 -0
- package/src/report/explain-text.mjs +159 -0
- package/src/report/graph-text.mjs +116 -0
- package/src/report/health-text.mjs +123 -0
- package/src/report/history-text.mjs +204 -0
- package/src/report/impact-text.mjs +128 -0
- package/src/report/json.mjs +173 -0
- package/src/report/plan-context-text.mjs +159 -0
- package/src/report/provenance-text.mjs +78 -0
- package/src/report/reconcile-text.mjs +159 -0
- package/src/report/report-text.mjs +264 -0
- package/src/report/sarif.mjs +953 -0
- package/src/report/text.mjs +823 -0
- package/src/report/waivers-text.mjs +100 -0
- package/src/rules/README.md +123 -0
- package/src/rules/index.mjs +962 -0
- package/src/rules/match.mjs +1708 -0
- package/src/rules/messages.mjs +73 -0
- package/src/rules/reachability.mjs +224 -0
- package/src/rules/specifiers.mjs +300 -0
- package/src/rules/tags.mjs +238 -0
- package/src/rules/topology.mjs +333 -0
- package/src/tsconfig-paths.mjs +237 -0
- package/src/verdict.mjs +145 -0
- package/src/workspace.mjs +580 -0
package/src/process.mjs
ADDED
|
@@ -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
|
+
}
|