project-athena 0.2.1 → 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 (152) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +61 -12
  3. package/dist/activity-BKW7G4I5.js +77 -0
  4. package/dist/agents-DFSNEOP5.js +69 -0
  5. package/dist/ai-ASL4FFQ7.js +96 -0
  6. package/dist/analyze-ZY3MXBOI.js +50 -0
  7. package/dist/chunk-2DY4PUR4.js +465 -0
  8. package/dist/chunk-2R6PXY6Z.js +33 -0
  9. package/dist/chunk-3IS2X2Z7.js +89 -0
  10. package/dist/chunk-3XSDI5WF.js +179 -0
  11. package/dist/chunk-65TSRDQ3.js +124 -0
  12. package/dist/chunk-673EPYYH.js +105 -0
  13. package/dist/chunk-7DZK6WSQ.js +65 -0
  14. package/dist/chunk-AD4OZCU2.js +34 -0
  15. package/dist/chunk-DZDI2HRT.js +169 -0
  16. package/dist/chunk-ELKFRTZT.js +221 -0
  17. package/dist/chunk-EUPETUWA.js +14 -0
  18. package/dist/chunk-FQEGEVLY.js +38 -0
  19. package/dist/chunk-FVCDMQUQ.js +343 -0
  20. package/dist/chunk-GGXPG6OE.js +904 -0
  21. package/dist/chunk-GHFRQAYT.js +112 -0
  22. package/dist/chunk-GR4DL2VM.js +47 -0
  23. package/dist/chunk-INT3IGMQ.js +111 -0
  24. package/dist/chunk-IQQBAWSM.js +90 -0
  25. package/dist/chunk-JCGDR4UV.js +182 -0
  26. package/dist/chunk-KBO7XRBW.js +26 -0
  27. package/dist/chunk-KHMBNT66.js +399 -0
  28. package/dist/chunk-LEMPCNAY.js +209 -0
  29. package/dist/chunk-MPG3IEGB.js +2691 -0
  30. package/dist/chunk-OLPSEQS5.js +264 -0
  31. package/dist/chunk-PVCIGUIT.js +64 -0
  32. package/dist/chunk-QCC4VJUH.js +217 -0
  33. package/dist/chunk-QLW657NT.js +95 -0
  34. package/dist/chunk-RVTNSNGK.js +182 -0
  35. package/dist/chunk-RXNRMIZP.js +390 -0
  36. package/dist/chunk-SHKXELUX.js +295 -0
  37. package/dist/chunk-SJ4DQFIJ.js +379 -0
  38. package/dist/chunk-SVTEJYMS.js +227 -0
  39. package/dist/chunk-TDNZ2RYA.js +702 -0
  40. package/dist/chunk-UAZLPNVC.js +108 -0
  41. package/dist/chunk-VSYBC3VY.js +28 -0
  42. package/dist/chunk-WVQC2EGO.js +166 -0
  43. package/dist/chunk-XDCKZ5TV.js +436 -0
  44. package/dist/chunk-XFN7UZCS.js +35 -0
  45. package/dist/chunk-XW3MLHI2.js +32 -0
  46. package/dist/chunk-YRIS7ZS6.js +919 -0
  47. package/dist/chunk-Z6QWMJLK.js +124 -0
  48. package/dist/chunk-ZB7LC6FP.js +221 -0
  49. package/dist/clean-MDBYH62P.js +23 -0
  50. package/dist/cli.js +18 -10716
  51. package/dist/context-PLPCAPCO.js +161 -0
  52. package/dist/doctor-BX677KRE.js +69 -0
  53. package/dist/event-TNT6CQZR.js +101 -0
  54. package/dist/git-hook-YZNZGAAP.js +252 -0
  55. package/dist/init-WQCAOJ2R.js +38 -0
  56. package/dist/mcp-U7EPH43L.js +393 -0
  57. package/dist/memory-VSVNLEJC.js +393 -0
  58. package/dist/open-UJZRYF4E.js +1450 -0
  59. package/dist/program-CWJNGCTZ.js +165 -0
  60. package/dist/review-OOKXSYMP.js +117 -0
  61. package/dist/rules-4FXJUCXB.js +83 -0
  62. package/dist/security-LME3XFL3.js +177 -0
  63. package/dist/staged-check-X24C3YRD.js +502 -0
  64. package/dist/status-RR57ZNGI.js +81 -0
  65. package/dist/sync-KFJANRXF.js +218 -0
  66. package/dist/watch-CY7QHIYN.js +123 -0
  67. package/dist/web/assets/{Editor-DAXvniWB.js → Editor-Bnilgch0.js} +1 -1
  68. package/dist/web/assets/{abnfDiagram-O67JEVCF-Az7EW1BC.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
  69. package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
  70. package/dist/web/assets/{architectureDiagram-NJMV4G6O-BxeXqSTn.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
  71. package/dist/web/assets/{blockDiagram-BEXU5L5S-aeKZl9lJ.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
  72. package/dist/web/assets/{c4Diagram-YGBWAQC7-CgmntYsG.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
  73. package/dist/web/assets/channel-Bkh05NKd.js +1 -0
  74. package/dist/web/assets/{chunk-3FUC2YCW-BpmRD2yo.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
  75. package/dist/web/assets/{chunk-5DYCD2WN-CRIFDwod.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
  76. package/dist/web/assets/{chunk-742MDFTN-hRW9VeNV.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
  77. package/dist/web/assets/{chunk-7INBJB4K-C6VEpT0Y.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
  78. package/dist/web/assets/{chunk-7M6MHVWA-Dnajov2w.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
  79. package/dist/web/assets/{chunk-7PRAP22T-DSAc0_CZ.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
  80. package/dist/web/assets/{chunk-GTNCS2PH-CefpYUjb.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
  81. package/dist/web/assets/{chunk-GWA4HPMP-MLNflMmF.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
  82. package/dist/web/assets/{chunk-MBY4JIJT-D3GmmEiU.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
  83. package/dist/web/assets/{chunk-NETBCI7D-DzTj6xVk.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
  84. package/dist/web/assets/{chunk-O7XYJQB3-D1d0hCko.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
  85. package/dist/web/assets/{chunk-UA2S7LBM-C9hIFeWR.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
  86. package/dist/web/assets/{chunk-WEXAMYUT-BFGtcjsi.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
  87. package/dist/web/assets/{chunk-Z7XXMR3K-BRZ8_wtE.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
  88. package/dist/web/assets/{chunk-ZIGJFQKS-CTKOioal.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
  89. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-DJGKtWJv.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
  90. package/dist/web/assets/{cynefin-OW5HDTMX-hNq1kGmA.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
  91. package/dist/web/assets/{cynefinDiagram-VND7K2PF-sODQM_ZZ.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
  92. package/dist/web/assets/{dagre-6A5THRUB-DEzTThIf.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
  93. package/dist/web/assets/{diagram-22UHCM2B-s_eellsa.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
  94. package/dist/web/assets/{diagram-3UASUU5V-B2onY_Xw.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
  95. package/dist/web/assets/{diagram-ATOU4E4O-B8V6s13s.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
  96. package/dist/web/assets/{diagram-CDSNMT55-CJxiE6mf.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
  97. package/dist/web/assets/{diagram-MLGK6HIB-m5OHPLAp.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
  98. package/dist/web/assets/{diagram-MPIPVDR6-Buvvrk_A.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
  99. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CpL7Wt3R.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
  100. package/dist/web/assets/{elk-276RUBZZ-CwYhbsXa.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
  101. package/dist/web/assets/{erDiagram-OPXOYQCR-DNikci2r.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
  102. package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
  103. package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
  104. package/dist/web/assets/{ganttDiagram-FUAMR5RP-d-ynDlvJ.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
  105. package/dist/web/assets/{gitGraph-4MIJSDKK-DwIeBI91.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
  106. package/dist/web/assets/{gitGraphDiagram-X574FWY7-04RZccu6.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
  107. package/dist/web/assets/{index-C3-8uYXr.js → index-Cen0jOXj.js} +5 -4
  108. package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
  109. package/dist/web/assets/{info-A6RAGUB7-xf4Nzgv-.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
  110. package/dist/web/assets/{infoDiagram-VRGFBTTK-BYjw0eiK.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
  111. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Bx9s4nPM.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
  112. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-DrdHs7B-.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
  113. package/dist/web/assets/{kanban-definition-PNTS6WVX-CVd8v2Te.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
  114. package/dist/web/assets/{line-V_WrJ-6y.js → line-BERsMFG6.js} +1 -1
  115. package/dist/web/assets/{mermaid-parser.core-B-ilyEpO.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
  116. package/dist/web/assets/{mermaid.core-Bnyaa0nF.js → mermaid.core-DMsM3ZX7.js} +4 -4
  117. package/dist/web/assets/{mindmap-definition-NLK3R4M7-B3AbvHPR.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
  118. package/dist/web/assets/{packet-AYTQ26CC-CBAIUXIc.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
  119. package/dist/web/assets/{pegDiagram-GJSIUBJH-DIdeELUM.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
  120. package/dist/web/assets/{pie-WAS4IAKB-a1r3tzPR.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
  121. package/dist/web/assets/{pieDiagram-5QR66LMP-pQBEio0x.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
  122. package/dist/web/assets/{quadrantDiagram-O4NWA36T-CkJK5Y03.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
  123. package/dist/web/assets/{radar-RG4KPBEZ-BZfLYjx5.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
  124. package/dist/web/assets/{railroad-74A4TZTK-CuIW1ZAU.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
  125. package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
  126. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
  127. package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
  128. package/dist/web/assets/{railroadDiagram-XR7U4H2S-_BpGE8aJ.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
  129. package/dist/web/assets/{requirementDiagram-PLB6GJNP-CnzF90GS.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
  130. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-DYeisDj_.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
  131. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-ll9cBvca.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
  132. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-CdKcOIKQ.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
  133. package/dist/web/assets/{swimlanes-2SLR337P-y6piTWEW.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
  134. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
  135. package/dist/web/assets/{timeline-definition-EJHVYXUP-DuC_4xK0.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
  136. package/dist/web/assets/{treeView-Q6P3EWNA-gCQFmND0.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
  137. package/dist/web/assets/{treemap-WGGIJYW6-BQ2010OY.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
  138. package/dist/web/assets/{usecaseDiagram-POWQR4AR-CCTqzHz6.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
  139. package/dist/web/assets/{vennDiagram-UO4OBE2U-0_O7guNq.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
  140. package/dist/web/assets/{wardley-WFR3VGLG-SsX7uMDs.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
  141. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DlqH6Hox.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
  142. package/dist/web/assets/{xychartDiagram-PMCCYNJV-nr4UYDtd.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
  143. package/dist/web/index.html +2 -2
  144. package/package.json +4 -2
  145. package/dist/web/assets/architecture-7GRP2DOG-blXBarB2.js +0 -1
  146. package/dist/web/assets/channel-f4QzewnN.js +0 -1
  147. package/dist/web/assets/eventmodeling-NTZA5JFV-CA_ZFPZ2.js +0 -1
  148. package/dist/web/assets/flowDiagram-KWPJA3E3-DObsBuWT.js +0 -1
  149. package/dist/web/assets/railroad-abnf-HS5TGJTU-6B4Ffbxn.js +0 -1
  150. package/dist/web/assets/railroad-ebnf-LZEXJU2U-BGL9lIQc.js +0 -1
  151. package/dist/web/assets/railroad-peg-WCYAUIDC-DcqxTem7.js +0 -1
  152. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-DFS8a3jO.js +0 -8
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/ui/term.ts
4
+ import pc from "picocolors";
5
+ var out = process.stdout;
6
+ var isTTY = Boolean(out.isTTY) && process.env.TERM !== "dumb" && !process.env.CI;
7
+ var unicode = process.platform !== "win32" || Boolean(process.env.WT_SESSION) || process.env.TERM_PROGRAM === "vscode" || Boolean(process.env.TERMINAL_EMULATOR);
8
+ var sym = {
9
+ ok: unicode ? "\u2713" : "\u221A",
10
+ warn: unicode ? "\u26A0" : "!",
11
+ err: unicode ? "\u2717" : "\xD7",
12
+ info: unicode ? "\u2022" : "*",
13
+ dot: unicode ? "\u25CF" : "*",
14
+ ring: unicode ? "\u25CB" : "o",
15
+ arrow: unicode ? "\u2192" : "->"
16
+ };
17
+ var c = pc;
18
+ var quiet = false;
19
+ var jsonMode = false;
20
+ function setOutputMode(opts) {
21
+ quiet = Boolean(opts.quiet);
22
+ jsonMode = Boolean(opts.json);
23
+ }
24
+ var isJson = () => jsonMode;
25
+ var isQuiet = () => quiet;
26
+ var interruptMessage = "No partial knowledge was written.";
27
+ var setInterruptMessage = (m) => interruptMessage = m;
28
+ var getInterruptMessage = () => interruptMessage;
29
+ function line(s = "") {
30
+ if (jsonMode) return;
31
+ out.write(`${s}
32
+ `);
33
+ }
34
+ function info(s) {
35
+ if (!quiet) line(s);
36
+ }
37
+ var ok = (s) => line(`${c.green(sym.ok)} ${s}`);
38
+ var warn = (s) => line(`${c.yellow(sym.warn)} ${s}`);
39
+ var fail = (s) => line(`${c.red(sym.err)} ${s}`);
40
+ var bullet = (s) => line(`${c.dim(sym.info)} ${s}`);
41
+ var heading = (s) => line(c.bold(s));
42
+ var dim = (s) => c.dim(s);
43
+ function json(value) {
44
+ out.write(`${JSON.stringify(value, null, 2)}
45
+ `);
46
+ }
47
+ var FRAMES = unicode ? ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"] : ["-", "\\", "|", "/"];
48
+ function spinner(text) {
49
+ let current = text;
50
+ let timer = null;
51
+ let frame = 0;
52
+ const clear = () => {
53
+ if (isTTY) out.write("\r\x1B[2K");
54
+ };
55
+ const done = (symbol, msg, suppressible = false) => {
56
+ const wasSpinning = timer !== null;
57
+ if (timer) clearInterval(timer);
58
+ timer = null;
59
+ if (jsonMode) return;
60
+ if (wasSpinning) {
61
+ clear();
62
+ out.write("\x1B[?25h");
63
+ }
64
+ if (!(suppressible && quiet)) line(`${symbol} ${msg ?? current}`);
65
+ };
66
+ if (!jsonMode && !quiet && isTTY) {
67
+ out.write("\x1B[?25l");
68
+ timer = setInterval(() => {
69
+ clear();
70
+ out.write(`${c.cyan(FRAMES[frame = (frame + 1) % FRAMES.length])} ${current}`);
71
+ }, 80);
72
+ timer.unref();
73
+ }
74
+ return {
75
+ update(t) {
76
+ current = t;
77
+ },
78
+ succeed: (msg) => done(c.green(sym.ok), msg, true),
79
+ warn: (msg) => done(c.yellow(sym.warn), msg),
80
+ fail: (msg) => done(c.red(sym.err), msg),
81
+ stop() {
82
+ if (!timer) return;
83
+ clearInterval(timer);
84
+ timer = null;
85
+ clear();
86
+ out.write("\x1B[?25h");
87
+ }
88
+ };
89
+ }
90
+ function relativeTime(iso) {
91
+ const ms = Date.now() - Date.parse(iso);
92
+ if (Number.isNaN(ms)) return "unknown";
93
+ const s = Math.round(ms / 1e3);
94
+ if (s < 60) return `${s}s ago`;
95
+ const m = Math.round(s / 60);
96
+ if (m < 60) return `${m} min ago`;
97
+ const h = Math.round(m / 60);
98
+ if (h < 48) return `${h} h ago`;
99
+ return `${Math.round(h / 24)} days ago`;
100
+ }
101
+
102
+ export {
103
+ isTTY,
104
+ unicode,
105
+ sym,
106
+ c,
107
+ setOutputMode,
108
+ isJson,
109
+ isQuiet,
110
+ setInterruptMessage,
111
+ getInterruptMessage,
112
+ line,
113
+ info,
114
+ ok,
115
+ warn,
116
+ fail,
117
+ bullet,
118
+ heading,
119
+ dim,
120
+ json,
121
+ spinner,
122
+ relativeTime
123
+ };
124
+ //# sourceMappingURL=chunk-Z6QWMJLK.js.map
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ impactOf
4
+ } from "./chunk-GR4DL2VM.js";
5
+ import {
6
+ IgnoreMatcher,
7
+ factsConfigHash,
8
+ mapLimit,
9
+ statEntry,
10
+ walkProject
11
+ } from "./chunk-ELKFRTZT.js";
12
+ import {
13
+ git,
14
+ statusV2,
15
+ workingChanges
16
+ } from "./chunk-OLPSEQS5.js";
17
+ import {
18
+ isBlockModified,
19
+ parseBlocks
20
+ } from "./chunk-673EPYYH.js";
21
+ import {
22
+ KNOWLEDGE_DOCS
23
+ } from "./chunk-FQEGEVLY.js";
24
+ import {
25
+ CACHE_DIR,
26
+ RACY_WINDOW_MS,
27
+ athenaDir,
28
+ buildFileIndex,
29
+ diffFileIndex,
30
+ fileIndexPath,
31
+ loadConfig,
32
+ readFileIndex,
33
+ readState,
34
+ sameHash
35
+ } from "./chunk-2DY4PUR4.js";
36
+ import {
37
+ readTextIfExists
38
+ } from "./chunk-IQQBAWSM.js";
39
+ import {
40
+ AthenaError
41
+ } from "./chunk-AD4OZCU2.js";
42
+ import {
43
+ ATHENA_DIR
44
+ } from "./chunk-EUPETUWA.js";
45
+
46
+ // src/services/status.ts
47
+ import path2 from "path";
48
+
49
+ // src/services/status-fast.ts
50
+ import { promises as fs, readFileSync, statSync } from "fs";
51
+ import path from "path";
52
+ async function sameFactsConfig(root, config) {
53
+ try {
54
+ const v = JSON.parse(await fs.readFile(path.join(root, ATHENA_DIR, CACHE_DIR, "facts", "version.json"), "utf8"));
55
+ return v.config === factsConfigHash(config);
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+ var byPath = (a, b) => a < b ? -1 : a > b ? 1 : 0;
61
+ var mtimeOf = (p) => statSync(p, { throwIfNoEntry: false })?.mtimeMs ?? null;
62
+ async function fastIndexChanges(root, config, prevIndex, signal) {
63
+ const indexPaths = Object.keys(prevIndex);
64
+ if (!indexPaths.length || config.include.length) return null;
65
+ if (!statSync(path.join(root, ".git"), { throwIfNoEntry: false })?.isDirectory()) return null;
66
+ const indexMtime = mtimeOf(fileIndexPath(path.join(root, ATHENA_DIR)));
67
+ if (indexMtime === null) return null;
68
+ const excludeFile = path.join(root, ".git", "info", "exclude");
69
+ const excludeMtime = mtimeOf(excludeFile);
70
+ if (excludeMtime !== null && excludeMtime > indexMtime) return null;
71
+ const configMtime = mtimeOf(path.join(root, ATHENA_DIR, "config.json"));
72
+ if (configMtime !== null && configMtime > indexMtime - RACY_WINDOW_MS) {
73
+ if (configMtime > indexMtime || !await sameFactsConfig(root, config)) return null;
74
+ }
75
+ const hasExclude = excludeMtime !== null;
76
+ const gitCalls = Promise.all([
77
+ statusV2(root, { signal }),
78
+ git(root, ["ls-files", "-z", "-s", "--", "."], { signal }),
79
+ git(root, ["ls-files", "-z", "-o", "--exclude-per-directory=.gitignore", ...hasExclude ? ["--exclude-from=.git/info/exclude"] : [], "--", "."], { signal })
80
+ ]);
81
+ const diff = { added: [], modified: [], deleted: [] };
82
+ const recheck = [];
83
+ for (const rel of indexPaths) {
84
+ const prev = prevIndex[rel];
85
+ const st = statSync(path.join(root, rel), { throwIfNoEntry: false });
86
+ if (!st?.isFile()) {
87
+ diff.deleted.push(rel);
88
+ continue;
89
+ }
90
+ const large = st.size > config.maxFileBytes;
91
+ if (prev.s === st.size && prev.m === Math.floor(st.mtimeMs) && prev.h.startsWith("meta:") === large) continue;
92
+ recheck.push(rel);
93
+ }
94
+ signal?.throwIfAborted();
95
+ const rechecked = await mapLimit(recheck, 32, (rel) => statEntry(root, rel, config.maxFileBytes));
96
+ rechecked.forEach((e, i) => {
97
+ const rel = recheck[i];
98
+ if (!e) diff.deleted.push(rel);
99
+ else if (!sameHash(prevIndex[rel].h, e.hash)) diff.modified.push(rel);
100
+ });
101
+ const [status, tracked, untracked] = await gitCalls;
102
+ signal?.throwIfAborted();
103
+ if (!status || !tracked.ok || !untracked.ok) return null;
104
+ if (status.some((e) => e.submodule)) return null;
105
+ const uncommitted = status.filter((e) => e.kind !== "!" && !e.path.startsWith(`${ATHENA_DIR}/`)).length;
106
+ const candidates = /* @__PURE__ */ new Set();
107
+ for (const rec of tracked.stdout.split("\0")) {
108
+ if (!rec) continue;
109
+ const tab = rec.indexOf(" ");
110
+ const mode = rec.slice(0, rec.indexOf(" "));
111
+ const rel = rec.slice(tab + 1);
112
+ if (mode === "160000") return null;
113
+ if (mode === "120000" && statSync(path.join(root, rel), { throwIfNoEntry: false })?.isDirectory()) return null;
114
+ if (!Object.hasOwn(prevIndex, rel)) candidates.add(rel);
115
+ }
116
+ for (const rel of untracked.stdout.split("\0")) {
117
+ if (!rel) continue;
118
+ if (rel.endsWith("/")) return null;
119
+ if (!Object.hasOwn(prevIndex, rel)) candidates.add(rel);
120
+ }
121
+ const matcher = await IgnoreMatcher.load(root, config);
122
+ const loaded = /* @__PURE__ */ new Set();
123
+ const ignored = (rel) => {
124
+ for (let i = rel.indexOf("/"); i > 0; i = rel.indexOf("/", i + 1)) {
125
+ const dir = rel.slice(0, i);
126
+ if (matcher.ignores(dir, true)) return true;
127
+ if (!loaded.has(dir)) {
128
+ loaded.add(dir);
129
+ try {
130
+ matcher.setGitignore(dir, readFileSync(path.join(root, dir, ".gitignore"), "utf8"));
131
+ } catch {
132
+ }
133
+ }
134
+ }
135
+ return matcher.ignores(rel, false);
136
+ };
137
+ const toAdd = [];
138
+ for (const rel of candidates) {
139
+ if (ignored(rel)) continue;
140
+ let st;
141
+ try {
142
+ st = await fs.lstat(path.join(root, rel));
143
+ } catch {
144
+ continue;
145
+ }
146
+ if (st.isSymbolicLink()) {
147
+ const target = await fs.realpath(path.join(root, rel)).catch(() => null);
148
+ if (!target) continue;
149
+ const relTarget = path.relative(await fs.realpath(root), target);
150
+ if (relTarget.startsWith("..") || path.isAbsolute(relTarget)) continue;
151
+ const tst = await fs.stat(target).catch(() => null);
152
+ if (tst?.isDirectory()) return null;
153
+ if (!tst?.isFile()) continue;
154
+ } else if (!st.isFile()) continue;
155
+ toAdd.push(rel);
156
+ }
157
+ const added = await mapLimit(toAdd, 32, (rel) => statEntry(root, rel, config.maxFileBytes));
158
+ added.forEach((e, i) => {
159
+ if (e) diff.added.push(toAdd[i]);
160
+ });
161
+ if ([...diff.added, ...diff.modified, ...diff.deleted].some((p) => p === ".gitignore" || p.endsWith("/.gitignore"))) return null;
162
+ if (indexPaths.length - diff.deleted.length + diff.added.length > config.maxFiles) return null;
163
+ diff.added.sort(byPath);
164
+ diff.modified.sort(byPath);
165
+ const deleted = new Set(diff.deleted);
166
+ diff.deleted = indexPaths.filter((p) => deleted.has(p));
167
+ return { diff, uncommitted };
168
+ }
169
+
170
+ // src/services/status.ts
171
+ async function buildStatus(root, signal, opts = {}) {
172
+ const dir = athenaDir(root);
173
+ const st = await readState(dir);
174
+ if (st.kind === "missing") throw new AthenaError(".athena/state.json is missing.", "Run `athena analyze` to rebuild it.");
175
+ if (st.kind === "corrupted") throw new AthenaError(`.athena/state.json is corrupted (${st.reason}).`, "Run `athena analyze` \u2014 the corrupted file will be backed up and rebuilt.");
176
+ const state = st.state;
177
+ const documents = [];
178
+ for (const d of KNOWLEDGE_DOCS) {
179
+ const text = await readTextIfExists(path2.join(dir, d.file));
180
+ documents.push({
181
+ file: d.file,
182
+ title: d.title,
183
+ present: text !== null,
184
+ editedBlocks: text ? parseBlocks(text).filter(isBlockModified).map((b) => b.id) : [],
185
+ lastChangedAt: state.documents[d.id]?.lastChangedAt
186
+ });
187
+ }
188
+ const { config } = await loadConfig(root);
189
+ const prevIndex = await readFileIndex(dir);
190
+ const fast = state.git.isRepo && !opts.noFastPath ? await fastIndexChanges(root, config, prevIndex, signal) : null;
191
+ const raw = fast ? fast.diff : diffFileIndex(prevIndex, buildFileIndex((await walkProject(root, { config, signal, reuse: prevIndex })).files));
192
+ const managed = new Set(Object.values(state.agents).flatMap((a) => a.files));
193
+ const keep = (p) => !managed.has(p);
194
+ const changes = { added: raw.added.filter(keep), modified: raw.modified.filter(keep), deleted: raw.deleted.filter(keep) };
195
+ const git2 = { isRepo: state.git.isRepo, branch: state.git.branch, headChanged: false, uncommitted: null };
196
+ if (fast) git2.uncommitted = fast.uncommitted;
197
+ else if (state.git.isRepo) {
198
+ const wc = await workingChanges(root);
199
+ git2.uncommitted = wc ? wc.filter((f) => !f.path.startsWith(".athena/")).length : null;
200
+ }
201
+ const impact = impactOf([...changes.added, ...changes.modified, ...changes.deleted], { structural: [...changes.added, ...changes.deleted] });
202
+ const affectedDocuments = impact.docs.map((id) => ({ file: KNOWLEDGE_DOCS.find((d) => d.id === id).file, reasons: impact.reasons[id] ?? [] }));
203
+ const totalChanges = changes.added.length + changes.modified.length + changes.deleted.length;
204
+ const missing = documents.some((d) => !d.present);
205
+ return {
206
+ project: state.projectName,
207
+ root,
208
+ health: missing ? "degraded" : totalChanges ? "needs-update" : "healthy",
209
+ analyzedAt: state.analyzedAt,
210
+ documents,
211
+ changes,
212
+ git: git2,
213
+ affectedDocuments,
214
+ sync: totalChanges ? "needs-update" : "up-to-date"
215
+ };
216
+ }
217
+
218
+ export {
219
+ buildStatus
220
+ };
221
+ //# sourceMappingURL=chunk-ZB7LC6FP.js.map
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ cleanCommand,
4
+ confirm
5
+ } from "./chunk-7DZK6WSQ.js";
6
+ import "./chunk-Z6QWMJLK.js";
7
+ import "./chunk-XFN7UZCS.js";
8
+ import "./chunk-KBO7XRBW.js";
9
+ import "./chunk-YRIS7ZS6.js";
10
+ import "./chunk-GHFRQAYT.js";
11
+ import "./chunk-INT3IGMQ.js";
12
+ import "./chunk-673EPYYH.js";
13
+ import "./chunk-FQEGEVLY.js";
14
+ import "./chunk-2DY4PUR4.js";
15
+ import "./chunk-IQQBAWSM.js";
16
+ import "./chunk-AD4OZCU2.js";
17
+ import "./chunk-XW3MLHI2.js";
18
+ import "./chunk-EUPETUWA.js";
19
+ export {
20
+ cleanCommand,
21
+ confirm
22
+ };
23
+ //# sourceMappingURL=clean-MDBYH62P.js.map