hex-audit 0.5.3 → 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.
Files changed (102) hide show
  1. package/README.md +22 -1
  2. package/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/app-build-manifest.json +30 -22
  4. package/dashboard/.next/app-path-routes-manifest.json +1 -1
  5. package/dashboard/.next/build-manifest.json +4 -4
  6. package/dashboard/.next/next-server.js.nft.json +1 -1
  7. package/dashboard/.next/prerender-manifest.js +1 -1
  8. package/dashboard/.next/prerender-manifest.json +1 -1
  9. package/dashboard/.next/required-server-files.json +1 -1
  10. package/dashboard/.next/routes-manifest.json +1 -1
  11. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/dashboard/.next/server/app/_not-found.html +1 -1
  13. package/dashboard/.next/server/app/_not-found.rsc +4 -4
  14. package/dashboard/.next/server/app/access/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/server/app/api/notes/done/route.js +1 -0
  16. package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -0
  17. package/dashboard/.next/server/app/api/notes/lead/route.js +1 -0
  18. package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -0
  19. package/dashboard/.next/server/app/api/notes/question/route.js +1 -0
  20. package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -0
  21. package/dashboard/.next/server/app/api/notes/record/route.js +9 -0
  22. package/dashboard/.next/server/app/api/notes/record/route.js.nft.json +1 -0
  23. package/dashboard/.next/server/app/api/notes/route.js +3 -0
  24. package/dashboard/.next/server/app/api/notes/route.js.nft.json +1 -0
  25. package/dashboard/.next/server/app/api/progress/route.js +1 -1
  26. package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +1 -1
  27. package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +1 -1
  28. package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +1 -1
  29. package/dashboard/.next/server/app/diagram.html +1 -1
  30. package/dashboard/.next/server/app/diagram.rsc +4 -4
  31. package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  32. package/dashboard/.next/server/app/flows.html +1 -1
  33. package/dashboard/.next/server/app/flows.rsc +4 -4
  34. package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +1 -1
  35. package/dashboard/.next/server/app/issues/page.js +4 -4
  36. package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
  37. package/dashboard/.next/server/app/notes/page.js +22 -0
  38. package/dashboard/.next/server/app/notes/page.js.nft.json +1 -0
  39. package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +1 -0
  40. package/dashboard/.next/server/app/overleaf/page_client-reference-manifest.js +1 -1
  41. package/dashboard/.next/server/app/page.js +2 -2
  42. package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  43. package/dashboard/.next/server/app/progress/page.js +1 -1
  44. package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +1 -1
  45. package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  46. package/dashboard/.next/server/app-paths-manifest.json +15 -9
  47. package/dashboard/.next/server/chunks/530.js +1 -1
  48. package/dashboard/.next/server/chunks/622.js +3 -0
  49. package/dashboard/.next/server/functions-config-manifest.json +1 -1
  50. package/dashboard/.next/server/middleware-build-manifest.js +1 -1
  51. package/dashboard/.next/server/pages/404.html +1 -1
  52. package/dashboard/.next/server/pages/500.html +1 -1
  53. package/dashboard/.next/server/server-reference-manifest.js +1 -1
  54. package/dashboard/.next/server/server-reference-manifest.json +1 -1
  55. package/dashboard/.next/static/chunks/app/issues/{page-abb062e4cf118340.js → page-72089090c04e96ee.js} +1 -1
  56. package/dashboard/.next/static/chunks/app/{layout-2c5383c11b1fbd97.js → layout-a95b696089e278c3.js} +1 -1
  57. package/dashboard/.next/static/chunks/app/notes/page-17af94c67ba79c00.js +1 -0
  58. package/dashboard/.next/static/chunks/app/page-24bac51dfe007c66.js +1 -0
  59. package/dashboard/.next/static/chunks/app/progress/page-427fb18da3afb061.js +1 -0
  60. package/dashboard/.next/static/chunks/{main-8f1e837090aef5cf.js → main-9a811c95265dbd11.js} +1 -1
  61. package/dashboard/.next/static/css/4a38d8f6f6b7a68f.css +3 -0
  62. package/dashboard/app/api/notes/done/route.ts +26 -0
  63. package/dashboard/app/api/notes/lead/route.ts +40 -0
  64. package/dashboard/app/api/notes/question/route.ts +30 -0
  65. package/dashboard/app/api/notes/record/route.ts +60 -0
  66. package/dashboard/app/api/notes/route.ts +25 -0
  67. package/dashboard/app/notes/NotesClient.tsx +701 -0
  68. package/dashboard/app/notes/page.tsx +47 -0
  69. package/dashboard/app/progress/ProgressClient.tsx +29 -8
  70. package/dashboard/app/progress/page.tsx +2 -0
  71. package/dashboard/components/DashboardLayout.tsx +22 -1
  72. package/dashboard/components/MarkdownRenderer.tsx +31 -0
  73. package/dashboard/next.config.mjs +11 -0
  74. package/dashboard/whisper-server.py +85 -0
  75. package/dist/commands/dashboard.d.ts.map +1 -1
  76. package/dist/commands/dashboard.js +23 -1
  77. package/dist/commands/dashboard.js.map +1 -1
  78. package/dist/commands/note.d.ts.map +1 -1
  79. package/dist/commands/note.js +55 -2
  80. package/dist/commands/note.js.map +1 -1
  81. package/dist/core/notes.d.ts +68 -0
  82. package/dist/core/notes.d.ts.map +1 -1
  83. package/dist/core/notes.js +167 -0
  84. package/dist/core/notes.js.map +1 -1
  85. package/dist/core/review.d.ts +14 -0
  86. package/dist/core/review.d.ts.map +1 -0
  87. package/dist/core/review.js +80 -0
  88. package/dist/core/review.js.map +1 -0
  89. package/dist/core/whisper.d.ts +8 -0
  90. package/dist/core/whisper.d.ts.map +1 -1
  91. package/dist/core/whisper.js +55 -0
  92. package/dist/core/whisper.js.map +1 -1
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/skills/diane.md +65 -36
  96. package/dist/skills/ingest-aa-report.md +4 -4
  97. package/package.json +2 -1
  98. package/dashboard/.next/static/chunks/app/page-1226422e170d8895.js +0 -1
  99. package/dashboard/.next/static/chunks/app/progress/page-f07ac39d1d27b480.js +0 -1
  100. package/dashboard/.next/static/css/691f4e9edab008c8.css +0 -3
  101. /package/dashboard/.next/static/{8MjKGPuSZw4OIpcHY4G0W → ZvCvC4cMbL3GR8kloB9OJ}/_buildManifest.js +0 -0
  102. /package/dashboard/.next/static/{8MjKGPuSZw4OIpcHY4G0W → ZvCvC4cMbL3GR8kloB9OJ}/_ssgManifest.js +0 -0
