project-athena 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +46 -4
  3. package/dist/{activity-P4UUFHWV.js → activity-BKW7G4I5.js} +4 -4
  4. package/dist/{agents-3HTSQGL2.js → agents-DFSNEOP5.js} +4 -4
  5. package/dist/{analyze-F3YOILNL.js → analyze-ZY3MXBOI.js} +7 -6
  6. package/dist/{chunk-PR53DT7I.js → chunk-3XSDI5WF.js} +5 -5
  7. package/dist/{chunk-S7T6VX56.js → chunk-7DZK6WSQ.js} +8 -4
  8. package/dist/{chunk-32PRS2MG.js → chunk-DZDI2HRT.js} +4 -4
  9. package/dist/{chunk-EF6GHOIN.js → chunk-FVCDMQUQ.js} +2 -2
  10. package/dist/{chunk-SJOOXO34.js → chunk-GGXPG6OE.js} +3 -3
  11. package/dist/{chunk-TGJUUB44.js → chunk-KHMBNT66.js} +4 -4
  12. package/dist/{chunk-PANVPNYF.js → chunk-MPG3IEGB.js} +37 -238
  13. package/dist/chunk-QCC4VJUH.js +217 -0
  14. package/dist/{chunk-JY6BFIJJ.js → chunk-QLW657NT.js} +2 -2
  15. package/dist/{chunk-XB66PZ6Z.js → chunk-RVTNSNGK.js} +2 -2
  16. package/dist/{chunk-LMOFZNTQ.js → chunk-SJ4DQFIJ.js} +2 -2
  17. package/dist/{chunk-PDFQ5BFG.js → chunk-SVTEJYMS.js} +4 -155
  18. package/dist/chunk-TDNZ2RYA.js +702 -0
  19. package/dist/chunk-UAZLPNVC.js +108 -0
  20. package/dist/chunk-WVQC2EGO.js +166 -0
  21. package/dist/{chunk-DOQMAZL5.js → chunk-XDCKZ5TV.js} +3 -3
  22. package/dist/{chunk-2RS6TA3D.js → chunk-YRIS7ZS6.js} +28 -17
  23. package/dist/{clean-S7PKCOLM.js → clean-MDBYH62P.js} +4 -4
  24. package/dist/cli.js +1 -1
  25. package/dist/{context-AH5MFHRG.js → context-PLPCAPCO.js} +23 -9
  26. package/dist/{doctor-RSJMLE2P.js → doctor-BX677KRE.js} +13 -6
  27. package/dist/{init-2V34DVRQ.js → init-WQCAOJ2R.js} +7 -6
  28. package/dist/{mcp-T2GRTEX5.js → mcp-U7EPH43L.js} +153 -15
  29. package/dist/memory-VSVNLEJC.js +393 -0
  30. package/dist/{open-2QSZKKUG.js → open-UJZRYF4E.js} +246 -55
  31. package/dist/{program-V2USHGXN.js → program-CWJNGCTZ.js} +37 -20
  32. package/dist/{review-R3R2J5BJ.js → review-OOKXSYMP.js} +10 -8
  33. package/dist/{security-PI4LXCOB.js → security-LME3XFL3.js} +6 -4
  34. package/dist/{staged-check-HHIBKKMR.js → staged-check-X24C3YRD.js} +9 -7
  35. package/dist/{status-6M73WX5I.js → status-RR57ZNGI.js} +8 -2
  36. package/dist/{sync-3ZNJDSSU.js → sync-KFJANRXF.js} +11 -9
  37. package/dist/{watch-USN5CQIV.js → watch-CY7QHIYN.js} +11 -9
  38. package/dist/web/assets/{Editor-BI56-HX5.js → Editor-Bnilgch0.js} +1 -1
  39. package/dist/web/assets/{abnfDiagram-O67JEVCF-y_9px2ob.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
  40. package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
  41. package/dist/web/assets/{architectureDiagram-NJMV4G6O-lB6fcVzU.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
  42. package/dist/web/assets/{blockDiagram-BEXU5L5S-DcM5pEjM.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
  43. package/dist/web/assets/{c4Diagram-YGBWAQC7-CJgqxTY2.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
  44. package/dist/web/assets/channel-Bkh05NKd.js +1 -0
  45. package/dist/web/assets/{chunk-3FUC2YCW-B8l_VuWR.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
  46. package/dist/web/assets/{chunk-5DYCD2WN-CZecgNhf.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
  47. package/dist/web/assets/{chunk-742MDFTN-BeZ7P5jB.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
  48. package/dist/web/assets/{chunk-7INBJB4K-IKy0pr5m.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
  49. package/dist/web/assets/{chunk-7M6MHVWA-Dg_QqJEX.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
  50. package/dist/web/assets/{chunk-7PRAP22T-DqQNS8oq.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
  51. package/dist/web/assets/{chunk-GTNCS2PH-x4sM51nJ.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
  52. package/dist/web/assets/{chunk-GWA4HPMP-CE5GcwVN.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
  53. package/dist/web/assets/{chunk-MBY4JIJT-DA_D1hjF.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
  54. package/dist/web/assets/{chunk-NETBCI7D-CeJ3XBZ2.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
  55. package/dist/web/assets/{chunk-O7XYJQB3-BH2gESvO.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
  56. package/dist/web/assets/{chunk-UA2S7LBM-BWr0xCux.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
  57. package/dist/web/assets/{chunk-WEXAMYUT-B4QwUZPM.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
  58. package/dist/web/assets/{chunk-Z7XXMR3K-BxcA-y5B.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
  59. package/dist/web/assets/{chunk-ZIGJFQKS-BZYvP63G.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
  60. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-BS3P_NXb.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
  61. package/dist/web/assets/{cynefin-OW5HDTMX-BALD4Pve.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
  62. package/dist/web/assets/{cynefinDiagram-VND7K2PF-BM2y4W6d.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
  63. package/dist/web/assets/{dagre-6A5THRUB-PTfOrIdF.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
  64. package/dist/web/assets/{diagram-22UHCM2B-CpXEHhUl.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
  65. package/dist/web/assets/{diagram-3UASUU5V-DPHfXzr6.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
  66. package/dist/web/assets/{diagram-ATOU4E4O-DMBNXvAC.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
  67. package/dist/web/assets/{diagram-CDSNMT55-CDLe1M7G.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
  68. package/dist/web/assets/{diagram-MLGK6HIB-D6L8oE7j.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
  69. package/dist/web/assets/{diagram-MPIPVDR6-CP-S7rrQ.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
  70. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CkUc63TK.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
  71. package/dist/web/assets/{elk-276RUBZZ-C1CAJLH_.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
  72. package/dist/web/assets/{erDiagram-OPXOYQCR-DXBnaTHm.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
  73. package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
  74. package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
  75. package/dist/web/assets/{ganttDiagram-FUAMR5RP-BVm8SiGg.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
  76. package/dist/web/assets/{gitGraph-4MIJSDKK-Dm7xBrW0.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
  77. package/dist/web/assets/{gitGraphDiagram-X574FWY7-D_PIKKhx.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
  78. package/dist/web/assets/{index-CeOIBpu2.js → index-Cen0jOXj.js} +5 -4
  79. package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
  80. package/dist/web/assets/{info-A6RAGUB7-CLGrx8pn.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
  81. package/dist/web/assets/{infoDiagram-VRGFBTTK-BlBjaKm7.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
  82. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Kxe7GGS3.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
  83. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-wCMoHK4M.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
  84. package/dist/web/assets/{kanban-definition-PNTS6WVX-BxdCz9Ko.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
  85. package/dist/web/assets/{line-Zf11FnWF.js → line-BERsMFG6.js} +1 -1
  86. package/dist/web/assets/{mermaid-parser.core-BvFFklev.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
  87. package/dist/web/assets/{mermaid.core-Cd_Ssti9.js → mermaid.core-DMsM3ZX7.js} +4 -4
  88. package/dist/web/assets/{mindmap-definition-NLK3R4M7-BGPQl-GY.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
  89. package/dist/web/assets/{packet-AYTQ26CC-6lI3cEX_.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
  90. package/dist/web/assets/{pegDiagram-GJSIUBJH-BPIjlSAj.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
  91. package/dist/web/assets/{pie-WAS4IAKB-D6Dzj3Ja.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
  92. package/dist/web/assets/{pieDiagram-5QR66LMP-DtA-vZmv.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
  93. package/dist/web/assets/{quadrantDiagram-O4NWA36T-EettyqQn.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
  94. package/dist/web/assets/{radar-RG4KPBEZ-xmRc3Dl8.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
  95. package/dist/web/assets/{railroad-74A4TZTK-BLB7dhOn.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
  96. package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
  97. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
  98. package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
  99. package/dist/web/assets/{railroadDiagram-XR7U4H2S-PBw4We6b.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
  100. package/dist/web/assets/{requirementDiagram-PLB6GJNP-DjQpaUFA.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
  101. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-CBW-_AoF.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
  102. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-DEoPYqY9.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
  103. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-UZq5rPud.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
  104. package/dist/web/assets/{swimlanes-2SLR337P-CACfuXJR.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
  105. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
  106. package/dist/web/assets/{timeline-definition-EJHVYXUP-CYJl7mP-.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
  107. package/dist/web/assets/{treeView-Q6P3EWNA-DtZ5nkPQ.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
  108. package/dist/web/assets/{treemap-WGGIJYW6-m49GDM-M.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
  109. package/dist/web/assets/{usecaseDiagram-POWQR4AR-C2Vg20UK.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
  110. package/dist/web/assets/{vennDiagram-UO4OBE2U-C07v5OGI.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
  111. package/dist/web/assets/{wardley-WFR3VGLG-C9Z7EZtz.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
  112. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DdA8CcSC.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
  113. package/dist/web/assets/{xychartDiagram-PMCCYNJV-C9EZw07b.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
  114. package/dist/web/index.html +2 -2
  115. package/package.json +1 -1
  116. package/dist/chunk-CXUTYCZX.js +0 -238
  117. package/dist/web/assets/architecture-7GRP2DOG-DyxkwYiW.js +0 -1
  118. package/dist/web/assets/channel-BvDD7AMO.js +0 -1
  119. package/dist/web/assets/eventmodeling-NTZA5JFV-cLIzvgDp.js +0 -1
  120. package/dist/web/assets/flowDiagram-KWPJA3E3-D7Zq63VQ.js +0 -1
  121. package/dist/web/assets/railroad-abnf-HS5TGJTU-DBFym6g8.js +0 -1
  122. package/dist/web/assets/railroad-ebnf-LZEXJU2U-CkG28ig8.js +0 -1
  123. package/dist/web/assets/railroad-peg-WCYAUIDC-Df_Ifaad.js +0 -1
  124. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CDSrqdgx.js +0 -8
@@ -16,6 +16,13 @@ import {
16
16
  import {
17
17
  gitInfo
18
18
  } from "./chunk-OLPSEQS5.js";
19
+ import {
20
+ ProjectModel,
21
+ detected,
22
+ emptyModel,
23
+ fact,
24
+ inferred
25
+ } from "./chunk-QCC4VJUH.js";
19
26
  import {
20
27
  ephemeralFingerprint,
21
28
  isSecretLikeName,
@@ -122,213 +129,6 @@ var envDetector = {
122
129
  import path5 from "path";
123
130
  import { promises as fs5 } from "fs";
124
131
 
125
- // src/core/model/project-model.ts
126
- import { z as z2 } from "zod";
127
-
128
- // src/core/model/fact.ts
129
- import { z } from "zod";
130
- var FactStatus = z.enum(["FACT", "DETECTED", "INFERRED", "UNKNOWN"]);
131
- var Confidence = z.enum(["high", "medium", "low"]);
132
- var FactSource = z.enum(["code", "config", "filesystem", "git", "developer", "ai"]);
133
- var Evidence = z.object({
134
- /** Repo-relative POSIX path. */
135
- file: z.string(),
136
- line: z.number().int().positive().optional(),
137
- detail: z.string().optional()
138
- });
139
- var Provenance = z.object({
140
- status: FactStatus,
141
- confidence: Confidence,
142
- source: FactSource,
143
- evidence: z.array(Evidence)
144
- });
145
- function detected(source, evidence, confidence = "high") {
146
- return { status: "DETECTED", confidence, source, evidence };
147
- }
148
- function inferred(source, evidence, confidence = "medium") {
149
- return { status: "INFERRED", confidence, source, evidence };
150
- }
151
- function fact(source, evidence) {
152
- return { status: "FACT", confidence: "high", source, evidence };
153
- }
154
-
155
- // src/core/model/project-model.ts
156
- var Named = z2.object({ name: z2.string(), provenance: Provenance });
157
- var Language = z2.object({
158
- name: z2.string(),
159
- files: z2.number().int(),
160
- bytes: z2.number().int()
161
- });
162
- var Framework = Named.extend({
163
- category: z2.enum(["frontend", "backend", "fullstack", "mobile", "desktop", "orm", "testing", "other"]),
164
- version: z2.string().optional(),
165
- /** Workspace package root (repo-relative) this belongs to; "." for root. */
166
- root: z2.string()
167
- });
168
- var Manifest = z2.object({
169
- path: z2.string(),
170
- ecosystem: z2.string(),
171
- name: z2.string().optional(),
172
- version: z2.string().optional(),
173
- dependencies: z2.array(z2.string()),
174
- devDependencies: z2.array(z2.string())
175
- });
176
- var WorkspacePackage = z2.object({
177
- name: z2.string(),
178
- path: z2.string(),
179
- kind: z2.enum(["app", "package", "root", "unknown"]),
180
- ecosystem: z2.string(),
181
- /** Names of other workspace packages this one depends on. */
182
- internalDependencies: z2.array(z2.string())
183
- });
184
- var Command = z2.object({
185
- name: z2.string(),
186
- command: z2.string(),
187
- source: z2.string(),
188
- purpose: z2.enum(["dev", "build", "test", "lint", "format", "start", "migrate", "deploy", "other"])
189
- });
190
- var Route = z2.object({
191
- method: z2.string(),
192
- path: z2.string(),
193
- framework: z2.string(),
194
- file: z2.string(),
195
- line: z2.number().int().optional(),
196
- provenance: Provenance
197
- });
198
- var DbEntity = z2.object({
199
- name: z2.string(),
200
- kind: z2.enum(["table", "model", "collection"]),
201
- fields: z2.array(z2.object({ name: z2.string(), type: z2.string().optional(), attributes: z2.array(z2.string()) })),
202
- indexes: z2.array(z2.string()),
203
- relations: z2.array(z2.string()),
204
- file: z2.string(),
205
- provenance: Provenance
206
- });
207
- var Database = Named.extend({ kind: z2.enum(["engine", "orm", "driver", "service"]) });
208
- var EnvVar = z2.object({
209
- name: z2.string(),
210
- /** Where the name was seen. Values are NEVER recorded. */
211
- references: z2.array(z2.string()),
212
- secretLike: z2.boolean()
213
- });
214
- var SecretFinding = z2.object({
215
- type: z2.string(),
216
- file: z2.string(),
217
- line: z2.number().int(),
218
- /**
219
- * Keyed fingerprint (HMAC with the machine-local salt in .athena/local.json, or a
220
- * per-process key) — allows dedup without storing the secret. Never a plain hash
221
- * of the value, and never written to committed files.
222
- */
223
- fingerprint: z2.string()
224
- });
225
- var CiJob = z2.object({ system: z2.string(), file: z2.string(), name: z2.string(), commands: z2.array(z2.string()) });
226
- var ContainerService = z2.object({
227
- name: z2.string(),
228
- image: z2.string().optional(),
229
- ports: z2.array(z2.string()),
230
- dependsOn: z2.array(z2.string()),
231
- file: z2.string()
232
- });
233
- var TestInfo = z2.object({
234
- frameworks: z2.array(Named),
235
- testFileCount: z2.number().int(),
236
- testDirs: z2.array(z2.string()),
237
- coverageConfigs: z2.array(z2.string()),
238
- /** Workspace packages that contain source files but zero detected test files (structural, not coverage). */
239
- packagesWithoutTests: z2.array(z2.string())
240
- });
241
- var GitInfo = z2.object({
242
- available: z2.boolean(),
243
- isRepo: z2.boolean(),
244
- branch: z2.string().optional(),
245
- head: z2.string().optional(),
246
- lastCommitDate: z2.string().optional(),
247
- contributorCount: z2.number().int().optional(),
248
- hotspots: z2.array(z2.object({ path: z2.string(), commits: z2.number().int() }))
249
- });
250
- var ProjectModel = z2.object({
251
- schemaVersion: z2.literal(1),
252
- name: z2.string(),
253
- description: z2.string().optional(),
254
- root: z2.string(),
255
- stats: z2.object({
256
- filesScanned: z2.number().int(),
257
- skippedBinary: z2.number().int(),
258
- skippedLarge: z2.number().int(),
259
- skippedUnreadable: z2.number().int()
260
- }),
261
- topLevelDirs: z2.array(z2.string()),
262
- languages: z2.array(Language),
263
- manifests: z2.array(Manifest),
264
- packageManagers: z2.array(Named),
265
- buildSystems: z2.array(Named),
266
- workspace: z2.object({
267
- isMonorepo: z2.boolean(),
268
- tool: z2.string().optional(),
269
- packages: z2.array(WorkspacePackage)
270
- }),
271
- frameworks: z2.array(Framework),
272
- entryPoints: z2.array(z2.object({ path: z2.string(), provenance: Provenance })),
273
- commands: z2.array(Command),
274
- databases: z2.array(Database),
275
- dbEntities: z2.array(DbEntity),
276
- migrations: z2.array(z2.object({ path: z2.string(), tool: z2.string(), count: z2.number().int() })),
277
- routes: z2.array(Route),
278
- apiSpecs: z2.array(z2.object({ path: z2.string(), kind: z2.enum(["openapi", "graphql", "grpc"]) })),
279
- auth: z2.array(Named.extend({ kind: z2.enum(["library", "provider", "hashing", "middleware", "token"]) })),
280
- containers: z2.object({ dockerfiles: z2.array(z2.object({ path: z2.string(), baseImages: z2.array(z2.string()), exposedPorts: z2.array(z2.string()) })), services: z2.array(ContainerService) }),
281
- infrastructure: z2.array(Named.extend({ kind: z2.string(), file: z2.string() })),
282
- ci: z2.array(CiJob),
283
- tests: TestInfo,
284
- env: z2.object({ vars: z2.array(EnvVar), envFilesPresent: z2.array(z2.string()) }),
285
- security: z2.object({
286
- secrets: z2.array(SecretFinding),
287
- tooling: z2.array(Named),
288
- /** Libraries/middleware relevant to web security controls (helmet, cors, csrf...). */
289
- controls: z2.array(Named)
290
- }),
291
- caching: z2.array(Named),
292
- queues: z2.array(Named),
293
- observability: z2.array(Named),
294
- git: GitInfo,
295
- warnings: z2.array(z2.string())
296
- });
297
- function emptyModel(name, root) {
298
- return {
299
- schemaVersion: 1,
300
- name,
301
- root,
302
- stats: { filesScanned: 0, skippedBinary: 0, skippedLarge: 0, skippedUnreadable: 0 },
303
- topLevelDirs: [],
304
- languages: [],
305
- manifests: [],
306
- packageManagers: [],
307
- buildSystems: [],
308
- workspace: { isMonorepo: false, packages: [] },
309
- frameworks: [],
310
- entryPoints: [],
311
- commands: [],
312
- databases: [],
313
- dbEntities: [],
314
- migrations: [],
315
- routes: [],
316
- apiSpecs: [],
317
- auth: [],
318
- containers: { dockerfiles: [], services: [] },
319
- infrastructure: [],
320
- ci: [],
321
- tests: { frameworks: [], testFileCount: 0, testDirs: [], coverageConfigs: [], packagesWithoutTests: [] },
322
- env: { vars: [], envFilesPresent: [] },
323
- security: { secrets: [], tooling: [], controls: [] },
324
- caching: [],
325
- queues: [],
326
- observability: [],
327
- git: { available: false, isRepo: false, hotspots: [] },
328
- warnings: []
329
- };
330
- }
331
-
332
132
  // src/core/analyzer/context.ts
333
133
  function createContext(root, config, files, model, source, signal) {
334
134
  const byPath = new Map(files.map((f) => [f.path, f]));
@@ -2790,54 +2590,54 @@ function redactDeep(value, memo = /* @__PURE__ */ new Map()) {
2790
2590
  }
2791
2591
 
2792
2592
  // src/core/model/security-scan.ts
2793
- import { z as z3 } from "zod";
2593
+ import { z } from "zod";
2794
2594
  import path6 from "path";
2795
2595
  var SCAN_FILE = "security-scan.json";
2796
2596
  var SEVERITIES = ["critical", "high", "moderate", "low", "unrated"];
2797
2597
  var SEVERITY_ORDER = [...SEVERITIES];
2798
2598
  var RATED_SEVERITIES = ["critical", "high", "moderate", "low"];
2799
2599
  var legacySeverity = (v) => v === "unknown" ? "unrated" : v;
2800
- var Severity = z3.preprocess(legacySeverity, z3.enum(SEVERITIES));
2801
- var Vulnerability = z3.object({
2802
- package: z3.string(),
2600
+ var Severity = z.preprocess(legacySeverity, z.enum(SEVERITIES));
2601
+ var Vulnerability = z.object({
2602
+ package: z.string(),
2803
2603
  severity: Severity,
2804
- title: z3.string(),
2805
- id: z3.string().optional(),
2806
- url: z3.string().optional(),
2807
- vulnerableRange: z3.string().optional(),
2808
- fixAvailable: z3.boolean().optional()
2604
+ title: z.string(),
2605
+ id: z.string().optional(),
2606
+ url: z.string().optional(),
2607
+ vulnerableRange: z.string().optional(),
2608
+ fixAvailable: z.boolean().optional()
2809
2609
  });
2810
- var ToolResult = z3.object({
2811
- tool: z3.string(),
2812
- ecosystem: z3.string(),
2610
+ var ToolResult = z.object({
2611
+ tool: z.string(),
2612
+ ecosystem: z.string(),
2813
2613
  /** What was audited when a tool runs once per input (e.g. a requirements file). */
2814
- target: z3.string().optional(),
2614
+ target: z.string().optional(),
2815
2615
  /** ok: ran and produced results · unavailable: not installed / nothing to audit · failed/timeout: ran but no usable output */
2816
- status: z3.enum(["ok", "unavailable", "failed", "timeout"]),
2817
- message: z3.string().optional(),
2818
- durationMs: z3.number(),
2819
- findings: z3.array(Vulnerability)
2616
+ status: z.enum(["ok", "unavailable", "failed", "timeout"]),
2617
+ message: z.string().optional(),
2618
+ durationMs: z.number(),
2619
+ findings: z.array(Vulnerability)
2820
2620
  });
2821
- var Counts = z3.preprocess(
2621
+ var Counts = z.preprocess(
2822
2622
  (v) => {
2823
2623
  if (!v || typeof v !== "object") return v;
2824
2624
  const { unknown, ...rest } = v;
2825
2625
  return { critical: 0, high: 0, moderate: 0, low: 0, unrated: 0, ...rest, ...typeof unknown === "number" ? { unrated: (rest.unrated ?? 0) + unknown } : {} };
2826
2626
  },
2827
- z3.object({ critical: z3.number(), high: z3.number(), moderate: z3.number(), low: z3.number(), unrated: z3.number() })
2627
+ z.object({ critical: z.number(), high: z.number(), moderate: z.number(), low: z.number(), unrated: z.number() })
2828
2628
  );
2829
- var SecurityScan = z3.object({
2830
- schemaVersion: z3.literal(1),
2831
- scannedAt: z3.string(),
2832
- durationMs: z3.number(),
2833
- tools: z3.array(ToolResult),
2629
+ var SecurityScan = z.object({
2630
+ schemaVersion: z.literal(1),
2631
+ scannedAt: z.string(),
2632
+ durationMs: z.number(),
2633
+ tools: z.array(ToolResult),
2834
2634
  counts: Counts,
2835
- secrets: z3.object({
2836
- count: z3.number(),
2837
- files: z3.array(z3.string()),
2635
+ secrets: z.object({
2636
+ count: z.number(),
2637
+ files: z.array(z.string()),
2838
2638
  /** Lines longer than 4096 chars on which generic keyword patterns were not applied. */
2839
- skippedLongLines: z3.number().optional(),
2840
- truncated: z3.boolean().optional()
2639
+ skippedLongLines: z.number().optional(),
2640
+ truncated: z.boolean().optional()
2841
2641
  })
2842
2642
  });
2843
2643
  var loadScan = (root) => loadScanFromDir(athenaDir(root));
@@ -2870,7 +2670,6 @@ function meetsThreshold(scan, level, opts = {}) {
2870
2670
  }
2871
2671
 
2872
2672
  export {
2873
- ProjectModel,
2874
2673
  readExclude,
2875
2674
  manifestDependencyNames,
2876
2675
  REAL_ENV_NAMES,
@@ -2889,4 +2688,4 @@ export {
2889
2688
  unratedFindings,
2890
2689
  meetsThreshold
2891
2690
  };
2892
- //# sourceMappingURL=chunk-PANVPNYF.js.map
2691
+ //# sourceMappingURL=chunk-MPG3IEGB.js.map
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/core/model/project-model.ts
4
+ import { z as z2 } from "zod";
5
+
6
+ // src/core/model/fact.ts
7
+ import { z } from "zod";
8
+ var FactStatus = z.enum(["FACT", "DETECTED", "INFERRED", "UNKNOWN"]);
9
+ var Confidence = z.enum(["high", "medium", "low"]);
10
+ var FactSource = z.enum(["code", "config", "filesystem", "git", "developer", "ai"]);
11
+ var Evidence = z.object({
12
+ /** Repo-relative POSIX path. */
13
+ file: z.string(),
14
+ line: z.number().int().positive().optional(),
15
+ detail: z.string().optional()
16
+ });
17
+ var Provenance = z.object({
18
+ status: FactStatus,
19
+ confidence: Confidence,
20
+ source: FactSource,
21
+ evidence: z.array(Evidence)
22
+ });
23
+ function detected(source, evidence, confidence = "high") {
24
+ return { status: "DETECTED", confidence, source, evidence };
25
+ }
26
+ function inferred(source, evidence, confidence = "medium") {
27
+ return { status: "INFERRED", confidence, source, evidence };
28
+ }
29
+ function fact(source, evidence) {
30
+ return { status: "FACT", confidence: "high", source, evidence };
31
+ }
32
+
33
+ // src/core/model/project-model.ts
34
+ var Named = z2.object({ name: z2.string(), provenance: Provenance });
35
+ var Language = z2.object({
36
+ name: z2.string(),
37
+ files: z2.number().int(),
38
+ bytes: z2.number().int()
39
+ });
40
+ var Framework = Named.extend({
41
+ category: z2.enum(["frontend", "backend", "fullstack", "mobile", "desktop", "orm", "testing", "other"]),
42
+ version: z2.string().optional(),
43
+ /** Workspace package root (repo-relative) this belongs to; "." for root. */
44
+ root: z2.string()
45
+ });
46
+ var Manifest = z2.object({
47
+ path: z2.string(),
48
+ ecosystem: z2.string(),
49
+ name: z2.string().optional(),
50
+ version: z2.string().optional(),
51
+ dependencies: z2.array(z2.string()),
52
+ devDependencies: z2.array(z2.string())
53
+ });
54
+ var WorkspacePackage = z2.object({
55
+ name: z2.string(),
56
+ path: z2.string(),
57
+ kind: z2.enum(["app", "package", "root", "unknown"]),
58
+ ecosystem: z2.string(),
59
+ /** Names of other workspace packages this one depends on. */
60
+ internalDependencies: z2.array(z2.string())
61
+ });
62
+ var Command = z2.object({
63
+ name: z2.string(),
64
+ command: z2.string(),
65
+ source: z2.string(),
66
+ purpose: z2.enum(["dev", "build", "test", "lint", "format", "start", "migrate", "deploy", "other"])
67
+ });
68
+ var Route = z2.object({
69
+ method: z2.string(),
70
+ path: z2.string(),
71
+ framework: z2.string(),
72
+ file: z2.string(),
73
+ line: z2.number().int().optional(),
74
+ provenance: Provenance
75
+ });
76
+ var DbEntity = z2.object({
77
+ name: z2.string(),
78
+ kind: z2.enum(["table", "model", "collection"]),
79
+ fields: z2.array(z2.object({ name: z2.string(), type: z2.string().optional(), attributes: z2.array(z2.string()) })),
80
+ indexes: z2.array(z2.string()),
81
+ relations: z2.array(z2.string()),
82
+ file: z2.string(),
83
+ provenance: Provenance
84
+ });
85
+ var Database = Named.extend({ kind: z2.enum(["engine", "orm", "driver", "service"]) });
86
+ var EnvVar = z2.object({
87
+ name: z2.string(),
88
+ /** Where the name was seen. Values are NEVER recorded. */
89
+ references: z2.array(z2.string()),
90
+ secretLike: z2.boolean()
91
+ });
92
+ var SecretFinding = z2.object({
93
+ type: z2.string(),
94
+ file: z2.string(),
95
+ line: z2.number().int(),
96
+ /**
97
+ * Keyed fingerprint (HMAC with the machine-local salt in .athena/local.json, or a
98
+ * per-process key) — allows dedup without storing the secret. Never a plain hash
99
+ * of the value, and never written to committed files.
100
+ */
101
+ fingerprint: z2.string()
102
+ });
103
+ var CiJob = z2.object({ system: z2.string(), file: z2.string(), name: z2.string(), commands: z2.array(z2.string()) });
104
+ var ContainerService = z2.object({
105
+ name: z2.string(),
106
+ image: z2.string().optional(),
107
+ ports: z2.array(z2.string()),
108
+ dependsOn: z2.array(z2.string()),
109
+ file: z2.string()
110
+ });
111
+ var TestInfo = z2.object({
112
+ frameworks: z2.array(Named),
113
+ testFileCount: z2.number().int(),
114
+ testDirs: z2.array(z2.string()),
115
+ coverageConfigs: z2.array(z2.string()),
116
+ /** Workspace packages that contain source files but zero detected test files (structural, not coverage). */
117
+ packagesWithoutTests: z2.array(z2.string())
118
+ });
119
+ var GitInfo = z2.object({
120
+ available: z2.boolean(),
121
+ isRepo: z2.boolean(),
122
+ branch: z2.string().optional(),
123
+ head: z2.string().optional(),
124
+ lastCommitDate: z2.string().optional(),
125
+ contributorCount: z2.number().int().optional(),
126
+ hotspots: z2.array(z2.object({ path: z2.string(), commits: z2.number().int() }))
127
+ });
128
+ var ProjectModel = z2.object({
129
+ schemaVersion: z2.literal(1),
130
+ name: z2.string(),
131
+ description: z2.string().optional(),
132
+ root: z2.string(),
133
+ stats: z2.object({
134
+ filesScanned: z2.number().int(),
135
+ skippedBinary: z2.number().int(),
136
+ skippedLarge: z2.number().int(),
137
+ skippedUnreadable: z2.number().int()
138
+ }),
139
+ topLevelDirs: z2.array(z2.string()),
140
+ languages: z2.array(Language),
141
+ manifests: z2.array(Manifest),
142
+ packageManagers: z2.array(Named),
143
+ buildSystems: z2.array(Named),
144
+ workspace: z2.object({
145
+ isMonorepo: z2.boolean(),
146
+ tool: z2.string().optional(),
147
+ packages: z2.array(WorkspacePackage)
148
+ }),
149
+ frameworks: z2.array(Framework),
150
+ entryPoints: z2.array(z2.object({ path: z2.string(), provenance: Provenance })),
151
+ commands: z2.array(Command),
152
+ databases: z2.array(Database),
153
+ dbEntities: z2.array(DbEntity),
154
+ migrations: z2.array(z2.object({ path: z2.string(), tool: z2.string(), count: z2.number().int() })),
155
+ routes: z2.array(Route),
156
+ apiSpecs: z2.array(z2.object({ path: z2.string(), kind: z2.enum(["openapi", "graphql", "grpc"]) })),
157
+ auth: z2.array(Named.extend({ kind: z2.enum(["library", "provider", "hashing", "middleware", "token"]) })),
158
+ containers: z2.object({ dockerfiles: z2.array(z2.object({ path: z2.string(), baseImages: z2.array(z2.string()), exposedPorts: z2.array(z2.string()) })), services: z2.array(ContainerService) }),
159
+ infrastructure: z2.array(Named.extend({ kind: z2.string(), file: z2.string() })),
160
+ ci: z2.array(CiJob),
161
+ tests: TestInfo,
162
+ env: z2.object({ vars: z2.array(EnvVar), envFilesPresent: z2.array(z2.string()) }),
163
+ security: z2.object({
164
+ secrets: z2.array(SecretFinding),
165
+ tooling: z2.array(Named),
166
+ /** Libraries/middleware relevant to web security controls (helmet, cors, csrf...). */
167
+ controls: z2.array(Named)
168
+ }),
169
+ caching: z2.array(Named),
170
+ queues: z2.array(Named),
171
+ observability: z2.array(Named),
172
+ git: GitInfo,
173
+ warnings: z2.array(z2.string())
174
+ });
175
+ function emptyModel(name, root) {
176
+ return {
177
+ schemaVersion: 1,
178
+ name,
179
+ root,
180
+ stats: { filesScanned: 0, skippedBinary: 0, skippedLarge: 0, skippedUnreadable: 0 },
181
+ topLevelDirs: [],
182
+ languages: [],
183
+ manifests: [],
184
+ packageManagers: [],
185
+ buildSystems: [],
186
+ workspace: { isMonorepo: false, packages: [] },
187
+ frameworks: [],
188
+ entryPoints: [],
189
+ commands: [],
190
+ databases: [],
191
+ dbEntities: [],
192
+ migrations: [],
193
+ routes: [],
194
+ apiSpecs: [],
195
+ auth: [],
196
+ containers: { dockerfiles: [], services: [] },
197
+ infrastructure: [],
198
+ ci: [],
199
+ tests: { frameworks: [], testFileCount: 0, testDirs: [], coverageConfigs: [], packagesWithoutTests: [] },
200
+ env: { vars: [], envFilesPresent: [] },
201
+ security: { secrets: [], tooling: [], controls: [] },
202
+ caching: [],
203
+ queues: [],
204
+ observability: [],
205
+ git: { available: false, isRepo: false, hotspots: [] },
206
+ warnings: []
207
+ };
208
+ }
209
+
210
+ export {
211
+ detected,
212
+ inferred,
213
+ fact,
214
+ ProjectModel,
215
+ emptyModel
216
+ };
217
+ //# sourceMappingURL=chunk-QCC4VJUH.js.map
@@ -7,7 +7,7 @@ import {
7
7
  ADAPTERS,
8
8
  applyChanges,
9
9
  resolveAdapters
10
- } from "./chunk-2RS6TA3D.js";
10
+ } from "./chunk-YRIS7ZS6.js";
11
11
  import {
12
12
  athenaDir,
13
13
  readState,
@@ -92,4 +92,4 @@ export {
92
92
  configureAgents,
93
93
  removeAgents
94
94
  };
95
- //# sourceMappingURL=chunk-JY6BFIJJ.js.map
95
+ //# sourceMappingURL=chunk-QLW657NT.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  planSnapshot,
4
4
  planSync
5
- } from "./chunk-TGJUUB44.js";
5
+ } from "./chunk-KHMBNT66.js";
6
6
 
7
7
  // src/services/scheduler.ts
8
8
  var DEFAULT_FULL_WALK_EVERY_MS = 5 * 6e4;
@@ -179,4 +179,4 @@ var AnalysisScheduler = class {
179
179
  export {
180
180
  AnalysisScheduler
181
181
  };
182
- //# sourceMappingURL=chunk-XB66PZ6Z.js.map
182
+ //# sourceMappingURL=chunk-RVTNSNGK.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  scanFilesForSecrets,
7
7
  secretFingerprinter
8
- } from "./chunk-PANVPNYF.js";
8
+ } from "./chunk-MPG3IEGB.js";
9
9
  import {
10
10
  walkProject
11
11
  } from "./chunk-ELKFRTZT.js";
@@ -376,4 +376,4 @@ async function scanProjectSecrets(root, files, signal) {
376
376
  export {
377
377
  runSecurityScan
378
378
  };
379
- //# sourceMappingURL=chunk-LMOFZNTQ.js.map
379
+ //# sourceMappingURL=chunk-SJ4DQFIJ.js.map