hex-audit 0.5.4 → 0.5.5
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.md +22 -1
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/app-build-manifest.json +20 -20
- package/dashboard/.next/app-path-routes-manifest.json +1 -1
- package/dashboard/.next/build-manifest.json +4 -4
- package/dashboard/.next/next-server.js.nft.json +1 -1
- package/dashboard/.next/prerender-manifest.js +1 -1
- package/dashboard/.next/prerender-manifest.json +1 -1
- package/dashboard/.next/required-server-files.json +1 -1
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/_not-found.html +1 -1
- package/dashboard/.next/server/app/_not-found.rsc +1 -1
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/api/notes/done/route.js +1 -0
- package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/lead/route.js +1 -0
- package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/question/route.js +1 -0
- package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
- package/dashboard/.next/server/app/api/notes/route.js +2 -2
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/diagram.html +1 -1
- package/dashboard/.next/server/app/diagram.rsc +1 -1
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/flows.html +1 -1
- package/dashboard/.next/server/app/flows.rsc +1 -1
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/issues/page.js +4 -4
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/notes/page.js +3 -3
- package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/overleaf/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/page.js +2 -2
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/progress/page.js +1 -1
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app-paths-manifest.json +8 -5
- package/dashboard/.next/server/chunks/530.js +1 -1
- package/dashboard/.next/server/chunks/622.js +3 -0
- package/dashboard/.next/server/functions-config-manifest.json +1 -1
- package/dashboard/.next/server/middleware-build-manifest.js +1 -1
- package/dashboard/.next/server/pages/404.html +1 -1
- package/dashboard/.next/server/pages/500.html +1 -1
- package/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dashboard/.next/static/chunks/app/issues/{page-abb062e4cf118340.js → page-72089090c04e96ee.js} +1 -1
- package/dashboard/.next/static/chunks/app/notes/page-17af94c67ba79c00.js +1 -0
- package/dashboard/.next/static/chunks/app/page-24bac51dfe007c66.js +1 -0
- package/dashboard/.next/static/chunks/app/progress/page-427fb18da3afb061.js +1 -0
- package/dashboard/.next/static/chunks/{main-a6cc6e599cefa893.js → main-9a811c95265dbd11.js} +1 -1
- package/dashboard/.next/static/css/4a38d8f6f6b7a68f.css +3 -0
- package/dashboard/app/api/notes/done/route.ts +26 -0
- package/dashboard/app/api/notes/lead/route.ts +40 -0
- package/dashboard/app/api/notes/question/route.ts +30 -0
- package/dashboard/app/api/notes/record/route.ts +10 -2
- package/dashboard/app/notes/NotesClient.tsx +494 -77
- package/dashboard/app/notes/page.tsx +5 -2
- package/dashboard/app/progress/ProgressClient.tsx +29 -8
- package/dashboard/app/progress/page.tsx +2 -0
- package/dashboard/components/MarkdownRenderer.tsx +31 -0
- package/dashboard/next.config.mjs +11 -0
- package/dashboard/whisper-server.py +85 -0
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +23 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +55 -2
- package/dist/commands/note.js.map +1 -1
- package/dist/core/notes.d.ts +68 -0
- package/dist/core/notes.d.ts.map +1 -1
- package/dist/core/notes.js +167 -0
- package/dist/core/notes.js.map +1 -1
- package/dist/core/review.d.ts +14 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +80 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/whisper.d.ts +8 -0
- package/dist/core/whisper.d.ts.map +1 -1
- package/dist/core/whisper.js +55 -0
- package/dist/core/whisper.js.map +1 -1
- package/dist/skills/diane.md +48 -66
- package/dist/skills/ingest-aa-report.md +4 -4
- package/package.json +2 -1
- package/dashboard/.next/static/chunks/app/notes/page-bc458d3e1639c526.js +0 -1
- package/dashboard/.next/static/chunks/app/page-1226422e170d8895.js +0 -1
- package/dashboard/.next/static/chunks/app/progress/page-f07ac39d1d27b480.js +0 -1
- package/dashboard/.next/static/css/23b3f575e87bea75.css +0 -3
- /package/dashboard/.next/static/{JIjye0HUTWALF3gbtaZF8 → ZvCvC4cMbL3GR8kloB9OJ}/_buildManifest.js +0 -0
- /package/dashboard/.next/static/{JIjye0HUTWALF3gbtaZF8 → ZvCvC4cMbL3GR8kloB9OJ}/_ssgManifest.js +0 -0
|
@@ -15,6 +15,7 @@ export interface ProgressClientProps {
|
|
|
15
15
|
contracts: ContractInfo[];
|
|
16
16
|
totalsNsloc: number;
|
|
17
17
|
reviewedContracts: Record<string, boolean>;
|
|
18
|
+
dianeReviewed: Record<string, boolean>;
|
|
18
19
|
auditSteps: { label: string; completed: boolean }[];
|
|
19
20
|
findingsTotal: number;
|
|
20
21
|
findingsBySeverity: Record<string, number>;
|
|
@@ -72,6 +73,7 @@ export function ProgressClient({
|
|
|
72
73
|
contracts,
|
|
73
74
|
totalsNsloc,
|
|
74
75
|
reviewedContracts: initialReviewed,
|
|
76
|
+
dianeReviewed,
|
|
75
77
|
auditSteps,
|
|
76
78
|
findingsTotal,
|
|
77
79
|
findingsBySeverity,
|
|
@@ -80,16 +82,20 @@ export function ProgressClient({
|
|
|
80
82
|
const [reviewed, setReviewed] = useState<Record<string, boolean>>(initialReviewed);
|
|
81
83
|
const [checkFilter, setCheckFilter] = useState<CheckFilter>('all');
|
|
82
84
|
|
|
85
|
+
// A row counts as reviewed when the auditor manually checked it OR Diane's
|
|
86
|
+
// notes derived it as reviewed (done + no open leads + no unanswered Qs).
|
|
87
|
+
const isReviewed = (key: string) => !!reviewed[key] || !!dianeReviewed[key];
|
|
88
|
+
|
|
83
89
|
// ── Calculations ──
|
|
84
90
|
|
|
85
91
|
const reviewedNsloc = useMemo(
|
|
86
|
-
() => contracts.filter((c) =>
|
|
87
|
-
[contracts, reviewed],
|
|
92
|
+
() => contracts.filter((c) => isReviewed(contractKey(c))).reduce((s, c) => s + c.nsloc, 0),
|
|
93
|
+
[contracts, reviewed, dianeReviewed],
|
|
88
94
|
);
|
|
89
95
|
|
|
90
96
|
const reviewedCount = useMemo(
|
|
91
|
-
() => contracts.filter((c) =>
|
|
92
|
-
[contracts, reviewed],
|
|
97
|
+
() => contracts.filter((c) => isReviewed(contractKey(c))).length,
|
|
98
|
+
[contracts, reviewed, dianeReviewed],
|
|
93
99
|
);
|
|
94
100
|
|
|
95
101
|
const contractPct = totalsNsloc > 0 ? (reviewedNsloc / totalsNsloc) * 100 : 0;
|
|
@@ -109,10 +115,10 @@ export function ProgressClient({
|
|
|
109
115
|
});
|
|
110
116
|
if (checkFilter === 'all') return sorted;
|
|
111
117
|
return sorted.filter((c) => {
|
|
112
|
-
const isChecked =
|
|
118
|
+
const isChecked = isReviewed(contractKey(c));
|
|
113
119
|
return checkFilter === 'checked' ? isChecked : !isChecked;
|
|
114
120
|
});
|
|
115
|
-
}, [contracts, checkFilter, reviewed]);
|
|
121
|
+
}, [contracts, checkFilter, reviewed, dianeReviewed]);
|
|
116
122
|
|
|
117
123
|
const maxNsloc = useMemo(
|
|
118
124
|
() => Math.max(...contracts.map((c) => c.nsloc), 1),
|
|
@@ -271,7 +277,10 @@ export function ProgressClient({
|
|
|
271
277
|
<tbody className="divide-y divide-border-subtle">
|
|
272
278
|
{sortedContracts.map((c) => {
|
|
273
279
|
const key = contractKey(c);
|
|
274
|
-
const
|
|
280
|
+
const manualChecked = !!reviewed[key];
|
|
281
|
+
const autoReviewed = !!dianeReviewed[key];
|
|
282
|
+
const isChecked = manualChecked || autoReviewed;
|
|
283
|
+
const isAutoOnly = autoReviewed && !manualChecked;
|
|
275
284
|
const barWidth = (c.nsloc / maxNsloc) * 100;
|
|
276
285
|
return (
|
|
277
286
|
<tr
|
|
@@ -297,7 +306,19 @@ export function ProgressClient({
|
|
|
297
306
|
)}
|
|
298
307
|
</button>
|
|
299
308
|
</td>
|
|
300
|
-
<td className="px-sp-4 py-sp-2 font-medium text-text-primary">
|
|
309
|
+
<td className="px-sp-4 py-sp-2 font-medium text-text-primary">
|
|
310
|
+
<span className="inline-flex items-center gap-2">
|
|
311
|
+
{c.contract}
|
|
312
|
+
{isAutoOnly && (
|
|
313
|
+
<span
|
|
314
|
+
className="inline-flex items-center rounded-md bg-accent-subtle px-1.5 py-0.5 text-caption font-medium text-accent"
|
|
315
|
+
title="Auto-reviewed from Diane notes: done + no open leads + no unanswered questions"
|
|
316
|
+
>
|
|
317
|
+
auto
|
|
318
|
+
</span>
|
|
319
|
+
)}
|
|
320
|
+
</span>
|
|
321
|
+
</td>
|
|
301
322
|
<td className="max-w-[200px] truncate px-sp-4 py-sp-2 font-mono text-caption text-text-tertiary">
|
|
302
323
|
{c.file}
|
|
303
324
|
</td>
|
|
@@ -26,6 +26,7 @@ interface Stats {
|
|
|
26
26
|
interface ProgressData {
|
|
27
27
|
updated_at: string;
|
|
28
28
|
reviewed_contracts: Record<string, boolean>;
|
|
29
|
+
diane_reviewed?: Record<string, boolean>;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
interface Finding {
|
|
@@ -115,6 +116,7 @@ export default function ProgressPage() {
|
|
|
115
116
|
contracts={stats.per_contract}
|
|
116
117
|
totalsNsloc={stats.per_contract.reduce((s, c) => s + c.nsloc, 0)}
|
|
117
118
|
reviewedContracts={progress?.reviewed_contracts ?? {}}
|
|
119
|
+
dianeReviewed={progress?.diane_reviewed ?? {}}
|
|
118
120
|
auditSteps={auditSteps}
|
|
119
121
|
findingsTotal={allFindingIds.size}
|
|
120
122
|
findingsBySeverity={findingsBySeverity}
|
|
@@ -38,3 +38,34 @@ export function MarkdownRenderer({ content, className }: MarkdownRendererProps)
|
|
|
38
38
|
</div>
|
|
39
39
|
);
|
|
40
40
|
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Inline markdown for short strings inside the structured Notes UI (lead text,
|
|
44
|
+
* bullets, function fields, Q&A). Renders without a block <p> wrapper so it
|
|
45
|
+
* sits inline, and styles `code` / **bold** / links to match the design system.
|
|
46
|
+
*/
|
|
47
|
+
export function InlineMarkdown({ children }: { children: string }) {
|
|
48
|
+
return (
|
|
49
|
+
<ReactMarkdown
|
|
50
|
+
remarkPlugins={[remarkGfm]}
|
|
51
|
+
components={{
|
|
52
|
+
p: ({ children }) => <>{children}</>,
|
|
53
|
+
code: ({ children }) => (
|
|
54
|
+
<code className="rounded bg-surface-0 px-1 py-0.5 font-mono text-[0.85em] text-accent">
|
|
55
|
+
{children}
|
|
56
|
+
</code>
|
|
57
|
+
),
|
|
58
|
+
strong: ({ children }) => (
|
|
59
|
+
<strong className="font-semibold text-text-primary">{children}</strong>
|
|
60
|
+
),
|
|
61
|
+
a: ({ href, children }) => (
|
|
62
|
+
<a href={href} target="_blank" rel="noreferrer" className="text-accent hover:underline">
|
|
63
|
+
{children}
|
|
64
|
+
</a>
|
|
65
|
+
),
|
|
66
|
+
}}
|
|
67
|
+
>
|
|
68
|
+
{children}
|
|
69
|
+
</ReactMarkdown>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
@@ -8,6 +8,17 @@ const nextConfig = {
|
|
|
8
8
|
// builtins, so nothing heavy leaks into the bundle.
|
|
9
9
|
externalDir: true,
|
|
10
10
|
},
|
|
11
|
+
webpack(config) {
|
|
12
|
+
// Some externalDir core modules (e.g. src/core/review.ts) use TS-ESM
|
|
13
|
+
// `./sibling.js` import specifiers that resolve to `.ts` on disk. webpack's
|
|
14
|
+
// default resolver can't follow those, so teach it to try `.ts`/`.tsx`
|
|
15
|
+
// before `.js`. The fallback keeps real `.js` deps in node_modules working.
|
|
16
|
+
config.resolve.extensionAlias = {
|
|
17
|
+
...config.resolve.extensionAlias,
|
|
18
|
+
'.js': ['.ts', '.tsx', '.js'],
|
|
19
|
+
};
|
|
20
|
+
return config;
|
|
21
|
+
},
|
|
11
22
|
};
|
|
12
23
|
|
|
13
24
|
export default nextConfig;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Warm local Whisper server for Hex's Diane recordings.
|
|
3
|
+
|
|
4
|
+
Spawned by `hex dashboard` when faster-whisper is installed: loads the model
|
|
5
|
+
ONCE, then serves `POST /transcribe` (raw 16 kHz wav bytes -> {"text": ...}) on
|
|
6
|
+
127.0.0.1. The model stays resident only while the dashboard runs — `hex
|
|
7
|
+
dashboard` kills this process on exit, freeing the memory. Stdlib only (no
|
|
8
|
+
extra deps); transcription stays fully on-device.
|
|
9
|
+
|
|
10
|
+
Usage: whisper-server.py <port>
|
|
11
|
+
Env: HEX_WHISPER_MODEL_NAME (default "base")
|
|
12
|
+
"""
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
import tempfile
|
|
17
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
18
|
+
|
|
19
|
+
MODEL_NAME = os.environ.get("HEX_WHISPER_MODEL_NAME", "base")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def main() -> int:
|
|
23
|
+
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
|
|
24
|
+
try:
|
|
25
|
+
from faster_whisper import WhisperModel
|
|
26
|
+
except Exception as e: # noqa: BLE001 — any import failure means "no engine"
|
|
27
|
+
sys.stderr.write(f"hex-whisper: faster-whisper not available ({e})\n")
|
|
28
|
+
return 1
|
|
29
|
+
|
|
30
|
+
# Load once. CPU + int8 (matches the verified setup; no GPU dependency).
|
|
31
|
+
model = WhisperModel(MODEL_NAME, device="cpu", compute_type="int8")
|
|
32
|
+
|
|
33
|
+
class Handler(BaseHTTPRequestHandler):
|
|
34
|
+
def log_message(self, *_args): # silence per-request logging
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
def _json(self, code: int, payload: dict) -> None:
|
|
38
|
+
body = json.dumps(payload).encode("utf-8")
|
|
39
|
+
self.send_response(code)
|
|
40
|
+
self.send_header("Content-Type", "application/json")
|
|
41
|
+
self.send_header("Content-Length", str(len(body)))
|
|
42
|
+
self.end_headers()
|
|
43
|
+
self.wfile.write(body)
|
|
44
|
+
|
|
45
|
+
def do_GET(self):
|
|
46
|
+
if self.path == "/health":
|
|
47
|
+
self._json(200, {"ok": True, "model": MODEL_NAME})
|
|
48
|
+
else:
|
|
49
|
+
self._json(404, {"error": "not found"})
|
|
50
|
+
|
|
51
|
+
def do_POST(self):
|
|
52
|
+
if self.path != "/transcribe":
|
|
53
|
+
self._json(404, {"error": "not found"})
|
|
54
|
+
return
|
|
55
|
+
length = int(self.headers.get("Content-Length", 0))
|
|
56
|
+
data = self.rfile.read(length) if length else b""
|
|
57
|
+
tmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
|
|
58
|
+
try:
|
|
59
|
+
tmp.write(data)
|
|
60
|
+
tmp.close()
|
|
61
|
+
segments, _ = model.transcribe(tmp.name, language="en")
|
|
62
|
+
text = " ".join(s.text.strip() for s in segments).strip()
|
|
63
|
+
self._json(200, {"text": text})
|
|
64
|
+
except Exception as e: # noqa: BLE001
|
|
65
|
+
self._json(500, {"error": str(e)})
|
|
66
|
+
finally:
|
|
67
|
+
try:
|
|
68
|
+
os.unlink(tmp.name)
|
|
69
|
+
except OSError:
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
server = HTTPServer(("127.0.0.1", port), Handler)
|
|
73
|
+
sys.stderr.write(
|
|
74
|
+
f"hex-whisper: model '{MODEL_NAME}' loaded (cpu/int8), listening on 127.0.0.1:{port}\n"
|
|
75
|
+
)
|
|
76
|
+
sys.stderr.flush()
|
|
77
|
+
try:
|
|
78
|
+
server.serve_forever()
|
|
79
|
+
except KeyboardInterrupt:
|
|
80
|
+
pass
|
|
81
|
+
return 0
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
if __name__ == "__main__":
|
|
85
|
+
sys.exit(main())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,gBAAgB,SAoGzB,CAAC"}
|
|
@@ -5,6 +5,7 @@ import fs from 'node:fs';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { logger } from '../core/logger.js';
|
|
7
7
|
import { loadConfig, findOutputDir } from '../core/config.js';
|
|
8
|
+
import { detectWhisper } from '../core/whisper.js';
|
|
8
9
|
export const dashboardCommand = new Command('dashboard')
|
|
9
10
|
.description('Start the local dashboard and open it in the browser')
|
|
10
11
|
.option('--project <dir>', 'Project directory')
|
|
@@ -50,6 +51,23 @@ export const dashboardCommand = new Command('dashboard')
|
|
|
50
51
|
}
|
|
51
52
|
// Use the next binary that ships with this package.
|
|
52
53
|
const nextBin = resolveNextBin(dashboardDir);
|
|
54
|
+
// Warm Whisper: if faster-whisper is installed, run a persistent helper that
|
|
55
|
+
// loads the model once and serves transcription while the dashboard is up.
|
|
56
|
+
// It's killed on exit (see cleanup), so the model is freed the moment you
|
|
57
|
+
// close the dashboard — and never loaded more than once per session.
|
|
58
|
+
const nextEnv = { ...process.env, PORT: port };
|
|
59
|
+
let whisperChild = null;
|
|
60
|
+
const engine = detectWhisper();
|
|
61
|
+
if (engine?.kind === 'faster') {
|
|
62
|
+
const whisperPort = (parseInt(port, 10) || 3000) + 100;
|
|
63
|
+
whisperChild = spawn(engine.bin, [path.join(dashboardDir, 'whisper-server.py'), String(whisperPort)], {
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
cwd: projectDir,
|
|
66
|
+
env: { ...process.env },
|
|
67
|
+
});
|
|
68
|
+
nextEnv.HEX_WHISPER_URL = `http://127.0.0.1:${whisperPort}`;
|
|
69
|
+
logger.dim('Whisper model loading locally (CPU) — held only while the dashboard runs.');
|
|
70
|
+
}
|
|
53
71
|
// Set cwd to the audit project so the dashboard's data loaders find .hex/
|
|
54
72
|
// via process.cwd(). This replaces the old HEX_PROJECT_DIR env-var bridge,
|
|
55
73
|
// which was a vestige from the monorepo days when the dashboard was started
|
|
@@ -58,7 +76,7 @@ export const dashboardCommand = new Command('dashboard')
|
|
|
58
76
|
stdio: 'inherit',
|
|
59
77
|
shell: true,
|
|
60
78
|
cwd: projectDir,
|
|
61
|
-
env:
|
|
79
|
+
env: nextEnv,
|
|
62
80
|
});
|
|
63
81
|
if (opts.open !== false) {
|
|
64
82
|
setTimeout(() => {
|
|
@@ -66,11 +84,15 @@ export const dashboardCommand = new Command('dashboard')
|
|
|
66
84
|
}, 2000);
|
|
67
85
|
}
|
|
68
86
|
const cleanup = () => {
|
|
87
|
+
if (whisperChild)
|
|
88
|
+
whisperChild.kill('SIGTERM');
|
|
69
89
|
child.kill('SIGTERM');
|
|
70
90
|
};
|
|
71
91
|
process.on('SIGINT', cleanup);
|
|
72
92
|
process.on('SIGTERM', cleanup);
|
|
73
93
|
child.on('close', (code) => {
|
|
94
|
+
if (whisperChild)
|
|
95
|
+
whisperChild.kill('SIGTERM');
|
|
74
96
|
process.exit(code ?? 0);
|
|
75
97
|
});
|
|
76
98
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+MpC,eAAO,MAAM,WAAW,SAUC,CAAC"}
|
package/dist/commands/note.js
CHANGED
|
@@ -4,7 +4,8 @@ import path from 'node:path';
|
|
|
4
4
|
import { logger } from '../core/logger.js';
|
|
5
5
|
import { loadProjectContext } from '../core/config.js';
|
|
6
6
|
import { reportError } from '../core/errors.js';
|
|
7
|
-
import { readNote, writeNote, appendNote, readNotesIndex, setActiveContract, createSession, latestUnprocessedSession, markSessionProcessed, } from '../core/notes.js';
|
|
7
|
+
import { readNote, writeNote, appendNote, readNotesIndex, setActiveContract, createSession, latestUnprocessedSession, markSessionProcessed, readContractNote, writeContractNote, setMarkedDone, } from '../core/notes.js';
|
|
8
|
+
import { recomputeReview } from '../core/review.js';
|
|
8
9
|
function resolveOutputDir(opts) {
|
|
9
10
|
return loadProjectContext(opts.project ?? process.cwd()).outputDir;
|
|
10
11
|
}
|
|
@@ -80,6 +81,55 @@ const activeCmd = new Command('active')
|
|
|
80
81
|
process.exit(1);
|
|
81
82
|
}
|
|
82
83
|
});
|
|
84
|
+
// ─── structured contract note (Diane v2) ───────────────────────────
|
|
85
|
+
const showCmd = new Command('show')
|
|
86
|
+
.description("Print a contract's structured note (Leads / Description / Questions) as JSON")
|
|
87
|
+
.argument('<contract>', 'Contract name (e.g. Vault.sol)')
|
|
88
|
+
.option('--project <dir>', 'Project directory')
|
|
89
|
+
.action((contract, opts) => {
|
|
90
|
+
try {
|
|
91
|
+
console.log(JSON.stringify(readContractNote(resolveOutputDir(opts), contract), null, 2));
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
reportError(err);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const setCmd = new Command('set')
|
|
99
|
+
.description("Replace a contract's structured note from a JSON file (Diane's read-merge-write path)")
|
|
100
|
+
.argument('<contract>', 'Contract name (e.g. Vault.sol)')
|
|
101
|
+
.requiredOption('--json-file <path>', 'JSON file holding the full ContractNote')
|
|
102
|
+
.option('--project <dir>', 'Project directory')
|
|
103
|
+
.action((contract, opts) => {
|
|
104
|
+
try {
|
|
105
|
+
const outputDir = resolveOutputDir(opts);
|
|
106
|
+
const note = JSON.parse(fs.readFileSync(path.resolve(opts.jsonFile), 'utf-8'));
|
|
107
|
+
writeContractNote(outputDir, contract, note);
|
|
108
|
+
const reviewed = recomputeReview(outputDir, contract);
|
|
109
|
+
logger.success(`Saved note: ${contract}${reviewed ? ' (reviewed ✓)' : ''}`);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
reportError(err);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const doneCmd = new Command('done')
|
|
117
|
+
.description('Mark a contract as done reading (part of the auto-review rule); --undo to clear')
|
|
118
|
+
.argument('<contract>', 'Contract name (e.g. Vault.sol)')
|
|
119
|
+
.option('--undo', 'Clear the done flag')
|
|
120
|
+
.option('--project <dir>', 'Project directory')
|
|
121
|
+
.action((contract, opts) => {
|
|
122
|
+
try {
|
|
123
|
+
const outputDir = resolveOutputDir(opts);
|
|
124
|
+
setMarkedDone(outputDir, contract, !opts.undo);
|
|
125
|
+
const reviewed = recomputeReview(outputDir, contract);
|
|
126
|
+
logger.success(`${contract} marked ${opts.undo ? 'not done' : 'done'}${reviewed ? ' (reviewed ✓)' : ''}`);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
reportError(err);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
83
133
|
// ─── session subcommands ────────────────────────────────────────────
|
|
84
134
|
const sessionLatestCmd = new Command('latest')
|
|
85
135
|
.description('Print the latest unprocessed narration session (with transcript) as JSON, for /diane')
|
|
@@ -135,7 +185,10 @@ const sessionCmd = new Command('session')
|
|
|
135
185
|
.addCommand(sessionAddCmd)
|
|
136
186
|
.addCommand(sessionMarkCmd);
|
|
137
187
|
export const noteCommand = new Command('note')
|
|
138
|
-
.description('Read and write Diane audit notes (
|
|
188
|
+
.description('Read and write Diane audit notes (show / set / done / list / active / session)')
|
|
189
|
+
.addCommand(showCmd)
|
|
190
|
+
.addCommand(setCmd)
|
|
191
|
+
.addCommand(doneCmd)
|
|
139
192
|
.addCommand(readCmd)
|
|
140
193
|
.addCommand(writeCmd)
|
|
141
194
|
.addCommand(appendCmd)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"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"}
|
package/dist/core/notes.d.ts
CHANGED
|
@@ -59,4 +59,72 @@ export declare function createSession(outputDir: string, opts: {
|
|
|
59
59
|
transcript: string;
|
|
60
60
|
audio?: string;
|
|
61
61
|
}): SessionEntry;
|
|
62
|
+
export interface FnEntry {
|
|
63
|
+
/** Stable id derived from the function name. */
|
|
64
|
+
id: string;
|
|
65
|
+
/** Display signature, e.g. `deposit(assets, receiver) — external`. */
|
|
66
|
+
sig: string;
|
|
67
|
+
purpose?: string;
|
|
68
|
+
access?: string;
|
|
69
|
+
effects?: string;
|
|
70
|
+
notes: string[];
|
|
71
|
+
/** Pair-audit corrections, ideally `text (file:line)`. */
|
|
72
|
+
warnings: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface Question {
|
|
75
|
+
id: string;
|
|
76
|
+
q: string;
|
|
77
|
+
/** Open when absent/empty. */
|
|
78
|
+
answer?: string;
|
|
79
|
+
}
|
|
80
|
+
export type LeadStatus = 'open' | 'logged' | 'dismissed';
|
|
81
|
+
export interface Lead {
|
|
82
|
+
id: string;
|
|
83
|
+
text: string;
|
|
84
|
+
status: LeadStatus;
|
|
85
|
+
/** Issue id (e.g. H-007) when promoted to a finding. */
|
|
86
|
+
ref?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface ContractDescription {
|
|
89
|
+
purpose: string[];
|
|
90
|
+
inheritance: string[];
|
|
91
|
+
storage: string[];
|
|
92
|
+
roles: string[];
|
|
93
|
+
functions: FnEntry[];
|
|
94
|
+
}
|
|
95
|
+
export interface ContractNote {
|
|
96
|
+
contract: string;
|
|
97
|
+
/** Source file (e.g. `src/Vault.sol`) — used to map to the progress key. */
|
|
98
|
+
file?: string;
|
|
99
|
+
/** Explicit "done reading" signal; part of the auto-review rule. */
|
|
100
|
+
marked_done: boolean;
|
|
101
|
+
description: ContractDescription;
|
|
102
|
+
questions: Question[];
|
|
103
|
+
leads: Lead[];
|
|
104
|
+
updated_at: string;
|
|
105
|
+
}
|
|
106
|
+
/** Read a contract's structured note, returning an empty skeleton if absent. */
|
|
107
|
+
export declare function readContractNote(outputDir: string, contract: string): ContractNote;
|
|
108
|
+
/** Write a contract's structured note (stamps updated_at; tracks it in the index). */
|
|
109
|
+
export declare function writeContractNote(outputDir: string, contract: string, note: ContractNote): void;
|
|
110
|
+
export declare function setMarkedDone(outputDir: string, contract: string, done: boolean): ContractNote;
|
|
111
|
+
export declare function addLead(outputDir: string, contract: string, text: string): Lead;
|
|
112
|
+
/** Close a lead as promoted-to-finding (`logged`, with ref) or `dismissed`. */
|
|
113
|
+
export declare function closeLead(outputDir: string, contract: string, id: string, status: 'logged' | 'dismissed', ref?: string): ContractNote;
|
|
114
|
+
export declare function reopenLead(outputDir: string, contract: string, id: string): ContractNote;
|
|
115
|
+
export declare function addQuestion(outputDir: string, contract: string, q: string, answer?: string): Question;
|
|
116
|
+
export declare function answerQuestion(outputDir: string, contract: string, id: string, answer: string): ContractNote;
|
|
117
|
+
/** Insert or refine a function entry, matched by signature. Preserves source order. */
|
|
118
|
+
export declare function upsertFunction(outputDir: string, contract: string, fn: Partial<FnEntry> & {
|
|
119
|
+
sig: string;
|
|
120
|
+
}): ContractNote;
|
|
121
|
+
export type DescriptionField = 'purpose' | 'inheritance' | 'storage' | 'roles';
|
|
122
|
+
export declare function setDescriptionField(outputDir: string, contract: string, field: DescriptionField, values: string[]): ContractNote;
|
|
123
|
+
export interface ReviewState {
|
|
124
|
+
openLeads: number;
|
|
125
|
+
unansweredQuestions: number;
|
|
126
|
+
reviewed: boolean;
|
|
127
|
+
}
|
|
128
|
+
/** reviewed = marked_done AND no open leads AND no unanswered questions. */
|
|
129
|
+
export declare function reviewState(note: ContractNote): ReviewState;
|
|
62
130
|
//# sourceMappingURL=notes.d.ts.map
|
package/dist/core/notes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/core/notes.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,wEAAwE;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sCAAsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAeD,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlE;AAsBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAa5D;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAK1E;AAUD,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKvE;AAID;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,YAAY,CAcd;AAED,8EAA8E;AAC9E,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,GAChB,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAU1C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,YAAY,CAKd"}
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/core/notes.ts"],"names":[],"mappings":"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"}
|