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.
- package/CHANGELOG.md +63 -0
- package/README.md +61 -12
- package/dist/activity-BKW7G4I5.js +77 -0
- package/dist/agents-DFSNEOP5.js +69 -0
- package/dist/ai-ASL4FFQ7.js +96 -0
- package/dist/analyze-ZY3MXBOI.js +50 -0
- package/dist/chunk-2DY4PUR4.js +465 -0
- package/dist/chunk-2R6PXY6Z.js +33 -0
- package/dist/chunk-3IS2X2Z7.js +89 -0
- package/dist/chunk-3XSDI5WF.js +179 -0
- package/dist/chunk-65TSRDQ3.js +124 -0
- package/dist/chunk-673EPYYH.js +105 -0
- package/dist/chunk-7DZK6WSQ.js +65 -0
- package/dist/chunk-AD4OZCU2.js +34 -0
- package/dist/chunk-DZDI2HRT.js +169 -0
- package/dist/chunk-ELKFRTZT.js +221 -0
- package/dist/chunk-EUPETUWA.js +14 -0
- package/dist/chunk-FQEGEVLY.js +38 -0
- package/dist/chunk-FVCDMQUQ.js +343 -0
- package/dist/chunk-GGXPG6OE.js +904 -0
- package/dist/chunk-GHFRQAYT.js +112 -0
- package/dist/chunk-GR4DL2VM.js +47 -0
- package/dist/chunk-INT3IGMQ.js +111 -0
- package/dist/chunk-IQQBAWSM.js +90 -0
- package/dist/chunk-JCGDR4UV.js +182 -0
- package/dist/chunk-KBO7XRBW.js +26 -0
- package/dist/chunk-KHMBNT66.js +399 -0
- package/dist/chunk-LEMPCNAY.js +209 -0
- package/dist/chunk-MPG3IEGB.js +2691 -0
- package/dist/chunk-OLPSEQS5.js +264 -0
- package/dist/chunk-PVCIGUIT.js +64 -0
- package/dist/chunk-QCC4VJUH.js +217 -0
- package/dist/chunk-QLW657NT.js +95 -0
- package/dist/chunk-RVTNSNGK.js +182 -0
- package/dist/chunk-RXNRMIZP.js +390 -0
- package/dist/chunk-SHKXELUX.js +295 -0
- package/dist/chunk-SJ4DQFIJ.js +379 -0
- package/dist/chunk-SVTEJYMS.js +227 -0
- package/dist/chunk-TDNZ2RYA.js +702 -0
- package/dist/chunk-UAZLPNVC.js +108 -0
- package/dist/chunk-VSYBC3VY.js +28 -0
- package/dist/chunk-WVQC2EGO.js +166 -0
- package/dist/chunk-XDCKZ5TV.js +436 -0
- package/dist/chunk-XFN7UZCS.js +35 -0
- package/dist/chunk-XW3MLHI2.js +32 -0
- package/dist/chunk-YRIS7ZS6.js +919 -0
- package/dist/chunk-Z6QWMJLK.js +124 -0
- package/dist/chunk-ZB7LC6FP.js +221 -0
- package/dist/clean-MDBYH62P.js +23 -0
- package/dist/cli.js +18 -10716
- package/dist/context-PLPCAPCO.js +161 -0
- package/dist/doctor-BX677KRE.js +69 -0
- package/dist/event-TNT6CQZR.js +101 -0
- package/dist/git-hook-YZNZGAAP.js +252 -0
- package/dist/init-WQCAOJ2R.js +38 -0
- package/dist/mcp-U7EPH43L.js +393 -0
- package/dist/memory-VSVNLEJC.js +393 -0
- package/dist/open-UJZRYF4E.js +1450 -0
- package/dist/program-CWJNGCTZ.js +165 -0
- package/dist/review-OOKXSYMP.js +117 -0
- package/dist/rules-4FXJUCXB.js +83 -0
- package/dist/security-LME3XFL3.js +177 -0
- package/dist/staged-check-X24C3YRD.js +502 -0
- package/dist/status-RR57ZNGI.js +81 -0
- package/dist/sync-KFJANRXF.js +218 -0
- package/dist/watch-CY7QHIYN.js +123 -0
- package/dist/web/assets/{Editor-DAXvniWB.js → Editor-Bnilgch0.js} +1 -1
- package/dist/web/assets/{abnfDiagram-O67JEVCF-Az7EW1BC.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
- package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
- package/dist/web/assets/{architectureDiagram-NJMV4G6O-BxeXqSTn.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
- package/dist/web/assets/{blockDiagram-BEXU5L5S-aeKZl9lJ.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
- package/dist/web/assets/{c4Diagram-YGBWAQC7-CgmntYsG.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
- package/dist/web/assets/channel-Bkh05NKd.js +1 -0
- package/dist/web/assets/{chunk-3FUC2YCW-BpmRD2yo.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
- package/dist/web/assets/{chunk-5DYCD2WN-CRIFDwod.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
- package/dist/web/assets/{chunk-742MDFTN-hRW9VeNV.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
- package/dist/web/assets/{chunk-7INBJB4K-C6VEpT0Y.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
- package/dist/web/assets/{chunk-7M6MHVWA-Dnajov2w.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
- package/dist/web/assets/{chunk-7PRAP22T-DSAc0_CZ.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
- package/dist/web/assets/{chunk-GTNCS2PH-CefpYUjb.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
- package/dist/web/assets/{chunk-GWA4HPMP-MLNflMmF.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
- package/dist/web/assets/{chunk-MBY4JIJT-D3GmmEiU.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
- package/dist/web/assets/{chunk-NETBCI7D-DzTj6xVk.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
- package/dist/web/assets/{chunk-O7XYJQB3-D1d0hCko.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
- package/dist/web/assets/{chunk-UA2S7LBM-C9hIFeWR.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
- package/dist/web/assets/{chunk-WEXAMYUT-BFGtcjsi.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
- package/dist/web/assets/{chunk-Z7XXMR3K-BRZ8_wtE.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
- package/dist/web/assets/{chunk-ZIGJFQKS-CTKOioal.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-NBCMYWYE-DJGKtWJv.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
- package/dist/web/assets/{cynefin-OW5HDTMX-hNq1kGmA.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-VND7K2PF-sODQM_ZZ.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
- package/dist/web/assets/{dagre-6A5THRUB-DEzTThIf.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
- package/dist/web/assets/{diagram-22UHCM2B-s_eellsa.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
- package/dist/web/assets/{diagram-3UASUU5V-B2onY_Xw.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
- package/dist/web/assets/{diagram-ATOU4E4O-B8V6s13s.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
- package/dist/web/assets/{diagram-CDSNMT55-CJxiE6mf.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
- package/dist/web/assets/{diagram-MLGK6HIB-m5OHPLAp.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
- package/dist/web/assets/{diagram-MPIPVDR6-Buvvrk_A.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CpL7Wt3R.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
- package/dist/web/assets/{elk-276RUBZZ-CwYhbsXa.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
- package/dist/web/assets/{erDiagram-OPXOYQCR-DNikci2r.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
- package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
- package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
- package/dist/web/assets/{ganttDiagram-FUAMR5RP-d-ynDlvJ.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
- package/dist/web/assets/{gitGraph-4MIJSDKK-DwIeBI91.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-X574FWY7-04RZccu6.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
- package/dist/web/assets/{index-C3-8uYXr.js → index-Cen0jOXj.js} +5 -4
- package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
- package/dist/web/assets/{info-A6RAGUB7-xf4Nzgv-.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
- package/dist/web/assets/{infoDiagram-VRGFBTTK-BYjw0eiK.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Bx9s4nPM.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
- package/dist/web/assets/{journeyDiagram-ZHPQQLJL-DrdHs7B-.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
- package/dist/web/assets/{kanban-definition-PNTS6WVX-CVd8v2Te.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
- package/dist/web/assets/{line-V_WrJ-6y.js → line-BERsMFG6.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-B-ilyEpO.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
- package/dist/web/assets/{mermaid.core-Bnyaa0nF.js → mermaid.core-DMsM3ZX7.js} +4 -4
- package/dist/web/assets/{mindmap-definition-NLK3R4M7-B3AbvHPR.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
- package/dist/web/assets/{packet-AYTQ26CC-CBAIUXIc.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
- package/dist/web/assets/{pegDiagram-GJSIUBJH-DIdeELUM.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
- package/dist/web/assets/{pie-WAS4IAKB-a1r3tzPR.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
- package/dist/web/assets/{pieDiagram-5QR66LMP-pQBEio0x.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-O4NWA36T-CkJK5Y03.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
- package/dist/web/assets/{radar-RG4KPBEZ-BZfLYjx5.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
- package/dist/web/assets/{railroad-74A4TZTK-CuIW1ZAU.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
- package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
- package/dist/web/assets/{railroadDiagram-XR7U4H2S-_BpGE8aJ.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
- package/dist/web/assets/{requirementDiagram-PLB6GJNP-CnzF90GS.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-IPEJSGJF-DYeisDj_.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-PO4LG4MO-ll9cBvca.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
- package/dist/web/assets/{stateDiagram-v2-GCMORJYK-CdKcOIKQ.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
- package/dist/web/assets/{swimlanes-2SLR337P-y6piTWEW.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
- package/dist/web/assets/{timeline-definition-EJHVYXUP-DuC_4xK0.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
- package/dist/web/assets/{treeView-Q6P3EWNA-gCQFmND0.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
- package/dist/web/assets/{treemap-WGGIJYW6-BQ2010OY.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
- package/dist/web/assets/{usecaseDiagram-POWQR4AR-CCTqzHz6.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
- package/dist/web/assets/{vennDiagram-UO4OBE2U-0_O7guNq.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
- package/dist/web/assets/{wardley-WFR3VGLG-SsX7uMDs.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DlqH6Hox.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
- package/dist/web/assets/{xychartDiagram-PMCCYNJV-nr4UYDtd.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +4 -2
- package/dist/web/assets/architecture-7GRP2DOG-blXBarB2.js +0 -1
- package/dist/web/assets/channel-f4QzewnN.js +0 -1
- package/dist/web/assets/eventmodeling-NTZA5JFV-CA_ZFPZ2.js +0 -1
- package/dist/web/assets/flowDiagram-KWPJA3E3-DObsBuWT.js +0 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-6B4Ffbxn.js +0 -1
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-BGL9lIQc.js +0 -1
- package/dist/web/assets/railroad-peg-WCYAUIDC-DcqxTem7.js +0 -1
- 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
|