1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! pmpx —— 一个命令面,识别项目类型,转发给真正的工具。
//!
//! # 这个二进制里没有一行插件代码
//!
//! 支持 cargo 的能力、支持 pnpm 的能力,都在各自的插件仓库里,运行时 `dlopen` 进来。
//! 见 `README.md` 与设计文档第 8 节。
//!
//! # 分层
//!
//! ```text
//! main.rs 进程边界:解析 argv、把退出码翻译成进程退出
//! cli.rs 只做解析,把 argv 变成结构体
//! commands.rs 子命令的处理(读上下文 → 做事 → 打印)
//! app.rs 一次运行的上下文 + 从动词到 spawn 的完整流程
//! config.rs 全局配置 + 多层 .pmpx.toml 合并
//! discovery.rs 项目根发现(walk_up)
//! plugins.rs 扫描插件目录、读 manifest(**不 dlopen**)
//! detect.rs 打分 + 两级裁决
//! runtime.rs 加载选中的那个插件、跨 ABI 调它
//! spawn.rs 把 CommandSpec 变成真正的进程
//! hints.rs 零插件时的提示表(**不参与裁决**)
//! ```
//!
//! # 一条硬规矩
//!
//! 检测阶段**绝不加载任何插件代码**(`plugins.rs` 只读 manifest)。
//! 在一个从没装过插件的仓库里跑 `pmpx`,它不会执行任何第三方代码。
use Parser;
/// 跑一次,返回进程退出码 —— **可能来自后端**(6.5 的最后一个码)。