@@ -0,0 +1,47 @@
1
+ import { getOutputDirPath, readJsonFile } from '@/lib/data';
2
+ import { readNotesIndex, readNote, readContractNote, type ContractNote } from '../../../src/core/notes';
3
+ import { NotesClient } from './NotesClient';
4
+
5
+ // Read .hex/notes at request time (see app/stats/page.tsx for the rationale).
6
+ export const dynamic = 'force-dynamic';
7
+
8
+ interface PerContract {
9
+ contract: string;
10
+ type: string;
11
+ file: string;
12
+ }
13
+ interface Stats {
14
+ per_contract?: PerContract[];
15
+ }
16
+
17
+ export default function NotesPage() {
18
+ const dir = getOutputDirPath();
19
+ const index = readNotesIndex(dir);
20
+ const general = readNote(dir, 'general');
21
+
22
+ // Dropdown options: contracts in scope (from stats) ∪ contracts that already
23
+ // have notes, so the auditor can record against any contract immediately.
24
+ const stats = readJsonFile<Stats>('stats.json');
25
+ const scope = (stats?.per_contract ?? [])
26
+ .filter((c) => c.type === 'contract')
27
+ .map((c) => c.contract);
28
+ const options = Array.from(new Set([...scope, ...index.contracts])).sort();
29
+
30
+ // Load the structured note for each contract that has one (the index tracks
31
+ // every contract a note doc has been written for).
32
+ const contractNotes: ContractNote[] = index.contracts.map((name) => readContractNote(dir, name));
33
+ const unprocessed = index.sessions.filter((s) => !s.processed).length;
34
+
35
+ return (
36
+ <div>
37
+ <h2 className="mb-sp-5 text-title font-semibold text-text-primary">Notes</h2>
38
+ <NotesClient
39
+ general={general}
40
+ contractNotes={contractNotes}
41
+ contractOptions={options}
42
+ activeContract={index.active_contract}
43
+ unprocessedCount={unprocessed}
44
+ />
45
+ </div>
46
+ );
47
+ }
@@ -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) => reviewed[contractKey(c)]).reduce((s, c) => s + c.nsloc, 0),
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) => reviewed[contractKey(c)]).length,
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 = !!reviewed[contractKey(c)];
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 isChecked = !!reviewed[key];
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">{c.contract}</td>
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}
@@ -242,6 +242,24 @@ function IconFindings(p: React.SVGProps<SVGSVGElement>) {
242
242
  </svg>
243
243
  );
244
244
  }
245
+ function IconNotes(p: React.SVGProps<SVGSVGElement>) {
246
+ return (
247
+ <svg
248
+ {...p}
249
+ aria-hidden="true"
250
+ viewBox="0 0 24 24"
251
+ fill="none"
252
+ stroke="currentColor"
253
+ strokeWidth={1.5}
254
+ >
255
+ <path
256
+ strokeLinecap="round"
257
+ strokeLinejoin="round"
258
+ d="M16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"
259
+ />
260
+ </svg>
261
+ );
262
+ }
245
263
  function IconMenu(p: React.SVGProps<SVGSVGElement>) {
246
264
  return (
247
265
  <svg
@@ -317,7 +335,10 @@ const NAV_GROUPS = [
317
335
  },
318
336
  {
319
337
  label: 'Reasoning',
320
- items: [{ href: '/conformance', label: 'Spec Conformance', icon: IconSpec }],
338
+ items: [
339
+ { href: '/conformance', label: 'Spec Conformance', icon: IconSpec },
340
+ { href: '/notes', label: 'Notes', icon: IconNotes },
341
+ ],
321
342
  },
322
343
  {
323
344
  label: 'Visual',
@@ -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;AAQpC,eAAO,MAAM,gBAAgB,SA+EzB,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: { ...process.env, PORT: port },
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":"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"}
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;AAsJpC,eAAO,MAAM,WAAW,SAOC,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"}
@@ -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 (read / write / append / list / active / session)')
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":"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"}
1
+ {"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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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"}