audit-tools 0.28.10 → 0.29.1
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/README.audit.md +14 -15
- package/README.remediate.md +13 -14
- package/dist/audit/extractors/designAssessment.d.ts.map +1 -1
- package/dist/audit/extractors/designAssessment.js +31 -128
- package/dist/audit/extractors/designAssessment.js.map +1 -1
- package/dist/audit/extractors/graphSignals.d.ts +63 -0
- package/dist/audit/extractors/graphSignals.d.ts.map +1 -0
- package/dist/audit/extractors/graphSignals.js +134 -0
- package/dist/audit/extractors/graphSignals.js.map +1 -0
- package/dist/audit/extractors/risk.d.ts +2 -1
- package/dist/audit/extractors/risk.d.ts.map +1 -1
- package/dist/audit/extractors/risk.js +21 -2
- package/dist/audit/extractors/risk.js.map +1 -1
- package/dist/audit/orchestrator/structureExecutors.d.ts.map +1 -1
- package/dist/audit/orchestrator/structureExecutors.js +3 -1
- package/dist/audit/orchestrator/structureExecutors.js.map +1 -1
- package/dist/remediate/steps/dispatch.d.ts +12 -0
- package/dist/remediate/steps/dispatch.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch.js +27 -3
- package/dist/remediate/steps/dispatch.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +14 -6
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/prompts.d.ts.map +1 -1
- package/dist/remediate/steps/prompts.js +14 -9
- package/dist/remediate/steps/prompts.js.map +1 -1
- package/docs/audit-pkg/contracts.md +1 -1
- package/docs/audit-pkg/development.md +5 -6
- package/docs/audit-pkg/operator-guide.md +7 -7
- package/docs/audit-pkg/product.md +2 -2
- package/package.json +1 -1
- package/skills/audit-code/SKILL.md +4 -5
- package/skills/audit-code/audit-code.prompt.md +5 -6
- package/skills/remediate-code/SKILL.md +2 -2
- package/docs/audit-pkg/history.md +0 -66
package/README.audit.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# audit-code
|
|
2
2
|
|
|
3
3
|
Skill-first audit orchestration backend for the `/audit-code` product surface.
|
|
4
4
|
|
|
@@ -25,7 +25,7 @@ Packaged installs and repository checkouts both ship that prompt asset.
|
|
|
25
25
|
The intended user install is one global tool install:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npm install -g
|
|
28
|
+
npm install -g audit-tools
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
That makes `audit-code` available on `PATH`. During package install, the package
|
|
@@ -105,7 +105,7 @@ audit-code next-step
|
|
|
105
105
|
Repository-local equivalent:
|
|
106
106
|
|
|
107
107
|
```bash
|
|
108
|
-
node /path/to/
|
|
108
|
+
node /path/to/audit-tools/audit-code.mjs next-step
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
This advances deterministic audit state one bounded step, writes
|
|
@@ -148,7 +148,7 @@ For task-to-coverage inspection without reverse-engineering multiple artifacts:
|
|
|
148
148
|
audit-code explain-task <task_id>
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
To remove a leftover `.audit-
|
|
151
|
+
To remove a leftover `.audit-tools/audit/` directory from an interrupted or
|
|
152
152
|
crashed audit:
|
|
153
153
|
|
|
154
154
|
```bash
|
|
@@ -183,12 +183,12 @@ If you want best-effort cross-editor or provider routing, opt into:
|
|
|
183
183
|
|
|
184
184
|
Optional backend config:
|
|
185
185
|
|
|
186
|
-
`.audit-
|
|
186
|
+
`.audit-tools/audit/session-config.json`
|
|
187
187
|
|
|
188
188
|
## Practical Guidance
|
|
189
189
|
|
|
190
190
|
- use `/audit-code` in conversation as the canonical product surface
|
|
191
|
-
- install once with `npm install -g
|
|
191
|
+
- install once with `npm install -g audit-tools`, then let `/audit-code` run `audit-code ensure --quiet` in each repository
|
|
192
192
|
- use `audit-code install` when you want to repair or force-refresh repo-local host assets
|
|
193
193
|
- use `audit-code prompt-path` to locate the packaged prompt asset
|
|
194
194
|
- use `audit-code` from the repository root only when you need the repo-local backend fallback
|
|
@@ -200,24 +200,23 @@ Optional backend config:
|
|
|
200
200
|
|
|
201
201
|
```bash
|
|
202
202
|
npm install
|
|
203
|
-
npm run test:single -- tests/next-step.test.mjs
|
|
203
|
+
npm run test:single -- tests/audit/next-step.test.mjs
|
|
204
204
|
npm run verify:release
|
|
205
205
|
npm run release:patch
|
|
206
206
|
npm run release:patch:publish
|
|
207
207
|
```
|
|
208
208
|
|
|
209
209
|
When developing from a fresh clone or git worktree, run repo-root `npm install`
|
|
210
|
-
before package checks. Missing
|
|
211
|
-
`@audit-tools/shared` export or type errors.
|
|
210
|
+
before package checks. Missing `node_modules` can cause misleading type errors.
|
|
212
211
|
|
|
213
|
-
For GitHub Actions publication and npm Trusted Publishing setup, see `docs/release.md`.
|
|
212
|
+
For GitHub Actions publication and npm Trusted Publishing setup, see `docs/audit-pkg/release.md`.
|
|
214
213
|
|
|
215
214
|
## Key Docs
|
|
216
215
|
|
|
217
|
-
- `docs/product.md`
|
|
218
|
-
- `docs/operator-guide.md`
|
|
219
|
-
- `docs/contracts.md`
|
|
220
|
-
- `docs/release.md`
|
|
221
|
-
- `docs/development.md`
|
|
216
|
+
- `docs/audit-pkg/product.md`
|
|
217
|
+
- `docs/audit-pkg/operator-guide.md`
|
|
218
|
+
- `docs/audit-pkg/contracts.md`
|
|
219
|
+
- `docs/audit-pkg/release.md`
|
|
220
|
+
- `docs/audit-pkg/development.md`
|
|
222
221
|
- `docs/history.md`
|
|
223
222
|
- `skills/audit-code/SKILL.md`
|
package/README.remediate.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# remediate-code
|
|
2
2
|
|
|
3
3
|
Conversation-first remediation orchestrator for arbitrary repositories. It
|
|
4
4
|
accepts the auditor's `audit-findings.json` (the deterministic machine contract)
|
|
5
|
-
from [
|
|
5
|
+
from [audit-code](https://github.com/OhOkThisIsFine/audit-tools), an
|
|
6
6
|
`audit-report.md` or other feedback document (LLM-extracted), or conversational
|
|
7
7
|
feedback — then advances through one backend-rendered step prompt at a time.
|
|
8
8
|
|
|
9
9
|
## Primary Usage
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install -g
|
|
12
|
+
npm install -g audit-tools
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Then start from a conversation:
|
|
@@ -37,25 +37,24 @@ after that brief is clear enough to convert into bounded findings.
|
|
|
37
37
|
|
|
38
38
|
## Runtime Artifacts
|
|
39
39
|
|
|
40
|
-
Active runs use `.remediation
|
|
41
|
-
state is `.
|
|
40
|
+
Active runs use `.audit-tools/remediation/` in the target repository. The current
|
|
41
|
+
state is `.audit-tools/remediation/state.json`, and the current step contract is
|
|
42
42
|
written to:
|
|
43
43
|
|
|
44
|
-
- `.
|
|
45
|
-
- `.
|
|
44
|
+
- `.audit-tools/remediation/steps/current-step.json`
|
|
45
|
+
- `.audit-tools/remediation/steps/current-prompt.md`
|
|
46
46
|
|
|
47
|
-
After close, the durable outputs are written
|
|
47
|
+
After close, the durable outputs are written to `.audit-tools/`:
|
|
48
48
|
|
|
49
49
|
- `remediation-report.md`
|
|
50
|
-
- `remediation-
|
|
50
|
+
- `remediation-outcomes.json`
|
|
51
51
|
- `remediation-closing-result.json`
|
|
52
52
|
|
|
53
53
|
## Development From Source
|
|
54
54
|
|
|
55
|
-
The global `npm install -g
|
|
55
|
+
The global `npm install -g audit-tools` path is for users. For repository
|
|
56
56
|
development in a fresh clone or git worktree, run `npm install` at the repo root
|
|
57
|
-
before build, check,
|
|
58
|
-
at the current `@audit-tools/shared` sources instead of stale compiled output.
|
|
57
|
+
before build, check, or test workflows.
|
|
59
58
|
|
|
60
59
|
## CLI
|
|
61
60
|
|
|
@@ -80,7 +79,7 @@ no LLM involved. A Markdown `audit-report.md` (or any other free-form or partial
|
|
|
80
79
|
document) is instead routed through intake synthesis and bounded LLM finding
|
|
81
80
|
extraction, so it cannot silently produce a zero-finding plan. The deterministic
|
|
82
81
|
contract is locked by `tests/fixtures/auditor-contract-audit-findings.json`,
|
|
83
|
-
regenerated with `npm run fixtures:auditor-contract` from
|
|
82
|
+
regenerated with `npm run fixtures:auditor-contract` from audit-code's
|
|
84
83
|
findings renderer.
|
|
85
84
|
|
|
86
85
|
## Intake
|
|
@@ -92,7 +91,7 @@ The remediator can start from any of these inputs:
|
|
|
92
91
|
- conversational feedback typed directly after `/remediate-code`
|
|
93
92
|
- a mix of documents and conversation
|
|
94
93
|
|
|
95
|
-
Runtime intake artifacts live under `.
|
|
94
|
+
Runtime intake artifacts live under `.audit-tools/remediation/intake/`:
|
|
96
95
|
|
|
97
96
|
- `source-manifest.json`
|
|
98
97
|
- `conversation-start.md`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designAssessment.d.ts","sourceRoot":"","sources":["../../../src/audit/extractors/designAssessment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"designAssessment.d.ts","sourceRoot":"","sources":["../../../src/audit/extractors/designAssessment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA8MrE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;CAC5B,GAAG,gBAAgB,CAmBnB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deriveGraphSignals } from "./graphSignals.js";
|
|
1
2
|
// ID generation is instance-scoped per build (no shared mutable module state),
|
|
2
3
|
// so repeated/concurrent buildDesignAssessment calls produce independent,
|
|
3
4
|
// non-colliding DA-### sequences.
|
|
@@ -5,90 +6,8 @@ function createFindingIdGenerator() {
|
|
|
5
6
|
let n = 1;
|
|
6
7
|
return () => `DA-${String(n++).padStart(3, "0")}`;
|
|
7
8
|
}
|
|
8
|
-
function
|
|
9
|
-
const
|
|
10
|
-
for (const [key, value] of Object.entries(graphBundle.graphs)) {
|
|
11
|
-
if (key === "routes" || !Array.isArray(value))
|
|
12
|
-
continue;
|
|
13
|
-
for (const edge of value) {
|
|
14
|
-
if (edge && typeof edge.from === "string" && typeof edge.to === "string") {
|
|
15
|
-
edges.push(edge);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return edges;
|
|
20
|
-
}
|
|
21
|
-
function dfsVisit(node, path, adjacency, visited, stack, cycles) {
|
|
22
|
-
if (stack.has(node)) {
|
|
23
|
-
const cycleStart = path.indexOf(node);
|
|
24
|
-
if (cycleStart >= 0) {
|
|
25
|
-
cycles.push(path.slice(cycleStart));
|
|
26
|
-
}
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (visited.has(node))
|
|
30
|
-
return;
|
|
31
|
-
visited.add(node);
|
|
32
|
-
stack.add(node);
|
|
33
|
-
path.push(node);
|
|
34
|
-
for (const neighbor of adjacency.get(node) ?? []) {
|
|
35
|
-
dfsVisit(neighbor, path, adjacency, visited, stack, cycles);
|
|
36
|
-
}
|
|
37
|
-
path.pop();
|
|
38
|
-
stack.delete(node);
|
|
39
|
-
}
|
|
40
|
-
function detectCycles(edges) {
|
|
41
|
-
const adjacency = new Map();
|
|
42
|
-
for (const edge of edges) {
|
|
43
|
-
if (!adjacency.has(edge.from))
|
|
44
|
-
adjacency.set(edge.from, new Set());
|
|
45
|
-
adjacency.get(edge.from).add(edge.to);
|
|
46
|
-
}
|
|
47
|
-
const cycles = [];
|
|
48
|
-
// Each DFS root gets a fresh per-DFS visited set so that nodes already fully
|
|
49
|
-
// explored via one root are re-entered from a new root. This is required
|
|
50
|
-
// because a shared visited set across DFS starts prevents detection of cycles
|
|
51
|
-
// that are reachable from a later root only through an already-visited node
|
|
52
|
-
// (the "diamond reachability" case). The stack (current DFS path) is still
|
|
53
|
-
// per-path-bookkeeping and correctly identifies back-edges within each DFS.
|
|
54
|
-
for (const node of adjacency.keys()) {
|
|
55
|
-
const visited = new Set();
|
|
56
|
-
const stack = new Set();
|
|
57
|
-
dfsVisit(node, [], adjacency, visited, stack, cycles);
|
|
58
|
-
}
|
|
59
|
-
return cycles;
|
|
60
|
-
}
|
|
61
|
-
// Canonicalize a directed cycle by rotating it so the lexicographically
|
|
62
|
-
// smallest node leads, preserving order/direction. Rotation (not sort) keeps
|
|
63
|
-
// distinct directed cycles over the same node set apart (A→B→C→A vs A→C→B→A)
|
|
64
|
-
// while still deduping the same cycle discovered from different DFS start nodes
|
|
65
|
-
// (which differ only by rotation).
|
|
66
|
-
function canonicalCycleKey(cycle) {
|
|
67
|
-
if (cycle.length === 0)
|
|
68
|
-
return "";
|
|
69
|
-
let minIdx = 0;
|
|
70
|
-
for (let i = 1; i < cycle.length; i++) {
|
|
71
|
-
if (cycle[i] < cycle[minIdx])
|
|
72
|
-
minIdx = i;
|
|
73
|
-
}
|
|
74
|
-
const rotated = [...cycle.slice(minIdx), ...cycle.slice(0, minIdx)];
|
|
75
|
-
return rotated.join("\0");
|
|
76
|
-
}
|
|
77
|
-
function deduplicateCycles(cycles) {
|
|
78
|
-
const seen = new Set();
|
|
79
|
-
const unique = [];
|
|
80
|
-
for (const cycle of cycles) {
|
|
81
|
-
const normalized = canonicalCycleKey(cycle);
|
|
82
|
-
if (!seen.has(normalized)) {
|
|
83
|
-
seen.add(normalized);
|
|
84
|
-
unique.push(cycle);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return unique;
|
|
88
|
-
}
|
|
89
|
-
function detectCycleFindings(graphBundle, nextId) {
|
|
90
|
-
const edges = allEdges(graphBundle);
|
|
91
|
-
const cycles = deduplicateCycles(detectCycles(edges));
|
|
9
|
+
function detectCycleFindings(signals, nextId) {
|
|
10
|
+
const cycles = signals.cycles;
|
|
92
11
|
if (cycles.length === 0)
|
|
93
12
|
return [];
|
|
94
13
|
return cycles.slice(0, 10).map((cycle) => ({
|
|
@@ -103,43 +22,29 @@ function detectCycleFindings(graphBundle, nextId) {
|
|
|
103
22
|
systemic: true,
|
|
104
23
|
}));
|
|
105
24
|
}
|
|
106
|
-
function detectHubModules(
|
|
107
|
-
const edges = allEdges(graphBundle);
|
|
108
|
-
const fanIn = new Map();
|
|
109
|
-
const fanOut = new Map();
|
|
110
|
-
for (const edge of edges) {
|
|
111
|
-
fanOut.set(edge.from, (fanOut.get(edge.from) ?? 0) + 1);
|
|
112
|
-
fanIn.set(edge.to, (fanIn.get(edge.to) ?? 0) + 1);
|
|
113
|
-
}
|
|
114
|
-
const allNodes = new Set([...fanIn.keys(), ...fanOut.keys()]);
|
|
115
|
-
const hubThreshold = Math.max(8, Math.ceil(allNodes.size * 0.15));
|
|
25
|
+
function detectHubModules(signals, nextId) {
|
|
116
26
|
const findings = [];
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
27
|
+
// Deterministic order: `hubs` derives from the connected set's iteration order
|
|
28
|
+
// (edge insertion order), so the DA-### ids assigned here are reproducible.
|
|
29
|
+
for (const node of signals.hubs) {
|
|
30
|
+
const inCount = signals.fanIn.get(node) ?? 0;
|
|
31
|
+
const outCount = signals.fanOut.get(node) ?? 0;
|
|
32
|
+
findings.push({
|
|
33
|
+
id: nextId(),
|
|
34
|
+
title: `Hub module: ${node}`,
|
|
35
|
+
category: "hub_module",
|
|
36
|
+
severity: "medium",
|
|
37
|
+
confidence: "high",
|
|
38
|
+
lens: "architecture",
|
|
39
|
+
summary: `${node} has ${inCount} incoming and ${outCount} outgoing dependencies. Hub modules become change bottlenecks and make the dependency graph fragile.`,
|
|
40
|
+
affected_files: [{ path: node }],
|
|
41
|
+
systemic: true,
|
|
42
|
+
});
|
|
133
43
|
}
|
|
134
44
|
return findings;
|
|
135
45
|
}
|
|
136
|
-
function detectOrphanUnits(unitManifest,
|
|
137
|
-
const
|
|
138
|
-
const connected = new Set();
|
|
139
|
-
for (const edge of edges) {
|
|
140
|
-
connected.add(edge.from);
|
|
141
|
-
connected.add(edge.to);
|
|
142
|
-
}
|
|
46
|
+
function detectOrphanUnits(unitManifest, signals, nextId) {
|
|
47
|
+
const connected = signals.connected;
|
|
143
48
|
if (connected.size === 0)
|
|
144
49
|
return [];
|
|
145
50
|
const orphans = [];
|
|
@@ -235,13 +140,8 @@ function detectUnitSprawl(unitManifest, nextId) {
|
|
|
235
140
|
}
|
|
236
141
|
return findings;
|
|
237
142
|
}
|
|
238
|
-
function detectFlowGaps(criticalFlows,
|
|
239
|
-
const
|
|
240
|
-
const connected = new Set();
|
|
241
|
-
for (const edge of edges) {
|
|
242
|
-
connected.add(edge.from);
|
|
243
|
-
connected.add(edge.to);
|
|
244
|
-
}
|
|
143
|
+
function detectFlowGaps(criticalFlows, signals, nextId) {
|
|
144
|
+
const connected = signals.connected;
|
|
245
145
|
const findings = [];
|
|
246
146
|
for (const flow of criticalFlows.flows) {
|
|
247
147
|
const disconnected = flow.paths.filter((path) => !connected.has(path));
|
|
@@ -264,13 +164,16 @@ function detectFlowGaps(criticalFlows, graphBundle, nextId) {
|
|
|
264
164
|
}
|
|
265
165
|
export function buildDesignAssessment(params) {
|
|
266
166
|
const nextId = createFindingIdGenerator();
|
|
167
|
+
// Single source of truth for the whole-graph signals — the same module the
|
|
168
|
+
// risk register reads, so cycle/hub/orphan derivation cannot drift between them.
|
|
169
|
+
const signals = deriveGraphSignals(params.graphBundle);
|
|
267
170
|
const findings = [
|
|
268
|
-
...detectCycleFindings(
|
|
269
|
-
...detectHubModules(
|
|
270
|
-
...detectOrphanUnits(params.unitManifest,
|
|
171
|
+
...detectCycleFindings(signals, nextId),
|
|
172
|
+
...detectHubModules(signals, nextId),
|
|
173
|
+
...detectOrphanUnits(params.unitManifest, signals, nextId),
|
|
271
174
|
...detectRiskConcentration(params.riskRegister, params.unitManifest, nextId),
|
|
272
175
|
...detectUnitSprawl(params.unitManifest, nextId),
|
|
273
|
-
...detectFlowGaps(params.criticalFlows,
|
|
176
|
+
...detectFlowGaps(params.criticalFlows, signals, nextId),
|
|
274
177
|
];
|
|
275
178
|
return {
|
|
276
179
|
generated_at: new Date().toISOString(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designAssessment.js","sourceRoot":"","sources":["../../../src/audit/extractors/designAssessment.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"designAssessment.js","sourceRoot":"","sources":["../../../src/audit/extractors/designAssessment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { GraphBundle, GraphEdge } from "audit-tools/shared";
|
|
2
|
+
/**
|
|
3
|
+
* Whole-graph derived signals, single-sourced.
|
|
4
|
+
*
|
|
5
|
+
* The audit graph is built per-file by the language analyzers (compiler-fidelity
|
|
6
|
+
* import/call/reference edges) and the regex floor. Several architectural
|
|
7
|
+
* heuristics are not edges but *queries over the merged edge set* — cycles, hub
|
|
8
|
+
* concentration, orphans, and the "deletion test" (low-in-degree leaves). These
|
|
9
|
+
* were previously recomputed ad-hoc inside the design assessment; they live here
|
|
10
|
+
* now so BOTH the design assessment and the risk register read one source of
|
|
11
|
+
* truth, and so the risk register can finally weight graph-structural risk.
|
|
12
|
+
*
|
|
13
|
+
* Language-neutral by construction: it consumes only `from`/`to` node ids (repo
|
|
14
|
+
* paths), so every analyzer that contributes import/call edges — TS, Python, … —
|
|
15
|
+
* feeds these signals identically. No new dependency, no per-ecosystem fork.
|
|
16
|
+
*/
|
|
17
|
+
export interface GraphSignals {
|
|
18
|
+
/**
|
|
19
|
+
* Deduplicated directed cycles. Each entry is the node sequence of one cycle
|
|
20
|
+
* (the cycle closes from the last node back to the first); rotations of the
|
|
21
|
+
* same directed cycle are collapsed, distinct directed cycles over the same
|
|
22
|
+
* node set are kept apart.
|
|
23
|
+
*/
|
|
24
|
+
cycles: string[][];
|
|
25
|
+
/** Per-node incoming edge count (number of edges whose `to` is the node). */
|
|
26
|
+
fanIn: Map<string, number>;
|
|
27
|
+
/** Per-node outgoing edge count (number of edges whose `from` is the node). */
|
|
28
|
+
fanOut: Map<string, number>;
|
|
29
|
+
/** Every node that participates in at least one cycle. */
|
|
30
|
+
nodesInCycles: Set<string>;
|
|
31
|
+
/** Hub nodes: `fanIn >= hubThreshold && fanOut >= hubThreshold`. */
|
|
32
|
+
hubs: Set<string>;
|
|
33
|
+
/** The fan-in/fan-out threshold a node must meet on both sides to be a hub. */
|
|
34
|
+
hubThreshold: number;
|
|
35
|
+
/**
|
|
36
|
+
* Deletion-test candidates (the ralph-architecture-sweep heuristic): nodes that
|
|
37
|
+
* nothing imports (`fanIn === 0`) yet which import others (`fanOut > 0`). A
|
|
38
|
+
* low-in-degree leaf is an easy deletion/refactor target — though it may also be
|
|
39
|
+
* a legitimate entrypoint (CLI main, test root), so this is an advisory signal
|
|
40
|
+
* the LLM lenses adjudicate, not a verdict. Pure orphans (`fanIn === 0 &&
|
|
41
|
+
* fanOut === 0`) are deliberately NOT here — those are the separate zero-edge
|
|
42
|
+
* orphan signal ({@link connected}-based) and would otherwise double-report.
|
|
43
|
+
*/
|
|
44
|
+
deletionCandidates: Set<string>;
|
|
45
|
+
/** Every node touched by any edge (as `from` or `to`) — the connected set. */
|
|
46
|
+
connected: Set<string>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Flatten every edge bucket of a graph bundle into one edge list. `routes` is
|
|
50
|
+
* excluded (it is a `{path,handler,method}` shape, not a `from`/`to` edge);
|
|
51
|
+
* malformed entries (missing string endpoints) are dropped so a bad analyzer
|
|
52
|
+
* output can never throw here.
|
|
53
|
+
*/
|
|
54
|
+
export declare function allGraphEdges(graphBundle: GraphBundle): GraphEdge[];
|
|
55
|
+
/**
|
|
56
|
+
* Derive every whole-graph signal from a graph bundle in one pass. Pure: no IO,
|
|
57
|
+
* no mutation of the input — a deterministic function of the edge set, so the
|
|
58
|
+
* structure executor (which has the live bundle) and the design-assessment
|
|
59
|
+
* executor (which re-reads the persisted bundle) compute identical signals
|
|
60
|
+
* without a new persisted artifact.
|
|
61
|
+
*/
|
|
62
|
+
export declare function deriveGraphSignals(graphBundle: GraphBundle): GraphSignals;
|
|
63
|
+
//# sourceMappingURL=graphSignals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphSignals.d.ts","sourceRoot":"","sources":["../../../src/audit/extractors/graphSignals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,6EAA6E;IAC7E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,+EAA+E;IAC/E,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,oEAAoE;IACpE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,8EAA8E;IAC9E,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,EAAE,CAWnE;AA2ED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CA+CzE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten every edge bucket of a graph bundle into one edge list. `routes` is
|
|
3
|
+
* excluded (it is a `{path,handler,method}` shape, not a `from`/`to` edge);
|
|
4
|
+
* malformed entries (missing string endpoints) are dropped so a bad analyzer
|
|
5
|
+
* output can never throw here.
|
|
6
|
+
*/
|
|
7
|
+
export function allGraphEdges(graphBundle) {
|
|
8
|
+
const edges = [];
|
|
9
|
+
for (const [key, value] of Object.entries(graphBundle.graphs)) {
|
|
10
|
+
if (key === "routes" || !Array.isArray(value))
|
|
11
|
+
continue;
|
|
12
|
+
for (const edge of value) {
|
|
13
|
+
if (edge && typeof edge.from === "string" && typeof edge.to === "string") {
|
|
14
|
+
edges.push(edge);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return edges;
|
|
19
|
+
}
|
|
20
|
+
function dfsVisit(node, path, adjacency, visited, stack, cycles) {
|
|
21
|
+
if (stack.has(node)) {
|
|
22
|
+
const cycleStart = path.indexOf(node);
|
|
23
|
+
if (cycleStart >= 0) {
|
|
24
|
+
cycles.push(path.slice(cycleStart));
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (visited.has(node))
|
|
29
|
+
return;
|
|
30
|
+
visited.add(node);
|
|
31
|
+
stack.add(node);
|
|
32
|
+
path.push(node);
|
|
33
|
+
for (const neighbor of adjacency.get(node) ?? []) {
|
|
34
|
+
dfsVisit(neighbor, path, adjacency, visited, stack, cycles);
|
|
35
|
+
}
|
|
36
|
+
path.pop();
|
|
37
|
+
stack.delete(node);
|
|
38
|
+
}
|
|
39
|
+
function detectCycles(adjacency) {
|
|
40
|
+
const cycles = [];
|
|
41
|
+
// Each DFS root gets a fresh per-DFS visited set so that nodes already fully
|
|
42
|
+
// explored via one root are re-entered from a new root. This is required
|
|
43
|
+
// because a shared visited set across DFS starts prevents detection of cycles
|
|
44
|
+
// that are reachable from a later root only through an already-visited node
|
|
45
|
+
// (the "diamond reachability" case). The stack (current DFS path) is still
|
|
46
|
+
// per-path-bookkeeping and correctly identifies back-edges within each DFS.
|
|
47
|
+
for (const node of adjacency.keys()) {
|
|
48
|
+
const visited = new Set();
|
|
49
|
+
const stack = new Set();
|
|
50
|
+
dfsVisit(node, [], adjacency, visited, stack, cycles);
|
|
51
|
+
}
|
|
52
|
+
return cycles;
|
|
53
|
+
}
|
|
54
|
+
// Canonicalize a directed cycle by rotating it so the lexicographically
|
|
55
|
+
// smallest node leads, preserving order/direction. Rotation (not sort) keeps
|
|
56
|
+
// distinct directed cycles over the same node set apart (A→B→C→A vs A→C→B→A)
|
|
57
|
+
// while still deduping the same cycle discovered from different DFS start nodes
|
|
58
|
+
// (which differ only by rotation).
|
|
59
|
+
function canonicalCycleKey(cycle) {
|
|
60
|
+
if (cycle.length === 0)
|
|
61
|
+
return "";
|
|
62
|
+
let minIdx = 0;
|
|
63
|
+
for (let i = 1; i < cycle.length; i++) {
|
|
64
|
+
if (cycle[i] < cycle[minIdx])
|
|
65
|
+
minIdx = i;
|
|
66
|
+
}
|
|
67
|
+
const rotated = [...cycle.slice(minIdx), ...cycle.slice(0, minIdx)];
|
|
68
|
+
return rotated.join("\0");
|
|
69
|
+
}
|
|
70
|
+
function deduplicateCycles(cycles) {
|
|
71
|
+
const seen = new Set();
|
|
72
|
+
const unique = [];
|
|
73
|
+
for (const cycle of cycles) {
|
|
74
|
+
const normalized = canonicalCycleKey(cycle);
|
|
75
|
+
if (!seen.has(normalized)) {
|
|
76
|
+
seen.add(normalized);
|
|
77
|
+
unique.push(cycle);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return unique;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Derive every whole-graph signal from a graph bundle in one pass. Pure: no IO,
|
|
84
|
+
* no mutation of the input — a deterministic function of the edge set, so the
|
|
85
|
+
* structure executor (which has the live bundle) and the design-assessment
|
|
86
|
+
* executor (which re-reads the persisted bundle) compute identical signals
|
|
87
|
+
* without a new persisted artifact.
|
|
88
|
+
*/
|
|
89
|
+
export function deriveGraphSignals(graphBundle) {
|
|
90
|
+
const edges = allGraphEdges(graphBundle);
|
|
91
|
+
const adjacency = new Map();
|
|
92
|
+
const fanIn = new Map();
|
|
93
|
+
const fanOut = new Map();
|
|
94
|
+
const connected = new Set();
|
|
95
|
+
for (const edge of edges) {
|
|
96
|
+
if (!adjacency.has(edge.from))
|
|
97
|
+
adjacency.set(edge.from, new Set());
|
|
98
|
+
adjacency.get(edge.from).add(edge.to);
|
|
99
|
+
fanOut.set(edge.from, (fanOut.get(edge.from) ?? 0) + 1);
|
|
100
|
+
fanIn.set(edge.to, (fanIn.get(edge.to) ?? 0) + 1);
|
|
101
|
+
connected.add(edge.from);
|
|
102
|
+
connected.add(edge.to);
|
|
103
|
+
}
|
|
104
|
+
const cycles = deduplicateCycles(detectCycles(adjacency));
|
|
105
|
+
const nodesInCycles = new Set();
|
|
106
|
+
for (const cycle of cycles) {
|
|
107
|
+
for (const node of cycle)
|
|
108
|
+
nodesInCycles.add(node);
|
|
109
|
+
}
|
|
110
|
+
const hubThreshold = Math.max(8, Math.ceil(connected.size * 0.15));
|
|
111
|
+
const hubs = new Set();
|
|
112
|
+
const deletionCandidates = new Set();
|
|
113
|
+
for (const node of connected) {
|
|
114
|
+
const inCount = fanIn.get(node) ?? 0;
|
|
115
|
+
const outCount = fanOut.get(node) ?? 0;
|
|
116
|
+
if (inCount >= hubThreshold && outCount >= hubThreshold) {
|
|
117
|
+
hubs.add(node);
|
|
118
|
+
}
|
|
119
|
+
if (inCount === 0 && outCount > 0) {
|
|
120
|
+
deletionCandidates.add(node);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
cycles,
|
|
125
|
+
fanIn,
|
|
126
|
+
fanOut,
|
|
127
|
+
nodesInCycles,
|
|
128
|
+
hubs,
|
|
129
|
+
hubThreshold,
|
|
130
|
+
deletionCandidates,
|
|
131
|
+
connected,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=graphSignals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphSignals.js","sourceRoot":"","sources":["../../../src/audit/extractors/graphSignals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { UnitManifest } from "../types.js";
|
|
2
2
|
import type { ExternalAnalyzerResults } from "../types/externalAnalyzer.js";
|
|
3
3
|
import type { CriticalFlowManifest, RiskRegister } from "audit-tools/shared";
|
|
4
|
-
|
|
4
|
+
import type { GraphSignals } from "./graphSignals.js";
|
|
5
|
+
export declare function buildRiskRegister(unitManifest: UnitManifest, criticalFlows?: CriticalFlowManifest, externalAnalyzerResults?: ExternalAnalyzerResults, graphSignals?: GraphSignals): RiskRegister;
|
|
5
6
|
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../../src/audit/extractors/risk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAY,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../../src/audit/extractors/risk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAY,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,oBAAoB,EACpC,uBAAuB,CAAC,EAAE,uBAAuB,EACjD,YAAY,CAAC,EAAE,YAAY,GAC1B,YAAY,CAwFd"}
|