audit-tools 0.28.11 → 0.29.3
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/audit-code-wrapper-build.mjs +1 -1
- package/audit-code-wrapper-install-hosts.mjs +2 -2
- package/audit-code-wrapper-opencode.mjs +1 -3
- 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/docs/audit-pkg/contracts.md +1 -1
- package/docs/audit-pkg/development.md +1 -1
- package/docs/audit-pkg/operator-guide.md +5 -5
- package/docs/audit-pkg/product.md +1 -1
- package/opencode.json +0 -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/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`
|
|
@@ -38,7 +38,7 @@ function runBuild(command, args) {
|
|
|
38
38
|
const child = spawn(resolved.command, resolved.args, {
|
|
39
39
|
cwd: repoRoot,
|
|
40
40
|
// Auto-rebuild output is diagnostic — route both child streams to the
|
|
41
|
-
// parent's stderr (fd 2) so npm's `>
|
|
41
|
+
// parent's stderr (fd 2) so npm's `> audit-tools@… build` banner can
|
|
42
42
|
// never pollute the wrapper's stdout JSON channel when a caller captures it.
|
|
43
43
|
stdio: ['ignore', 2, 2],
|
|
44
44
|
env: process.env,
|
|
@@ -155,7 +155,7 @@ export const INSTALL_HOST_DEFINITIONS = {
|
|
|
155
155
|
],
|
|
156
156
|
steps: [
|
|
157
157
|
'Open this repository in Codex.',
|
|
158
|
-
'Use the global `/audit-code` skill installed by `npm install -g
|
|
158
|
+
'Use the global `/audit-code` skill installed by `npm install -g audit-tools`.',
|
|
159
159
|
'If the global skill is unavailable, follow the AGENTS fallback instructions that point at the repo-local prompt asset.',
|
|
160
160
|
],
|
|
161
161
|
profile: {
|
|
@@ -187,7 +187,7 @@ export const INSTALL_HOST_DEFINITIONS = {
|
|
|
187
187
|
],
|
|
188
188
|
steps: [
|
|
189
189
|
'Open this repository in OpenCode.',
|
|
190
|
-
'Use the global `/audit-code` command installed by `npm install -g
|
|
190
|
+
'Use the global `/audit-code` command installed by `npm install -g audit-tools`.',
|
|
191
191
|
'Let OpenCode load the generated `opencode.json` for project permissions; the global command drives `audit-code next-step` directly.',
|
|
192
192
|
],
|
|
193
193
|
profile: {
|
|
@@ -58,7 +58,6 @@ function buildAuditBashPermissions() {
|
|
|
58
58
|
for (const sub of AUDIT_CODE_WRAPPER_EXTRA_SUBCOMMANDS) {
|
|
59
59
|
perm[`*audit-code.mjs* ${sub}`] = 'allow';
|
|
60
60
|
}
|
|
61
|
-
perm['*node* *auditor-lambda*dist*index.js* worker-run*'] = 'allow';
|
|
62
61
|
perm['git status*'] = 'allow';
|
|
63
62
|
perm['git diff*'] = 'allow';
|
|
64
63
|
perm['grep *'] = 'allow';
|
|
@@ -158,7 +157,6 @@ export function assertOpenCodeAuditPermissionConfig(permissionConfig, label) {
|
|
|
158
157
|
'*audit-code.mjs* submit-packet*',
|
|
159
158
|
'*audit-code.mjs* merge-and-ingest*',
|
|
160
159
|
'*audit-code.mjs* worker-run*',
|
|
161
|
-
'*node* *auditor-lambda*dist*index.js* worker-run*',
|
|
162
160
|
]) {
|
|
163
161
|
if (bash[pattern] !== 'allow') {
|
|
164
162
|
throw new Error(`OpenCode ${label}.bash must allow ${pattern}. Run "audit-code install --host opencode".`);
|
|
@@ -213,7 +211,7 @@ function mergePermissionBlock(existingPermission, generatedPermission) {
|
|
|
213
211
|
export function buildMergedOpenCodeProjectConfig(existing, root) {
|
|
214
212
|
if (!sharedOpenCodePermissions) {
|
|
215
213
|
throw new Error(
|
|
216
|
-
'audit-tools/shared is not available. Run "npm run build
|
|
214
|
+
'audit-tools/shared is not available. Run "npm run build" before deploying OpenCode config.',
|
|
217
215
|
);
|
|
218
216
|
}
|
|
219
217
|
const generated = renderOpenCodeProjectConfig(root);
|
|
@@ -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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const MAX_RISK_SCORE = 10;
|
|
2
|
-
export function buildRiskRegister(unitManifest, criticalFlows, externalAnalyzerResults) {
|
|
2
|
+
export function buildRiskRegister(unitManifest, criticalFlows, externalAnalyzerResults, graphSignals) {
|
|
3
3
|
const flowMap = new Map();
|
|
4
4
|
for (const flow of criticalFlows?.flows ?? []) {
|
|
5
5
|
for (const path of flow.paths) {
|
|
@@ -31,10 +31,29 @@ export function buildRiskRegister(unitManifest, criticalFlows, externalAnalyzerR
|
|
|
31
31
|
if (externalHits > 0) {
|
|
32
32
|
signals.push("external_analyzer_signal");
|
|
33
33
|
}
|
|
34
|
+
// Whole-graph structural signals (single-sourced in graphSignals). A unit
|
|
35
|
+
// inherits a signal when ANY of its files is so flagged in the dependency
|
|
36
|
+
// graph. `member_of_cycle` and `is_hub` raise structural-fragility risk;
|
|
37
|
+
// `deletion_candidate` (low-in-degree dead-code suspect) is informational —
|
|
38
|
+
// it flags cleanup scope without inflating the risk score.
|
|
39
|
+
const inCycle = graphSignals != null &&
|
|
40
|
+
unit.files.some((path) => graphSignals.nodesInCycles.has(path));
|
|
41
|
+
if (inCycle)
|
|
42
|
+
signals.push("member_of_cycle");
|
|
43
|
+
const isHub = graphSignals != null &&
|
|
44
|
+
unit.files.some((path) => graphSignals.hubs.has(path));
|
|
45
|
+
if (isHub)
|
|
46
|
+
signals.push("is_hub");
|
|
47
|
+
const deletionCandidate = graphSignals != null &&
|
|
48
|
+
unit.files.some((path) => graphSignals.deletionCandidates.has(path));
|
|
49
|
+
if (deletionCandidate)
|
|
50
|
+
signals.push("deletion_candidate");
|
|
34
51
|
const riskScore = (unit.risk_score ?? 0) +
|
|
35
52
|
flowHits +
|
|
36
53
|
externalHits +
|
|
37
|
-
(signals.includes("path_level_stateful_behavior") ? 1 : 0)
|
|
54
|
+
(signals.includes("path_level_stateful_behavior") ? 1 : 0) +
|
|
55
|
+
(inCycle ? 1 : 0) +
|
|
56
|
+
(isHub ? 1 : 0);
|
|
38
57
|
return {
|
|
39
58
|
unit_id: unit.unit_id,
|
|
40
59
|
risk_score: Math.min(MAX_RISK_SCORE, riskScore),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/audit/extractors/risk.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/audit/extractors/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structureExecutors.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/structureExecutors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"structureExecutors.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/structureExecutors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC,CA2D5B;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,GACrB,iBAAiB,CA6CnB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,UAAU,GAAG,YAAY,GAAG,MAAe,GAChD,iBAAiB,CAiCnB"}
|
|
@@ -5,6 +5,7 @@ import { buildRiskRegister } from "../extractors/risk.js";
|
|
|
5
5
|
import { buildSurfaceManifest } from "../extractors/surfaces.js";
|
|
6
6
|
import { buildUnitManifest } from "./unitBuilder.js";
|
|
7
7
|
import { buildDesignAssessment } from "../extractors/designAssessment.js";
|
|
8
|
+
import { deriveGraphSignals } from "../extractors/graphSignals.js";
|
|
8
9
|
export async function runStructureExecutor(bundle, root) {
|
|
9
10
|
if (!bundle.repo_manifest) {
|
|
10
11
|
throw new Error("Cannot run structure executor without repo_manifest");
|
|
@@ -22,7 +23,8 @@ export async function runStructureExecutor(bundle, root) {
|
|
|
22
23
|
});
|
|
23
24
|
const surfaceManifest = buildSurfaceManifest(bundle.repo_manifest, disposition, { graphBundle });
|
|
24
25
|
const criticalFlows = buildCriticalFlowManifest(bundle.repo_manifest, surfaceManifest, disposition);
|
|
25
|
-
const
|
|
26
|
+
const graphSignals = deriveGraphSignals(graphBundle);
|
|
27
|
+
const riskRegister = buildRiskRegister(unitManifest, criticalFlows, externalAnalyzerResults, graphSignals);
|
|
26
28
|
return {
|
|
27
29
|
updated: {
|
|
28
30
|
...bundle,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structureExecutors.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/structureExecutors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"structureExecutors.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/structureExecutors.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,7 +56,7 @@ audit-code validate-results --results /path/to/results.json
|
|
|
56
56
|
|
|
57
57
|
## Artifact bundle
|
|
58
58
|
|
|
59
|
-
The backend stores resumable artifacts under `.audit-
|
|
59
|
+
The backend stores resumable artifacts under `.audit-tools/audit/`, including:
|
|
60
60
|
|
|
61
61
|
- `repo_manifest.json`
|
|
62
62
|
- `file_disposition.json`
|
|
@@ -37,7 +37,7 @@ Shared install files:
|
|
|
37
37
|
- `.audit-code/install/GETTING-STARTED.md`
|
|
38
38
|
- `.audit-code/install/manifest.json`
|
|
39
39
|
- `.audit-code/install/run-mcp-server.mjs`
|
|
40
|
-
- `.audit-
|
|
40
|
+
- `.audit-tools/audit/session-config.json` when no backend fallback config exists
|
|
41
41
|
|
|
42
42
|
Host-specific files may include:
|
|
43
43
|
|
|
@@ -111,14 +111,14 @@ audit-code cleanup
|
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
`audit-code next-step` is the backend-rendered step engine used by the
|
|
114
|
-
conversation prompt. It writes `.audit-
|
|
115
|
-
`.audit-
|
|
114
|
+
conversation prompt. It writes `.audit-tools/audit/steps/current-step.json` and
|
|
115
|
+
`.audit-tools/audit/steps/current-prompt.md`, then the host should follow only
|
|
116
116
|
that prompt.
|
|
117
117
|
|
|
118
118
|
`audit-code validate` checks artifact shape, cross-artifact consistency,
|
|
119
119
|
session config, and explicit provider readiness.
|
|
120
120
|
|
|
121
|
-
`audit-code cleanup` removes the `.audit-
|
|
121
|
+
`audit-code cleanup` removes the `.audit-tools/audit/` directory when safe to
|
|
122
122
|
do so. It reads `audit_state.json` before acting: `complete` and `not_started`
|
|
123
123
|
states are deleted unconditionally; `active` and `blocked` states are refused
|
|
124
124
|
(the audit is resumable). If `audit_state.json` is missing — typically a
|
|
@@ -130,7 +130,7 @@ previews the action without deleting anything.
|
|
|
130
130
|
Backend fallback configuration lives at:
|
|
131
131
|
|
|
132
132
|
```text
|
|
133
|
-
.audit-
|
|
133
|
+
.audit-tools/audit/session-config.json
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
The canonical `/audit-code` conversation route should not require users to
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Product
|
|
2
2
|
|
|
3
|
-
> Normative definition: [`spec/audit-goals.md`](
|
|
3
|
+
> Normative definition: [`spec/audit-goals.md`](../../spec/audit/audit-goals.md) — product
|
|
4
4
|
> identity, invariants, deterministic/LLM boundaries, and completion. This page is
|
|
5
5
|
> the product overview.
|
|
6
6
|
|
package/opencode.json
CHANGED
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
"*audit-code.mjs* validate*": "allow",
|
|
53
53
|
"*audit-code.mjs": "allow",
|
|
54
54
|
"*audit-code.mjs* worker-run*": "allow",
|
|
55
|
-
"*node* *auditor-lambda*dist*index.js* worker-run*": "allow",
|
|
56
55
|
"git status*": "allow",
|
|
57
56
|
"git diff*": "allow",
|
|
58
57
|
"grep *": "allow",
|
|
@@ -106,7 +105,6 @@
|
|
|
106
105
|
"*audit-code.mjs* validate*": "allow",
|
|
107
106
|
"*audit-code.mjs": "allow",
|
|
108
107
|
"*audit-code.mjs* worker-run*": "allow",
|
|
109
|
-
"*node* *auditor-lambda*dist*index.js* worker-run*": "allow",
|
|
110
108
|
"git status*": "allow",
|
|
111
109
|
"git diff*": "allow",
|
|
112
110
|
"grep *": "allow",
|
package/package.json
CHANGED
|
@@ -98,7 +98,7 @@ The prompt payload in `audit-code.prompt.md` remains the canonical instruction a
|
|
|
98
98
|
The intended user setup is one global package install:
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
|
-
npm install -g
|
|
101
|
+
npm install -g audit-tools
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
That makes `audit-code` available on `PATH` and seeds user-level command/skill
|
|
@@ -132,12 +132,11 @@ audit-code
|
|
|
132
132
|
|
|
133
133
|
from the target repository root.
|
|
134
134
|
|
|
135
|
-
When developing `
|
|
136
|
-
`
|
|
137
|
-
monorepo root):
|
|
135
|
+
When developing `audit-tools` itself, prefer the local wrapper at
|
|
136
|
+
`audit-code.mjs` (at the repo root):
|
|
138
137
|
|
|
139
138
|
```bash
|
|
140
|
-
node
|
|
139
|
+
node audit-code.mjs # from the repo root
|
|
141
140
|
```
|
|
142
141
|
|
|
143
142
|
That keeps the run pinned to the local wrapper and local `dist/` output instead
|
|
@@ -17,12 +17,11 @@ First, make sure the repository has current local audit assets:
|
|
|
17
17
|
audit-code ensure --quiet
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
When developing `
|
|
21
|
-
`
|
|
22
|
-
monorepo root). From the monorepo root use:
|
|
20
|
+
When developing `audit-tools` itself, the entrypoint lives at
|
|
21
|
+
`audit-code.mjs` (at the repo root). From the repo root use:
|
|
23
22
|
|
|
24
23
|
```bash
|
|
25
|
-
node
|
|
24
|
+
node audit-code.mjs ensure --quiet
|
|
26
25
|
```
|
|
27
26
|
|
|
28
27
|
Then ask the backend for exactly one next step. This is also the **capability
|
|
@@ -64,10 +63,10 @@ lower it under rate-limit pressure. The backend's learned quota adapts from
|
|
|
64
63
|
there. The token values should match the window of the model(s) dispatching the
|
|
65
64
|
packets (e.g. 200000 / 32000 for a 200k-context model).
|
|
66
65
|
|
|
67
|
-
When developing `
|
|
66
|
+
When developing `audit-tools` itself, from the repo root use:
|
|
68
67
|
|
|
69
68
|
```bash
|
|
70
|
-
node
|
|
69
|
+
node audit-code.mjs next-step --host-max-active-subagents 4 --host-context-tokens 200000 --host-output-tokens 32000
|
|
71
70
|
```
|
|
72
71
|
|
|
73
72
|
Read the returned JSON only far enough to find `prompt_path`, then read and
|
|
@@ -51,7 +51,7 @@ instruction asset.
|
|
|
51
51
|
The intended user setup is one global package install:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
npm install -g
|
|
54
|
+
npm install -g audit-tools
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
That makes `remediate-code` available on `PATH` and seeds user-level
|
|
@@ -76,7 +76,7 @@ bootstrap.
|
|
|
76
76
|
|
|
77
77
|
## Repo-local fallback
|
|
78
78
|
|
|
79
|
-
When developing inside the `
|
|
79
|
+
When developing inside the `audit-tools` repository itself, prefer:
|
|
80
80
|
|
|
81
81
|
```bash
|
|
82
82
|
node remediate-code.mjs
|