itismyskillmarket 1.0.10
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/.github/workflows/publish-npm.yml +54 -0
- package/.github/workflows/publish-skill.yml +70 -0
- package/5e51cb7aa8b8e60d49d86f4689f5d4d1.png +0 -0
- package/DEVELOPMENT.md +376 -0
- package/README.md +87 -0
- package/SKILLMARKET-GUIDE.md +277 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +561 -0
- package/docs/plans/2026-04-01-skillmarket-design.md +267 -0
- package/docs/plans/2026-04-01-skillmarket-implementation.md +1031 -0
- package/package.json +24 -0
- package/skills/README.md +52 -0
- package/skills/test-skill/SKILL.md +25 -0
- package/skills/test-skill/index.js +66 -0
- package/skills/test-skill/metadata.json +9 -0
- package/skills/test-skill/package.json +19 -0
- package/src/cli.ts +300 -0
- package/src/commands/info.ts +154 -0
- package/src/commands/install.ts +237 -0
- package/src/commands/ls.ts +169 -0
- package/src/commands/npm.ts +261 -0
- package/src/commands/registry.ts +159 -0
- package/src/commands/sync.ts +137 -0
- package/src/commands/uninstall.ts +102 -0
- package/src/commands/update.ts +113 -0
- package/src/constants.ts +126 -0
- package/src/index.ts +62 -0
- package/src/types.ts +137 -0
- package/src/utils/dirs.ts +166 -0
- package/src/utils/platform.ts +139 -0
- package/tsconfig.json +10 -0
- package/tsup.config.ts +22 -0
- package/wanxuchen-skillmarket-1.0.1.tgz +0 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* SkillMarket 类型定义文件
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* 本文件定义了 SkillMarket 中使用的所有 TypeScript 接口类型,包括:
|
|
7
|
+
* - Skill 元数据(用于 npm 包内的 skill 定义)
|
|
8
|
+
* - 已安装 Skill 信息(用于本地注册表)
|
|
9
|
+
* - 注册表数据结构
|
|
10
|
+
*
|
|
11
|
+
* @module types
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// -----------------------------------------------------------------------------
|
|
15
|
+
// Skill 元数据接口
|
|
16
|
+
// -----------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Skill 元数据结构
|
|
20
|
+
*
|
|
21
|
+
* 定义 npm 包中 skill 的元信息,通常存储在 package.json 的
|
|
22
|
+
* skillmarket 字段或独立的 metadata.json 文件中
|
|
23
|
+
*
|
|
24
|
+
* @interface SkillMetadata
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // package.json 中的 skillmarket 字段示例:
|
|
28
|
+
* {
|
|
29
|
+
* "skillmarket": {
|
|
30
|
+
* "id": "brainstorming",
|
|
31
|
+
* "displayName": "Brainstorming",
|
|
32
|
+
* "description": "多智能体头脑风暴能力",
|
|
33
|
+
* "platforms": ["cursor", "opencode", "vscode"],
|
|
34
|
+
* "defaultVersion": "v1"
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
*/
|
|
38
|
+
export interface SkillMetadata {
|
|
39
|
+
/** Skill 唯一标识符,用于包名和命令行引用 */
|
|
40
|
+
id: string;
|
|
41
|
+
|
|
42
|
+
/** Skill 的友好显示名称,用于 UI 展示 */
|
|
43
|
+
displayName: string;
|
|
44
|
+
|
|
45
|
+
/** Skill 功能描述,说明其用途和功能 */
|
|
46
|
+
description: string;
|
|
47
|
+
|
|
48
|
+
/** 支持的平台列表,只有列表中的平台才能使用此 skill */
|
|
49
|
+
platforms: string[];
|
|
50
|
+
|
|
51
|
+
/** 默认版本标识,通常为 'v1', 'v2' 等 */
|
|
52
|
+
defaultVersion: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// -----------------------------------------------------------------------------
|
|
56
|
+
// 已安装 Skill 接口
|
|
57
|
+
// -----------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 已安装 Skill 的信息结构
|
|
61
|
+
*
|
|
62
|
+
* 存储在本地注册表 (registry.json) 中,
|
|
63
|
+
* 记录用户已安装的 skill 及其相关信息
|
|
64
|
+
*
|
|
65
|
+
* @interface InstalledSkill
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* // registry.json 中的示例:
|
|
69
|
+
* {
|
|
70
|
+
* "skills": {
|
|
71
|
+
* "brainstorming": {
|
|
72
|
+
* "id": "brainstorming",
|
|
73
|
+
* "version": "1.0.0",
|
|
74
|
+
* "installedAt": "2026-04-01T10:00:00.000Z",
|
|
75
|
+
* "platforms": ["opencode"]
|
|
76
|
+
* }
|
|
77
|
+
* }
|
|
78
|
+
* }
|
|
79
|
+
*/
|
|
80
|
+
export interface InstalledSkill {
|
|
81
|
+
/** Skill 唯一标识符,与 npm 包名对应 */
|
|
82
|
+
id: string;
|
|
83
|
+
|
|
84
|
+
/** 已安装的版本号,遵循 semver 规范 */
|
|
85
|
+
version: string;
|
|
86
|
+
|
|
87
|
+
/** 安装时间的 ISO 8601 格式时间戳 */
|
|
88
|
+
installedAt: string;
|
|
89
|
+
|
|
90
|
+
/** 安装时检测到的目标平台列表 */
|
|
91
|
+
platforms: string[];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// -----------------------------------------------------------------------------
|
|
95
|
+
// 注册表数据结构
|
|
96
|
+
// -----------------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* SkillMarket 本地注册表数据结构
|
|
100
|
+
*
|
|
101
|
+
* 存储在 ~/.skillmarket/registry.json 文件中,
|
|
102
|
+
* 记录所有已安装的 skills 和注册表元信息
|
|
103
|
+
*
|
|
104
|
+
* @interface RegistryData
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* // 完整的 registry.json 结构:
|
|
108
|
+
* {
|
|
109
|
+
* "skills": {
|
|
110
|
+
* "skill1": { id, version, installedAt, platforms },
|
|
111
|
+
* "skill2": { id, version, installedAt, platforms }
|
|
112
|
+
* },
|
|
113
|
+
* "lastUpdated": "2026-04-01T10:30:00.000Z"
|
|
114
|
+
* }
|
|
115
|
+
*/
|
|
116
|
+
export interface RegistryData {
|
|
117
|
+
/**
|
|
118
|
+
* 已安装 skills 的字典
|
|
119
|
+
*
|
|
120
|
+
* - Key: skill ID (唯一标识符)
|
|
121
|
+
* - Value: InstalledSkill 对象(包含版本、平台等信息)
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* // 访问已安装的 skill:
|
|
125
|
+
* const brainstorming = registry.skills['brainstorming'];
|
|
126
|
+
* console.log(brainstorming.version); // "1.0.0"
|
|
127
|
+
*/
|
|
128
|
+
skills: Record<string, InstalledSkill>;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 注册表最后更新时间
|
|
132
|
+
*
|
|
133
|
+
* ISO 8601 格式的时间戳,
|
|
134
|
+
* 每次修改注册表时自动更新
|
|
135
|
+
*/
|
|
136
|
+
lastUpdated: string;
|
|
137
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* SkillMarket 目录工具模块
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* 本模块提供获取和创建 SkillMarket 目录结构的工具函数。
|
|
7
|
+
* 所有路径都遵循 ~/.skillmarket/ 的主目录结构。
|
|
8
|
+
*
|
|
9
|
+
* 目录结构:
|
|
10
|
+
* ~/.skillmarket/
|
|
11
|
+
* ├── registry.json # 注册表文件
|
|
12
|
+
* ├── cache/ # npm 包缓存
|
|
13
|
+
* ├── skills/ # 已安装的 skills
|
|
14
|
+
* └── platform-links/ # 平台适配软链接
|
|
15
|
+
*
|
|
16
|
+
* @module utils/dirs
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// -----------------------------------------------------------------------------
|
|
20
|
+
// 导入依赖
|
|
21
|
+
// -----------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
import os from 'os'; // Node.js OS 模块,用于获取用户主目录
|
|
24
|
+
import path from 'path'; // Node.js 路径模块
|
|
25
|
+
import fs from 'fs-extra'; // fs-extra,提供 Promise 化的文件系统操作
|
|
26
|
+
import {
|
|
27
|
+
MARKET_DIR, // 主目录名称常量
|
|
28
|
+
SUBDIRS, // 子目录名称常量
|
|
29
|
+
REGISTRY_FILE // 注册表文件名常量
|
|
30
|
+
} from '../constants.js';
|
|
31
|
+
|
|
32
|
+
// -----------------------------------------------------------------------------
|
|
33
|
+
// 路径获取函数
|
|
34
|
+
// -----------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 获取 SkillMarket 主目录路径
|
|
38
|
+
*
|
|
39
|
+
* 返回 ~/.skillmarket 路径,这是所有 skill 相关数据的存储根目录
|
|
40
|
+
*
|
|
41
|
+
* @returns {string} 技能市场主目录的绝对路径
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const home = getMarketHome();
|
|
45
|
+
* // 在 Linux/Mac: '/home/username/.skillmarket'
|
|
46
|
+
* // 在 Windows: 'C:\Users\username\.skillmarket'
|
|
47
|
+
*/
|
|
48
|
+
export function getMarketHome(): string {
|
|
49
|
+
return path.join(os.homedir(), MARKET_DIR);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 获取 npm 包缓存目录路径
|
|
54
|
+
*
|
|
55
|
+
* 用于存储从 npm 下载的 skill 包(.tgz 文件)和解压后的内容
|
|
56
|
+
*
|
|
57
|
+
* @returns {string} 缓存目录的绝对路径
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* const cacheDir = getCacheDir();
|
|
61
|
+
* // '~/.skillmarket/cache'
|
|
62
|
+
*/
|
|
63
|
+
export function getCacheDir(): string {
|
|
64
|
+
return path.join(getMarketHome(), SUBDIRS.CACHE);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 获取已安装 skills 的主存储目录路径
|
|
69
|
+
*
|
|
70
|
+
* 所有安装的 skill 都会复制/链接到这个目录,
|
|
71
|
+
* 每个 skill 有独立的子目录,内部包含版本目录和 latest 软链接
|
|
72
|
+
*
|
|
73
|
+
* @returns {string} skills 存储目录的绝对路径
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* const skillsDir = getSkillsDir();
|
|
77
|
+
* // '~/.skillmarket/skills'
|
|
78
|
+
*
|
|
79
|
+
* // 典型目录结构:
|
|
80
|
+
* // skills/
|
|
81
|
+
* // ├── brainstorming/
|
|
82
|
+
* // │ ├── latest -> 1.0.0/
|
|
83
|
+
* // │ └── 1.0.0/
|
|
84
|
+
* // └── weather/
|
|
85
|
+
* // ├── latest -> 2.0.0/
|
|
86
|
+
* // └── 2.0.0/
|
|
87
|
+
*/
|
|
88
|
+
export function getSkillsDir(): string {
|
|
89
|
+
return path.join(getMarketHome(), SUBDIRS.SKILLS);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 获取平台适配层软链接目录路径
|
|
94
|
+
*
|
|
95
|
+
* 这个目录为每个支持的平台创建独立的子目录,
|
|
96
|
+
* 里面包含指向对应平台 skill 文件的软链接
|
|
97
|
+
*
|
|
98
|
+
* @returns {string} 平台链接目录的绝对路径
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* const platformLinksDir = getPlatformLinksDir();
|
|
102
|
+
* // '~/.skillmarket/platform-links'
|
|
103
|
+
*
|
|
104
|
+
* // 典型目录结构:
|
|
105
|
+
* // platform-links/
|
|
106
|
+
* // ├── cursor/
|
|
107
|
+
* // │ └── skills/
|
|
108
|
+
* // │ └── brainstorming -> ../../skills/brainstorming/latest/cursor
|
|
109
|
+
* // ├── opencode/
|
|
110
|
+
* // │ └── skills/
|
|
111
|
+
* // │ └── brainstorming -> ../../skills/brainstorming/latest/opencode
|
|
112
|
+
* // └── ...
|
|
113
|
+
*/
|
|
114
|
+
export function getPlatformLinksDir(): string {
|
|
115
|
+
return path.join(getMarketHome(), SUBDIRS.PLATFORM_LINKS);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 获取本地注册表文件路径
|
|
120
|
+
*
|
|
121
|
+
* 注册表文件存储所有已安装 skill 的元信息,
|
|
122
|
+
* 是一个 JSON 格式的文件
|
|
123
|
+
*
|
|
124
|
+
* @returns {string} 注册表文件的绝对路径
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* const registryPath = getRegistryPath();
|
|
128
|
+
* // '~/.skillmarket/registry.json'
|
|
129
|
+
*/
|
|
130
|
+
export function getRegistryPath(): string {
|
|
131
|
+
return path.join(getMarketHome(), REGISTRY_FILE);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// -----------------------------------------------------------------------------
|
|
135
|
+
// 目录创建函数
|
|
136
|
+
// -----------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* 确保 SkillMarket 所有必要目录都已创建
|
|
140
|
+
*
|
|
141
|
+
* 在首次使用或安装 skill 之前调用此函数,
|
|
142
|
+
* 确保所有目录结构都存在
|
|
143
|
+
*
|
|
144
|
+
* @returns {Promise<void>} 创建完成后 resolve
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* // 安装 skill 前确保目录存在
|
|
148
|
+
* await ensureMarketDirs();
|
|
149
|
+
*
|
|
150
|
+
* // 这会依次创建:
|
|
151
|
+
* // ~/.skillmarket/cache/
|
|
152
|
+
* // ~/.skillmarket/skills/
|
|
153
|
+
* // ~/.skillmarket/platform-links/
|
|
154
|
+
*/
|
|
155
|
+
export async function ensureMarketDirs(): Promise<void> {
|
|
156
|
+
// 使用 fs-extra 的 ensureDir 确保目录存在
|
|
157
|
+
// 如果目录已存在则不进行任何操作
|
|
158
|
+
// 如果父目录不存在则递归创建
|
|
159
|
+
|
|
160
|
+
await fs.ensureDir(getCacheDir());
|
|
161
|
+
await fs.ensureDir(getSkillsDir());
|
|
162
|
+
await fs.ensureDir(getPlatformLinksDir());
|
|
163
|
+
|
|
164
|
+
// 注意: 注册表目录通过 getRegistryPath() 获取路径,
|
|
165
|
+
// 实际文件由 registry.ts 模块在写入时自动创建
|
|
166
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* SkillMarket 平台检测模块
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* 本模块负责检测当前运行的环境是哪个 AI 编程工具平台。
|
|
7
|
+
* 通过检查环境变量来判断平台类型。
|
|
8
|
+
*
|
|
9
|
+
* 支持的平台:
|
|
10
|
+
* - Cursor IDE
|
|
11
|
+
* - Visual Studio Code
|
|
12
|
+
* - OpenAI Codex
|
|
13
|
+
* - OpenCode
|
|
14
|
+
* - Claude Code
|
|
15
|
+
* - Antigravity
|
|
16
|
+
*
|
|
17
|
+
* @module utils/platform
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
// -----------------------------------------------------------------------------
|
|
21
|
+
// 导入依赖
|
|
22
|
+
// -----------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
import { PLATFORMS } from '../constants.js';
|
|
25
|
+
|
|
26
|
+
// -----------------------------------------------------------------------------
|
|
27
|
+
// 类型定义
|
|
28
|
+
// -----------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 平台类型
|
|
32
|
+
*
|
|
33
|
+
* 从 PLATFORMS 常量推断出的联合类型,
|
|
34
|
+
* 表示所有支持的平台
|
|
35
|
+
*
|
|
36
|
+
* @typedef {typeof PLATFORMS[number]} Platform
|
|
37
|
+
*/
|
|
38
|
+
export type Platform = typeof PLATFORMS[number];
|
|
39
|
+
|
|
40
|
+
// -----------------------------------------------------------------------------
|
|
41
|
+
// 平台检测函数
|
|
42
|
+
// -----------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 检测当前运行环境所属的平台
|
|
46
|
+
*
|
|
47
|
+
* 通过检查环境变量来判断当前运行在哪个 AI 编程工具中:
|
|
48
|
+
*
|
|
49
|
+
* | 环境变量 | 平台 |
|
|
50
|
+
* |---------|------|
|
|
51
|
+
* | OPENCODE | opencode |
|
|
52
|
+
* | CURSOR | cursor |
|
|
53
|
+
* | VSCODE | vscode |
|
|
54
|
+
* | CLAUDE_CODE | claude |
|
|
55
|
+
* | ANTIGRAVITY | antigravity |
|
|
56
|
+
* | (默认) | codex |
|
|
57
|
+
*
|
|
58
|
+
* @returns {Platform} 检测到的平台标识符
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // 在 Cursor 中运行
|
|
62
|
+
* const platform = detectPlatform();
|
|
63
|
+
* console.log(platform); // 'cursor'
|
|
64
|
+
*
|
|
65
|
+
* // 在 OpenCode 中运行
|
|
66
|
+
* const platform = detectPlatform();
|
|
67
|
+
* console.log(platform); // 'opencode'
|
|
68
|
+
*/
|
|
69
|
+
export function detectPlatform(): Platform {
|
|
70
|
+
// 按优先级检查环境变量
|
|
71
|
+
// 一旦找到匹配就立即返回
|
|
72
|
+
|
|
73
|
+
// OpenCode 环境检测
|
|
74
|
+
if (process.env.OPENCODE) return 'opencode';
|
|
75
|
+
|
|
76
|
+
// Cursor 环境检测
|
|
77
|
+
if (process.env.CURSOR) return 'cursor';
|
|
78
|
+
|
|
79
|
+
// VSCode 环境检测
|
|
80
|
+
if (process.env.VSCODE) return 'vscode';
|
|
81
|
+
|
|
82
|
+
// Claude Code 环境检测
|
|
83
|
+
if (process.env.CLAUDE_CODE) return 'claude';
|
|
84
|
+
|
|
85
|
+
// Antigravity 环境检测
|
|
86
|
+
if (process.env.ANTIGRAVITY) return 'antigravity';
|
|
87
|
+
|
|
88
|
+
// 默认返回 codex(作为通用 fallback)
|
|
89
|
+
return 'codex';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 验证平台名称是否有效
|
|
94
|
+
*
|
|
95
|
+
* 使用类型守卫(Type Guard)模式,
|
|
96
|
+
* 可以在运行时验证字符串是否是有效的平台标识符
|
|
97
|
+
*
|
|
98
|
+
* @param {string} name - 待验证的平台名称
|
|
99
|
+
* @returns {boolean} 如果是有效平台返回 true,否则返回 false
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* if (isValidPlatform('opencode')) {
|
|
103
|
+
* // 这里 TypeScript 知道 name 的类型收窄为 Platform
|
|
104
|
+
* console.log(`Valid platform: ${name}`);
|
|
105
|
+
* }
|
|
106
|
+
*/
|
|
107
|
+
export function isValidPlatform(name: string): name is Platform {
|
|
108
|
+
// Array.includes 需要类型断言,因为我们使用 as const 定义的数组
|
|
109
|
+
return PLATFORMS.includes(name as Platform);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 从用户输入获取平台类型
|
|
114
|
+
*
|
|
115
|
+
* 将用户输入转换为有效的 Platform 类型,
|
|
116
|
+
* 如果输入无效则返回 null
|
|
117
|
+
*
|
|
118
|
+
* @param {string} name - 用户输入的平台名称
|
|
119
|
+
* @returns {Platform | null} 有效的平台或 null
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* const platform = getPlatformFromInput('OpenCode');
|
|
123
|
+
* // 返回 'opencode'(小写化)
|
|
124
|
+
*
|
|
125
|
+
* const invalid = getPlatformFromInput('unknown');
|
|
126
|
+
* // 返回 null
|
|
127
|
+
*/
|
|
128
|
+
export function getPlatformFromInput(name: string): Platform | null {
|
|
129
|
+
// 先转为小写,再验证是否有效
|
|
130
|
+
const lowerName = name.toLowerCase();
|
|
131
|
+
|
|
132
|
+
// 如果是有效平台,返回小写版本
|
|
133
|
+
if (isValidPlatform(lowerName)) {
|
|
134
|
+
return lowerName as Platform;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 无效输入返回 null
|
|
138
|
+
return null;
|
|
139
|
+
}
|
package/tsconfig.json
ADDED
package/tsup.config.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineConfig } from 'tsup';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: ['src/index.ts'],
|
|
5
|
+
format: ['esm'],
|
|
6
|
+
dts: true,
|
|
7
|
+
banner: {
|
|
8
|
+
/**
|
|
9
|
+
* 添加 shebang 到编译后的输出
|
|
10
|
+
*
|
|
11
|
+
* 注意: tsup 的 banner 选项会在模块内容前添加字符串,
|
|
12
|
+
* 这里用 JSON 格式传递以确保正确处理
|
|
13
|
+
*/
|
|
14
|
+
js: '#!/usr/bin/env node'
|
|
15
|
+
},
|
|
16
|
+
/**
|
|
17
|
+
* 禁用 shims 以避免潜在的兼容性问题
|
|
18
|
+
* shims 会自动为某些 Node.js 模块提供垫片,
|
|
19
|
+
* 但可能与我们的场景不兼容
|
|
20
|
+
*/
|
|
21
|
+
shims: false
|
|
22
|
+
});
|
|
Binary file
|