project-athena 0.2.1 → 0.3.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 (147) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +15 -8
  3. package/dist/activity-P4UUFHWV.js +77 -0
  4. package/dist/agents-3HTSQGL2.js +69 -0
  5. package/dist/ai-ASL4FFQ7.js +96 -0
  6. package/dist/analyze-F3YOILNL.js +49 -0
  7. package/dist/chunk-2DY4PUR4.js +465 -0
  8. package/dist/chunk-2R6PXY6Z.js +33 -0
  9. package/dist/chunk-2RS6TA3D.js +908 -0
  10. package/dist/chunk-32PRS2MG.js +169 -0
  11. package/dist/chunk-3IS2X2Z7.js +89 -0
  12. package/dist/chunk-65TSRDQ3.js +124 -0
  13. package/dist/chunk-673EPYYH.js +105 -0
  14. package/dist/chunk-AD4OZCU2.js +34 -0
  15. package/dist/chunk-CXUTYCZX.js +238 -0
  16. package/dist/chunk-DOQMAZL5.js +436 -0
  17. package/dist/chunk-EF6GHOIN.js +343 -0
  18. package/dist/chunk-ELKFRTZT.js +221 -0
  19. package/dist/chunk-EUPETUWA.js +14 -0
  20. package/dist/chunk-FQEGEVLY.js +38 -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-JY6BFIJJ.js +95 -0
  27. package/dist/chunk-KBO7XRBW.js +26 -0
  28. package/dist/chunk-LEMPCNAY.js +209 -0
  29. package/dist/chunk-LMOFZNTQ.js +379 -0
  30. package/dist/chunk-OLPSEQS5.js +264 -0
  31. package/dist/chunk-PANVPNYF.js +2892 -0
  32. package/dist/chunk-PDFQ5BFG.js +378 -0
  33. package/dist/chunk-PR53DT7I.js +179 -0
  34. package/dist/chunk-PVCIGUIT.js +64 -0
  35. package/dist/chunk-RXNRMIZP.js +390 -0
  36. package/dist/chunk-S7T6VX56.js +61 -0
  37. package/dist/chunk-SHKXELUX.js +295 -0
  38. package/dist/chunk-SJOOXO34.js +904 -0
  39. package/dist/chunk-TGJUUB44.js +399 -0
  40. package/dist/chunk-VSYBC3VY.js +28 -0
  41. package/dist/chunk-XB66PZ6Z.js +182 -0
  42. package/dist/chunk-XFN7UZCS.js +35 -0
  43. package/dist/chunk-XW3MLHI2.js +32 -0
  44. package/dist/chunk-Z6QWMJLK.js +124 -0
  45. package/dist/chunk-ZB7LC6FP.js +221 -0
  46. package/dist/clean-S7PKCOLM.js +23 -0
  47. package/dist/cli.js +18 -10716
  48. package/dist/context-AH5MFHRG.js +147 -0
  49. package/dist/doctor-RSJMLE2P.js +62 -0
  50. package/dist/event-TNT6CQZR.js +101 -0
  51. package/dist/git-hook-YZNZGAAP.js +252 -0
  52. package/dist/init-2V34DVRQ.js +37 -0
  53. package/dist/mcp-T2GRTEX5.js +255 -0
  54. package/dist/open-2QSZKKUG.js +1259 -0
  55. package/dist/program-V2USHGXN.js +148 -0
  56. package/dist/review-R3R2J5BJ.js +115 -0
  57. package/dist/rules-4FXJUCXB.js +83 -0
  58. package/dist/security-PI4LXCOB.js +175 -0
  59. package/dist/staged-check-HHIBKKMR.js +500 -0
  60. package/dist/status-6M73WX5I.js +75 -0
  61. package/dist/sync-3ZNJDSSU.js +216 -0
  62. package/dist/watch-USN5CQIV.js +121 -0
  63. package/dist/web/assets/{Editor-DAXvniWB.js → Editor-BI56-HX5.js} +1 -1
  64. package/dist/web/assets/{abnfDiagram-O67JEVCF-Az7EW1BC.js → abnfDiagram-O67JEVCF-y_9px2ob.js} +1 -1
  65. package/dist/web/assets/architecture-7GRP2DOG-DyxkwYiW.js +1 -0
  66. package/dist/web/assets/{architectureDiagram-NJMV4G6O-BxeXqSTn.js → architectureDiagram-NJMV4G6O-lB6fcVzU.js} +1 -1
  67. package/dist/web/assets/{blockDiagram-BEXU5L5S-aeKZl9lJ.js → blockDiagram-BEXU5L5S-DcM5pEjM.js} +1 -1
  68. package/dist/web/assets/{c4Diagram-YGBWAQC7-CgmntYsG.js → c4Diagram-YGBWAQC7-CJgqxTY2.js} +1 -1
  69. package/dist/web/assets/channel-BvDD7AMO.js +1 -0
  70. package/dist/web/assets/{chunk-3FUC2YCW-BpmRD2yo.js → chunk-3FUC2YCW-B8l_VuWR.js} +1 -1
  71. package/dist/web/assets/{chunk-5DYCD2WN-CRIFDwod.js → chunk-5DYCD2WN-CZecgNhf.js} +1 -1
  72. package/dist/web/assets/{chunk-742MDFTN-hRW9VeNV.js → chunk-742MDFTN-BeZ7P5jB.js} +1 -1
  73. package/dist/web/assets/{chunk-7INBJB4K-C6VEpT0Y.js → chunk-7INBJB4K-IKy0pr5m.js} +1 -1
  74. package/dist/web/assets/{chunk-7M6MHVWA-Dnajov2w.js → chunk-7M6MHVWA-Dg_QqJEX.js} +1 -1
  75. package/dist/web/assets/{chunk-7PRAP22T-DSAc0_CZ.js → chunk-7PRAP22T-DqQNS8oq.js} +1 -1
  76. package/dist/web/assets/{chunk-GTNCS2PH-CefpYUjb.js → chunk-GTNCS2PH-x4sM51nJ.js} +1 -1
  77. package/dist/web/assets/{chunk-GWA4HPMP-MLNflMmF.js → chunk-GWA4HPMP-CE5GcwVN.js} +1 -1
  78. package/dist/web/assets/{chunk-MBY4JIJT-D3GmmEiU.js → chunk-MBY4JIJT-DA_D1hjF.js} +1 -1
  79. package/dist/web/assets/{chunk-NETBCI7D-DzTj6xVk.js → chunk-NETBCI7D-CeJ3XBZ2.js} +1 -1
  80. package/dist/web/assets/{chunk-O7XYJQB3-D1d0hCko.js → chunk-O7XYJQB3-BH2gESvO.js} +1 -1
  81. package/dist/web/assets/{chunk-UA2S7LBM-C9hIFeWR.js → chunk-UA2S7LBM-BWr0xCux.js} +1 -1
  82. package/dist/web/assets/{chunk-WEXAMYUT-BFGtcjsi.js → chunk-WEXAMYUT-B4QwUZPM.js} +1 -1
  83. package/dist/web/assets/{chunk-Z7XXMR3K-BRZ8_wtE.js → chunk-Z7XXMR3K-BxcA-y5B.js} +1 -1
  84. package/dist/web/assets/{chunk-ZIGJFQKS-CTKOioal.js → chunk-ZIGJFQKS-BZYvP63G.js} +1 -1
  85. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-DJGKtWJv.js → classDiagram-v2-NBCMYWYE-BS3P_NXb.js} +1 -1
  86. package/dist/web/assets/{cynefin-OW5HDTMX-hNq1kGmA.js → cynefin-OW5HDTMX-BALD4Pve.js} +1 -1
  87. package/dist/web/assets/{cynefinDiagram-VND7K2PF-sODQM_ZZ.js → cynefinDiagram-VND7K2PF-BM2y4W6d.js} +1 -1
  88. package/dist/web/assets/{dagre-6A5THRUB-DEzTThIf.js → dagre-6A5THRUB-PTfOrIdF.js} +1 -1
  89. package/dist/web/assets/{diagram-22UHCM2B-s_eellsa.js → diagram-22UHCM2B-CpXEHhUl.js} +1 -1
  90. package/dist/web/assets/{diagram-3UASUU5V-B2onY_Xw.js → diagram-3UASUU5V-DPHfXzr6.js} +1 -1
  91. package/dist/web/assets/{diagram-ATOU4E4O-B8V6s13s.js → diagram-ATOU4E4O-DMBNXvAC.js} +1 -1
  92. package/dist/web/assets/{diagram-CDSNMT55-CJxiE6mf.js → diagram-CDSNMT55-CDLe1M7G.js} +1 -1
  93. package/dist/web/assets/{diagram-MLGK6HIB-m5OHPLAp.js → diagram-MLGK6HIB-D6L8oE7j.js} +1 -1
  94. package/dist/web/assets/{diagram-MPIPVDR6-Buvvrk_A.js → diagram-MPIPVDR6-CP-S7rrQ.js} +1 -1
  95. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CpL7Wt3R.js → ebnfDiagram-ZINNZB2B-CkUc63TK.js} +1 -1
  96. package/dist/web/assets/{elk-276RUBZZ-CwYhbsXa.js → elk-276RUBZZ-C1CAJLH_.js} +1 -1
  97. package/dist/web/assets/{erDiagram-OPXOYQCR-DNikci2r.js → erDiagram-OPXOYQCR-DXBnaTHm.js} +1 -1
  98. package/dist/web/assets/eventmodeling-NTZA5JFV-cLIzvgDp.js +1 -0
  99. package/dist/web/assets/flowDiagram-KWPJA3E3-D7Zq63VQ.js +1 -0
  100. package/dist/web/assets/{ganttDiagram-FUAMR5RP-d-ynDlvJ.js → ganttDiagram-FUAMR5RP-BVm8SiGg.js} +1 -1
  101. package/dist/web/assets/{gitGraph-4MIJSDKK-DwIeBI91.js → gitGraph-4MIJSDKK-Dm7xBrW0.js} +1 -1
  102. package/dist/web/assets/{gitGraphDiagram-X574FWY7-04RZccu6.js → gitGraphDiagram-X574FWY7-D_PIKKhx.js} +1 -1
  103. package/dist/web/assets/{index-C3-8uYXr.js → index-CeOIBpu2.js} +3 -3
  104. package/dist/web/assets/{info-A6RAGUB7-xf4Nzgv-.js → info-A6RAGUB7-CLGrx8pn.js} +1 -1
  105. package/dist/web/assets/{infoDiagram-VRGFBTTK-BYjw0eiK.js → infoDiagram-VRGFBTTK-BlBjaKm7.js} +1 -1
  106. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Bx9s4nPM.js → ishikawaDiagram-OU5B5YK6-Kxe7GGS3.js} +1 -1
  107. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-DrdHs7B-.js → journeyDiagram-ZHPQQLJL-wCMoHK4M.js} +1 -1
  108. package/dist/web/assets/{kanban-definition-PNTS6WVX-CVd8v2Te.js → kanban-definition-PNTS6WVX-BxdCz9Ko.js} +1 -1
  109. package/dist/web/assets/{line-V_WrJ-6y.js → line-Zf11FnWF.js} +1 -1
  110. package/dist/web/assets/{mermaid-parser.core-B-ilyEpO.js → mermaid-parser.core-BvFFklev.js} +3 -3
  111. package/dist/web/assets/{mermaid.core-Bnyaa0nF.js → mermaid.core-Cd_Ssti9.js} +4 -4
  112. package/dist/web/assets/{mindmap-definition-NLK3R4M7-B3AbvHPR.js → mindmap-definition-NLK3R4M7-BGPQl-GY.js} +1 -1
  113. package/dist/web/assets/{packet-AYTQ26CC-CBAIUXIc.js → packet-AYTQ26CC-6lI3cEX_.js} +1 -1
  114. package/dist/web/assets/{pegDiagram-GJSIUBJH-DIdeELUM.js → pegDiagram-GJSIUBJH-BPIjlSAj.js} +1 -1
  115. package/dist/web/assets/{pie-WAS4IAKB-a1r3tzPR.js → pie-WAS4IAKB-D6Dzj3Ja.js} +1 -1
  116. package/dist/web/assets/{pieDiagram-5QR66LMP-pQBEio0x.js → pieDiagram-5QR66LMP-DtA-vZmv.js} +1 -1
  117. package/dist/web/assets/{quadrantDiagram-O4NWA36T-CkJK5Y03.js → quadrantDiagram-O4NWA36T-EettyqQn.js} +1 -1
  118. package/dist/web/assets/{radar-RG4KPBEZ-BZfLYjx5.js → radar-RG4KPBEZ-xmRc3Dl8.js} +1 -1
  119. package/dist/web/assets/{railroad-74A4TZTK-CuIW1ZAU.js → railroad-74A4TZTK-BLB7dhOn.js} +1 -1
  120. package/dist/web/assets/railroad-abnf-HS5TGJTU-DBFym6g8.js +1 -0
  121. package/dist/web/assets/railroad-ebnf-LZEXJU2U-CkG28ig8.js +1 -0
  122. package/dist/web/assets/railroad-peg-WCYAUIDC-Df_Ifaad.js +1 -0
  123. package/dist/web/assets/{railroadDiagram-XR7U4H2S-_BpGE8aJ.js → railroadDiagram-XR7U4H2S-PBw4We6b.js} +1 -1
  124. package/dist/web/assets/{requirementDiagram-PLB6GJNP-CnzF90GS.js → requirementDiagram-PLB6GJNP-DjQpaUFA.js} +1 -1
  125. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-DYeisDj_.js → sankeyDiagram-IPEJSGJF-CBW-_AoF.js} +1 -1
  126. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-ll9cBvca.js → sequenceDiagram-PO4LG4MO-DEoPYqY9.js} +1 -1
  127. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-CdKcOIKQ.js → stateDiagram-v2-GCMORJYK-UZq5rPud.js} +1 -1
  128. package/dist/web/assets/{swimlanes-2SLR337P-y6piTWEW.js → swimlanes-2SLR337P-CACfuXJR.js} +1 -1
  129. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CDSrqdgx.js +8 -0
  130. package/dist/web/assets/{timeline-definition-EJHVYXUP-DuC_4xK0.js → timeline-definition-EJHVYXUP-CYJl7mP-.js} +1 -1
  131. package/dist/web/assets/{treeView-Q6P3EWNA-gCQFmND0.js → treeView-Q6P3EWNA-DtZ5nkPQ.js} +1 -1
  132. package/dist/web/assets/{treemap-WGGIJYW6-BQ2010OY.js → treemap-WGGIJYW6-m49GDM-M.js} +1 -1
  133. package/dist/web/assets/{usecaseDiagram-POWQR4AR-CCTqzHz6.js → usecaseDiagram-POWQR4AR-C2Vg20UK.js} +1 -1
  134. package/dist/web/assets/{vennDiagram-UO4OBE2U-0_O7guNq.js → vennDiagram-UO4OBE2U-C07v5OGI.js} +1 -1
  135. package/dist/web/assets/{wardley-WFR3VGLG-SsX7uMDs.js → wardley-WFR3VGLG-C9Z7EZtz.js} +1 -1
  136. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DlqH6Hox.js → wardleyDiagram-VNRHLVJA-DdA8CcSC.js} +1 -1
  137. package/dist/web/assets/{xychartDiagram-PMCCYNJV-nr4UYDtd.js → xychartDiagram-PMCCYNJV-C9EZw07b.js} +1 -1
  138. package/dist/web/index.html +1 -1
  139. package/package.json +4 -2
  140. package/dist/web/assets/architecture-7GRP2DOG-blXBarB2.js +0 -1
  141. package/dist/web/assets/channel-f4QzewnN.js +0 -1
  142. package/dist/web/assets/eventmodeling-NTZA5JFV-CA_ZFPZ2.js +0 -1
  143. package/dist/web/assets/flowDiagram-KWPJA3E3-DObsBuWT.js +0 -1
  144. package/dist/web/assets/railroad-abnf-HS5TGJTU-6B4Ffbxn.js +0 -1
  145. package/dist/web/assets/railroad-ebnf-LZEXJU2U-BGL9lIQc.js +0 -1
  146. package/dist/web/assets/railroad-peg-WCYAUIDC-DcqxTem7.js +0 -1
  147. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-DFS8a3jO.js +0 -8
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/core/git/git.ts
4
+ import { spawn } from "child_process";
5
+ var DEFAULT_MAX_BYTES = 32 * 1024 * 1024;
6
+ var MAX_STDERR_BYTES = 64 * 1024;
7
+ function git(cwd, args, opts = {}) {
8
+ const o = typeof opts === "number" ? { timeoutMs: opts } : opts;
9
+ const timeoutMs = o.timeoutMs ?? 15e3;
10
+ const maxBytes = o.maxBytes ?? DEFAULT_MAX_BYTES;
11
+ return new Promise((resolve) => {
12
+ if (o.signal?.aborted) {
13
+ resolve({ ok: false, code: null, stdout: "", stderr: "", aborted: true });
14
+ return;
15
+ }
16
+ const out = [];
17
+ const err = [];
18
+ let outBytes = 0;
19
+ let errBytes = 0;
20
+ let overflow = false;
21
+ let timedOut = false;
22
+ let aborted = false;
23
+ let settled = false;
24
+ const child = spawn("git", args, {
25
+ cwd,
26
+ windowsHide: true,
27
+ stdio: [o.input === void 0 ? "ignore" : "pipe", "pipe", "pipe"],
28
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0", LC_ALL: "C" }
29
+ });
30
+ const kill = () => {
31
+ if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
32
+ };
33
+ const timer = setTimeout(() => {
34
+ timedOut = true;
35
+ kill();
36
+ }, timeoutMs);
37
+ const onAbort = () => {
38
+ aborted = true;
39
+ kill();
40
+ };
41
+ o.signal?.addEventListener("abort", onAbort, { once: true });
42
+ const finish = (code, spawnError) => {
43
+ if (settled) return;
44
+ settled = true;
45
+ clearTimeout(timer);
46
+ o.signal?.removeEventListener("abort", onAbort);
47
+ let stderr = Buffer.concat(err).toString("utf8");
48
+ if (spawnError) stderr = stderr || spawnError.message;
49
+ if (overflow) stderr = `${stderr}${stderr ? "\n" : ""}output exceeded ${maxBytes} bytes`;
50
+ if (timedOut) stderr = `${stderr}${stderr ? "\n" : ""}timed out after ${timeoutMs} ms`;
51
+ const failed = overflow || timedOut || aborted || Boolean(spawnError);
52
+ resolve({
53
+ ok: !failed && code === 0,
54
+ code: failed ? null : code,
55
+ stdout: Buffer.concat(out).toString("utf8"),
56
+ stderr,
57
+ ...overflow ? { overflow } : {},
58
+ ...aborted ? { aborted } : {},
59
+ ...timedOut ? { timedOut } : {}
60
+ });
61
+ };
62
+ child.stdout.on("data", (chunk) => {
63
+ if (overflow) return;
64
+ outBytes += chunk.length;
65
+ if (outBytes > maxBytes) {
66
+ overflow = true;
67
+ kill();
68
+ return;
69
+ }
70
+ out.push(chunk);
71
+ });
72
+ child.stderr.on("data", (chunk) => {
73
+ if (errBytes >= MAX_STDERR_BYTES) return;
74
+ errBytes += chunk.length;
75
+ err.push(chunk);
76
+ });
77
+ child.on("error", (e) => finish(null, e));
78
+ child.on("close", (code) => finish(code));
79
+ if (o.input !== void 0) {
80
+ child.stdin.on("error", () => {
81
+ });
82
+ child.stdin.end(o.input);
83
+ }
84
+ });
85
+ }
86
+ var GitCommandError = class extends Error {
87
+ constructor(args, result) {
88
+ const detail = result.stderr.trim().split("\n").filter(Boolean).slice(-1)[0]?.slice(0, 300);
89
+ super(`git ${args.find((a) => !a.startsWith("-") && !a.includes("=")) ?? args[0]} failed${detail ? `: ${detail}` : result.code !== null ? ` (exit ${result.code})` : ""}`);
90
+ this.args = args;
91
+ this.result = result;
92
+ this.name = "GitCommandError";
93
+ }
94
+ args;
95
+ result;
96
+ };
97
+ async function gitOrThrow(cwd, args, opts = {}) {
98
+ const r = await git(cwd, args, opts);
99
+ if (r.aborted) throw opts.signal?.reason ?? new Error("Aborted");
100
+ if (!r.ok) throw new GitCommandError(args, r);
101
+ return r.stdout;
102
+ }
103
+ var availability = null;
104
+ function gitAvailable(opts = {}) {
105
+ if (availability) return availability;
106
+ const p = git(process.cwd(), ["--version"], { signal: opts.signal }).then((r) => {
107
+ if (r.aborted && availability === p) availability = null;
108
+ return r.ok;
109
+ });
110
+ availability = p;
111
+ return p;
112
+ }
113
+ async function isGitRepo(cwd, opts = {}) {
114
+ const r = await git(cwd, ["rev-parse", "--is-inside-work-tree"], { signal: opts.signal });
115
+ return r.ok && r.stdout.trim() === "true";
116
+ }
117
+ var HISTORY_DAYS = 180;
118
+ var HISTORY_MAX_COMMITS = 2e3;
119
+ var AUTHOR_MARK = "";
120
+ async function gitInfo(cwd, opts = {}) {
121
+ const { signal } = opts;
122
+ const days = opts.historyDays ?? HISTORY_DAYS;
123
+ const maxCommits = opts.maxCommits ?? HISTORY_MAX_COMMITS;
124
+ const run = (args) => git(cwd, args, { signal });
125
+ const [available, isRepo, branch, head, date, log] = await Promise.all([
126
+ gitAvailable({ signal }),
127
+ isGitRepo(cwd, { signal }),
128
+ run(["rev-parse", "--abbrev-ref", "HEAD"]),
129
+ run(["rev-parse", "HEAD"]),
130
+ run(["log", "-1", "--format=%cI"]),
131
+ run(["log", `--since=${days}.days`, `--max-count=${maxCommits}`, "--no-merges", `--format=${AUTHOR_MARK}%aN`, "--name-only", "--relative", "--", "."])
132
+ ]);
133
+ signal?.throwIfAborted();
134
+ const info = { available, isRepo: false, hotspots: [] };
135
+ if (!info.available) return info;
136
+ info.isRepo = isRepo;
137
+ if (!info.isRepo) return info;
138
+ if (branch.ok) info.branch = branch.stdout.trim();
139
+ if (head.ok) info.head = head.stdout.trim();
140
+ if (date.ok && date.stdout.trim()) info.lastCommitDate = date.stdout.trim();
141
+ if (log.ok) {
142
+ const authors = /* @__PURE__ */ new Set();
143
+ const counts = /* @__PURE__ */ new Map();
144
+ for (const line of log.stdout.split("\n")) {
145
+ if (line.startsWith(AUTHOR_MARK)) {
146
+ authors.add(line.slice(1));
147
+ continue;
148
+ }
149
+ const p = line.trim();
150
+ if (!p || p === ".athena" || p.startsWith(".athena/")) continue;
151
+ const dir = p.includes("/") ? p.split("/").slice(0, 2).join("/") : ".";
152
+ counts.set(dir, (counts.get(dir) ?? 0) + 1);
153
+ }
154
+ info.contributorCount = authors.size;
155
+ info.hotspots = [...counts.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).slice(0, 10).map(([path, commits]) => ({ path, commits }));
156
+ }
157
+ return info;
158
+ }
159
+ async function workingChanges(cwd, opts = {}) {
160
+ const [r, prefix] = await Promise.all([git(cwd, ["status", "--porcelain=v1", "-z", "--untracked-files=all", "--", "."], { signal: opts.signal }), repoPrefix(cwd, opts)]);
161
+ if (!r.ok) return null;
162
+ const out = [];
163
+ const parts = r.stdout.split("\0");
164
+ for (let i = 0; i < parts.length; i++) {
165
+ const entry = parts[i];
166
+ if (entry.length < 4) continue;
167
+ const code = entry.slice(0, 2);
168
+ const p = entry.slice(3);
169
+ if (code.includes("R")) {
170
+ out.push({ path: p, status: "renamed", from: parts[++i] });
171
+ } else if (code === "??") out.push({ path: p, status: "untracked" });
172
+ else if (code.includes("D")) out.push({ path: p, status: "deleted" });
173
+ else if (code.includes("A")) out.push({ path: p, status: "added" });
174
+ else if (code.includes("M")) out.push({ path: p, status: "modified" });
175
+ else out.push({ path: p, status: "other" });
176
+ }
177
+ return stripPrefix(out, prefix);
178
+ }
179
+ async function repoPrefix(cwd, opts = {}) {
180
+ const r = await git(cwd, ["rev-parse", "--show-prefix"], { signal: opts.signal });
181
+ return r.ok ? r.stdout.trim() : "";
182
+ }
183
+ function stripPrefix(files, prefix) {
184
+ if (!prefix) return files;
185
+ return files.filter((f) => f.path.startsWith(prefix)).map((f) => ({ ...f, path: f.path.slice(prefix.length), from: f.from?.startsWith(prefix) ? f.from.slice(prefix.length) : f.from }));
186
+ }
187
+ function parseNameStatusZ(stdout) {
188
+ const out = [];
189
+ const parts = stdout.split("\0").filter(Boolean);
190
+ for (let i = 0; i < parts.length; i++) {
191
+ const code = parts[i];
192
+ if (code.startsWith("R") || code.startsWith("C")) {
193
+ const from = parts[++i];
194
+ const to = parts[++i];
195
+ if (to === void 0) break;
196
+ out.push(code.startsWith("R") ? { path: to, status: "renamed", from } : { path: to, status: "added" });
197
+ } else {
198
+ const p = parts[++i];
199
+ if (p === void 0) break;
200
+ out.push({ path: p, status: code === "A" ? "added" : code === "D" ? "deleted" : code === "M" ? "modified" : "other" });
201
+ }
202
+ }
203
+ return out;
204
+ }
205
+ function isSafeRef(ref) {
206
+ return /^[A-Za-z0-9][\w./@^~-]{0,119}$/.test(ref);
207
+ }
208
+ async function headMovement(cwd, from, to, limit = 20, opts = {}) {
209
+ if (!/^[0-9a-f]{7,64}$/i.test(from) || !/^[0-9a-f]{7,64}$/i.test(to)) return null;
210
+ if (from === to) return { commits: [], diverged: false, truncated: false };
211
+ const { signal } = opts;
212
+ const exists = await git(cwd, ["cat-file", "-e", `${from}^{commit}`], { signal });
213
+ if (!exists.ok) return { commits: [], diverged: true, truncated: false };
214
+ const [ancestor, log] = await Promise.all([git(cwd, ["merge-base", "--is-ancestor", from, to], { signal }), git(cwd, ["log", `-n${limit + 1}`, "--format=%H%x1f%s", `${from}..${to}`], { signal })]);
215
+ if (!log.ok) return null;
216
+ const commits = log.stdout.split("\n").filter(Boolean).map((l) => {
217
+ const [sha, subject] = l.split("");
218
+ return { sha, subject: subject ?? "" };
219
+ });
220
+ return { commits: commits.slice(0, limit), diverged: !ancestor.ok, truncated: commits.length > limit };
221
+ }
222
+ function parseStatusV2Z(stdout) {
223
+ const out = [];
224
+ const parts = stdout.split("\0");
225
+ for (let i = 0; i < parts.length; i++) {
226
+ const rec = parts[i];
227
+ if (!rec) continue;
228
+ const kind = rec[0];
229
+ if (kind === "?" || kind === "!") {
230
+ out.push({ kind, path: rec.slice(2), submodule: false });
231
+ continue;
232
+ }
233
+ if (kind === "#") continue;
234
+ if (kind !== "1" && kind !== "2" && kind !== "u") return null;
235
+ const fields = kind === "1" ? 8 : kind === "2" ? 9 : 10;
236
+ let at = 0;
237
+ for (let f = 0; f < fields && at >= 0; f++) at = rec.indexOf(" ", at + 1);
238
+ if (at < 0) return null;
239
+ const sub = rec.split(" ", 3)[2] ?? "N...";
240
+ const entry = { kind, path: rec.slice(at + 1), submodule: sub.startsWith("S") };
241
+ if (kind === "2") entry.from = parts[++i];
242
+ out.push(entry);
243
+ }
244
+ return out;
245
+ }
246
+ async function statusV2(cwd, opts = {}) {
247
+ const r = await git(cwd, ["status", "--porcelain=v2", "-z", "--untracked-files=all", "--ignore-submodules=none", "--", "."], { signal: opts.signal });
248
+ return r.ok ? parseStatusV2Z(r.stdout) : null;
249
+ }
250
+
251
+ export {
252
+ git,
253
+ GitCommandError,
254
+ gitOrThrow,
255
+ gitAvailable,
256
+ isGitRepo,
257
+ gitInfo,
258
+ workingChanges,
259
+ parseNameStatusZ,
260
+ isSafeRef,
261
+ headMovement,
262
+ statusV2
263
+ };
264
+ //# sourceMappingURL=chunk-OLPSEQS5.js.map