xwang 0.0.1
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/assets/skills/xwang/SKILL.md +112 -0
- package/assets/skills/xwang/scripts/xwang-env.sh +48 -0
- package/assets/skills/xwang/scripts/xwang-guard.sh +530 -0
- package/assets/skills/xwang/scripts/xwang-state.sh +374 -0
- package/assets/skills/xwang-archive/SKILL.md +86 -0
- package/assets/skills/xwang-build/REFERENCE.md +94 -0
- package/assets/skills/xwang-build/SKILL.md +113 -0
- package/assets/skills/xwang-design/SKILL.md +104 -0
- package/assets/skills/xwang-hotfix/SKILL.md +102 -0
- package/assets/skills/xwang-open/SKILL.md +108 -0
- package/assets/skills/xwang-open/scripts/xwang-open-check.sh +197 -0
- package/assets/skills/xwang-tweak/SKILL.md +99 -0
- package/assets/skills/xwang-verify/SKILL.md +112 -0
- package/bin/xwang.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +238 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/core/detect.d.ts +6 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +74 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/mattpocock.d.ts +6 -0
- package/dist/core/mattpocock.d.ts.map +1 -0
- package/dist/core/mattpocock.js +82 -0
- package/dist/core/mattpocock.js.map +1 -0
- package/dist/core/openspec.d.ts +3 -0
- package/dist/core/openspec.d.ts.map +1 -0
- package/dist/core/openspec.js +178 -0
- package/dist/core/openspec.js.map +1 -0
- package/dist/core/package-manager.d.ts +8 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +62 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/platforms.d.ts +22 -0
- package/dist/core/platforms.d.ts.map +1 -0
- package/dist/core/platforms.js +23 -0
- package/dist/core/platforms.js.map +1 -0
- package/dist/core/superpowers.d.ts +5 -0
- package/dist/core/superpowers.d.ts.map +1 -0
- package/dist/core/superpowers.js +75 -0
- package/dist/core/superpowers.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +5 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +41 -0
- package/dist/utils/file-system.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { detectPackageManager, getPackageManagerInstallArgs, } from './package-manager.js';
|
|
6
|
+
import { PLATFORMS } from './platforms.js';
|
|
7
|
+
const VALID_TOOL_IDS = new Set(PLATFORMS.map((platform) => platform.openspecToolId));
|
|
8
|
+
const ALL_OPENSPEC_WORKFLOWS = [
|
|
9
|
+
'propose',
|
|
10
|
+
'explore',
|
|
11
|
+
'new',
|
|
12
|
+
'continue',
|
|
13
|
+
'apply',
|
|
14
|
+
'ff',
|
|
15
|
+
'sync',
|
|
16
|
+
'archive',
|
|
17
|
+
'bulk-archive',
|
|
18
|
+
'verify',
|
|
19
|
+
'onboard',
|
|
20
|
+
];
|
|
21
|
+
const ALL_WORKFLOWS_CONFIG = JSON.stringify({
|
|
22
|
+
featureFlags: {},
|
|
23
|
+
profile: 'custom',
|
|
24
|
+
delivery: 'both',
|
|
25
|
+
workflows: [...ALL_OPENSPEC_WORKFLOWS],
|
|
26
|
+
}, null, 2) + '\n';
|
|
27
|
+
function getOpenSpecDefaultConfigDir() {
|
|
28
|
+
const platform = os.platform();
|
|
29
|
+
if (platform === 'win32') {
|
|
30
|
+
const appData = process.env.APPDATA;
|
|
31
|
+
if (appData) {
|
|
32
|
+
return path.join(appData, 'openspec');
|
|
33
|
+
}
|
|
34
|
+
return path.join(os.homedir(), 'AppData', 'Roaming', 'openspec');
|
|
35
|
+
}
|
|
36
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME;
|
|
37
|
+
if (xdgConfig) {
|
|
38
|
+
return path.join(xdgConfig, 'openspec');
|
|
39
|
+
}
|
|
40
|
+
return path.join(os.homedir(), '.config', 'openspec');
|
|
41
|
+
}
|
|
42
|
+
function getOpenSpecDefaultConfigPath() {
|
|
43
|
+
return path.join(getOpenSpecDefaultConfigDir(), 'config.json');
|
|
44
|
+
}
|
|
45
|
+
function createOpenSpecAllWorkflowsEnv() {
|
|
46
|
+
const configHome = fs.mkdtempSync(path.join(os.tmpdir(), 'xwang-openspec-profile-'));
|
|
47
|
+
try {
|
|
48
|
+
const openspecConfigDir = path.join(configHome, 'openspec');
|
|
49
|
+
fs.mkdirSync(openspecConfigDir, { recursive: true });
|
|
50
|
+
fs.writeFileSync(path.join(openspecConfigDir, 'config.json'), ALL_WORKFLOWS_CONFIG, 'utf-8');
|
|
51
|
+
return {
|
|
52
|
+
configHome,
|
|
53
|
+
env: {
|
|
54
|
+
...process.env,
|
|
55
|
+
XDG_CONFIG_HOME: configHome,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
fs.rmSync(configHome, { recursive: true, force: true });
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function writeAllWorkflowsToDefaultConfig() {
|
|
65
|
+
const configPath = getOpenSpecDefaultConfigPath();
|
|
66
|
+
const backupPath = configPath + '.xwang-backup';
|
|
67
|
+
let hadExisting = false;
|
|
68
|
+
try {
|
|
69
|
+
hadExisting = fs.existsSync(configPath);
|
|
70
|
+
if (hadExisting) {
|
|
71
|
+
fs.copyFileSync(configPath, backupPath);
|
|
72
|
+
}
|
|
73
|
+
const configDir = path.dirname(configPath);
|
|
74
|
+
if (!fs.existsSync(configDir)) {
|
|
75
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
fs.writeFileSync(configPath, ALL_WORKFLOWS_CONFIG, 'utf-8');
|
|
78
|
+
return { configPath, backupPath, hadExisting };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
if (hadExisting) {
|
|
82
|
+
try {
|
|
83
|
+
fs.unlinkSync(backupPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Best-effort cleanup
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function restoreDefaultConfig(backup) {
|
|
93
|
+
if (!backup)
|
|
94
|
+
return;
|
|
95
|
+
try {
|
|
96
|
+
if (backup.hadExisting) {
|
|
97
|
+
fs.copyFileSync(backup.backupPath, backup.configPath);
|
|
98
|
+
fs.unlinkSync(backup.backupPath);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (fs.existsSync(backup.configPath)) {
|
|
102
|
+
fs.unlinkSync(backup.configPath);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Best-effort restore
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function isCommandAvailable(command) {
|
|
111
|
+
try {
|
|
112
|
+
const checker = process.platform === 'win32' ? 'where' : 'which';
|
|
113
|
+
execFileSync(checker, [command], { stdio: 'ignore', timeout: 10_000 });
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function ensureOpenSpecCli(scope, projectPath) {
|
|
121
|
+
if (isCommandAvailable('openspec')) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
console.log(' 正在安装 OpenSpec CLI...');
|
|
125
|
+
try {
|
|
126
|
+
const packageManager = detectPackageManager(projectPath);
|
|
127
|
+
const { executable, args } = getPackageManagerInstallArgs(packageManager, '@fission-ai/openspec@latest', scope === 'global');
|
|
128
|
+
execFileSync(executable, args, {
|
|
129
|
+
cwd: projectPath,
|
|
130
|
+
stdio: 'inherit',
|
|
131
|
+
timeout: 120_000,
|
|
132
|
+
shell: process.platform === 'win32',
|
|
133
|
+
});
|
|
134
|
+
return isCommandAvailable('openspec');
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error(' 安装 OpenSpec CLI 失败:' + error.message);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export async function installOpenSpec(projectPath, toolIds, scope) {
|
|
142
|
+
const cliReady = await ensureOpenSpecCli(scope, projectPath);
|
|
143
|
+
if (!cliReady) {
|
|
144
|
+
console.error(' OpenSpec CLI 不可用。请手动安装:npm install -g @fission-ai/openspec@latest');
|
|
145
|
+
return 'failed';
|
|
146
|
+
}
|
|
147
|
+
const unknownIds = toolIds.filter((id) => !VALID_TOOL_IDS.has(id));
|
|
148
|
+
if (unknownIds.length > 0) {
|
|
149
|
+
throw new Error('Unknown tool IDs: ' + unknownIds.join(', '));
|
|
150
|
+
}
|
|
151
|
+
const targetPath = scope === 'global' ? os.homedir() : projectPath;
|
|
152
|
+
let configHome;
|
|
153
|
+
let configBackup = null;
|
|
154
|
+
try {
|
|
155
|
+
const openspecEnv = createOpenSpecAllWorkflowsEnv();
|
|
156
|
+
configHome = openspecEnv.configHome;
|
|
157
|
+
configBackup = writeAllWorkflowsToDefaultConfig();
|
|
158
|
+
execFileSync('openspec', ['init', targetPath, '--tools', toolIds.join(','), '--profile', 'custom'], {
|
|
159
|
+
cwd: projectPath,
|
|
160
|
+
env: openspecEnv.env,
|
|
161
|
+
stdio: 'inherit',
|
|
162
|
+
timeout: 120_000,
|
|
163
|
+
shell: process.platform === 'win32',
|
|
164
|
+
});
|
|
165
|
+
return 'installed';
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error(' OpenSpec 初始化失败:' + error.message);
|
|
169
|
+
return 'failed';
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
restoreDefaultConfig(configBackup);
|
|
173
|
+
if (configHome) {
|
|
174
|
+
fs.rmSync(configHome, { recursive: true, force: true });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=openspec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';
|
|
2
|
+
export declare function getExecutableName(command: string): string;
|
|
3
|
+
export declare function detectPackageManager(projectPath: string): PackageManager;
|
|
4
|
+
export declare function getPackageManagerInstallArgs(packageManager: PackageManager, packageName: string, isGlobal: boolean): {
|
|
5
|
+
executable: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/core/package-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAuBxE;AAED,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,GAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBxC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export function getExecutableName(command) {
|
|
4
|
+
return process.platform === 'win32' ? `${command}.cmd` : command;
|
|
5
|
+
}
|
|
6
|
+
export function detectPackageManager(projectPath) {
|
|
7
|
+
try {
|
|
8
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
|
9
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
10
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
11
|
+
const packageManager = packageJson.packageManager;
|
|
12
|
+
if (typeof packageManager === 'string') {
|
|
13
|
+
if (packageManager.startsWith('pnpm'))
|
|
14
|
+
return 'pnpm';
|
|
15
|
+
if (packageManager.startsWith('yarn'))
|
|
16
|
+
return 'yarn';
|
|
17
|
+
if (packageManager.startsWith('npm'))
|
|
18
|
+
return 'npm';
|
|
19
|
+
if (packageManager.startsWith('bun'))
|
|
20
|
+
return 'bun';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Fall through to lock file detection
|
|
26
|
+
}
|
|
27
|
+
if (fs.existsSync(path.join(projectPath, 'pnpm-lock.yaml')))
|
|
28
|
+
return 'pnpm';
|
|
29
|
+
if (fs.existsSync(path.join(projectPath, 'yarn.lock')))
|
|
30
|
+
return 'yarn';
|
|
31
|
+
if (fs.existsSync(path.join(projectPath, 'bun.lockb')))
|
|
32
|
+
return 'bun';
|
|
33
|
+
if (fs.existsSync(path.join(projectPath, 'package-lock.json')))
|
|
34
|
+
return 'npm';
|
|
35
|
+
return 'npm';
|
|
36
|
+
}
|
|
37
|
+
export function getPackageManagerInstallArgs(packageManager, packageName, isGlobal) {
|
|
38
|
+
switch (packageManager) {
|
|
39
|
+
case 'pnpm':
|
|
40
|
+
return {
|
|
41
|
+
executable: getExecutableName('pnpm'),
|
|
42
|
+
args: isGlobal ? ['add', '-g', packageName] : ['add', packageName],
|
|
43
|
+
};
|
|
44
|
+
case 'yarn':
|
|
45
|
+
return {
|
|
46
|
+
executable: getExecutableName('yarn'),
|
|
47
|
+
args: isGlobal ? ['global', 'add', packageName] : ['add', packageName],
|
|
48
|
+
};
|
|
49
|
+
case 'bun':
|
|
50
|
+
return {
|
|
51
|
+
executable: getExecutableName('bun'),
|
|
52
|
+
args: isGlobal ? ['add', '-g', packageName] : ['add', packageName],
|
|
53
|
+
};
|
|
54
|
+
case 'npm':
|
|
55
|
+
default:
|
|
56
|
+
return {
|
|
57
|
+
executable: getExecutableName('npm'),
|
|
58
|
+
args: isGlobal ? ['install', '-g', packageName] : ['install', packageName],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/core/package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { InstallScope } from './types.js';
|
|
2
|
+
export interface Platform {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
skillsDir: string;
|
|
6
|
+
globalSkillsDir?: string;
|
|
7
|
+
/** Paths that indicate the platform is already in use. */
|
|
8
|
+
detectionPaths?: string[];
|
|
9
|
+
openspecToolId: string;
|
|
10
|
+
/** Platform's rules/instructions subdirectory relative to skillsDir. Omit if unsupported. */
|
|
11
|
+
rulesDir?: string;
|
|
12
|
+
/** Rule file format: 'md' = plain markdown, 'mdc' = Cursor MDC with frontmatter. */
|
|
13
|
+
rulesFormat?: 'md' | 'mdc';
|
|
14
|
+
/** Whether this platform supports PreToolUse hooks. */
|
|
15
|
+
supportsHooks?: boolean;
|
|
16
|
+
/** Hook configuration format. */
|
|
17
|
+
hookFormat?: 'claude-code';
|
|
18
|
+
}
|
|
19
|
+
export declare function getPlatformSkillsDir(platform: Platform, scope: InstallScope): string;
|
|
20
|
+
export declare function getPlatformSkillsDirs(platform: Platform, scope: InstallScope): string[];
|
|
21
|
+
export declare const PLATFORMS: Platform[];
|
|
22
|
+
//# sourceMappingURL=platforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/core/platforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,WAAW,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IAC3B,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iCAAiC;IACjC,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAKpF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CAEvF;AAED,eAAO,MAAM,SAAS,EAAE,QAAQ,EAY/B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function getPlatformSkillsDir(platform, scope) {
|
|
2
|
+
if (scope === 'global' && platform.globalSkillsDir) {
|
|
3
|
+
return platform.globalSkillsDir;
|
|
4
|
+
}
|
|
5
|
+
return platform.skillsDir;
|
|
6
|
+
}
|
|
7
|
+
export function getPlatformSkillsDirs(platform, scope) {
|
|
8
|
+
return [getPlatformSkillsDir(platform, scope)];
|
|
9
|
+
}
|
|
10
|
+
export const PLATFORMS = [
|
|
11
|
+
{
|
|
12
|
+
id: 'claude',
|
|
13
|
+
name: 'Claude Code',
|
|
14
|
+
skillsDir: '.claude',
|
|
15
|
+
globalSkillsDir: '.claude',
|
|
16
|
+
openspecToolId: 'claude',
|
|
17
|
+
rulesDir: 'rules',
|
|
18
|
+
rulesFormat: 'md',
|
|
19
|
+
supportsHooks: true,
|
|
20
|
+
hookFormat: 'claude-code',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
//# sourceMappingURL=platforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../src/core/platforms.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,KAAmB;IAC1E,IAAI,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QACnD,OAAO,QAAQ,CAAC,eAAe,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAkB,EAAE,KAAmB;IAC3E,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,SAAS;QACpB,eAAe,EAAE,SAAS;QAC1B,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,aAAa;KAC1B;CACF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { InstallScope } from './types.js';
|
|
2
|
+
export declare function resolveSuperpowersSkillsDir(projectPath: string, scope: InstallScope): string | null;
|
|
3
|
+
export declare function installSuperpowers(projectPath: string, scope: InstallScope): Promise<'installed' | 'failed' | 'skipped'>;
|
|
4
|
+
export declare function listSuperpowersSkills(skillsDir: string): string[];
|
|
5
|
+
//# sourceMappingURL=superpowers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsC/C,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,GAClB,MAAM,GAAG,IAAI,CAQf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CAwB7C;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAQjE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { detectPackageManager, getExecutableName, getPackageManagerInstallArgs, } from './package-manager.js';
|
|
5
|
+
const PACKAGE_NAME = 'xwang-superpowers';
|
|
6
|
+
function resolveGlobalNodeModules() {
|
|
7
|
+
try {
|
|
8
|
+
return execFileSync(getExecutableName('npm'), ['root', '-g'], {
|
|
9
|
+
encoding: 'utf-8',
|
|
10
|
+
stdio: 'ignore',
|
|
11
|
+
timeout: 10_000,
|
|
12
|
+
shell: process.platform === 'win32',
|
|
13
|
+
}).trim();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return '';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function resolvePackageRoot(projectPath, scope) {
|
|
20
|
+
if (scope === 'project') {
|
|
21
|
+
const projectPackage = path.join(projectPath, 'node_modules', PACKAGE_NAME);
|
|
22
|
+
if (fs.existsSync(path.join(projectPackage, 'package.json'))) {
|
|
23
|
+
return projectPackage;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (scope === 'global') {
|
|
27
|
+
const globalModules = resolveGlobalNodeModules();
|
|
28
|
+
if (globalModules) {
|
|
29
|
+
const globalPackage = path.join(globalModules, PACKAGE_NAME);
|
|
30
|
+
if (fs.existsSync(path.join(globalPackage, 'package.json'))) {
|
|
31
|
+
return globalPackage;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
export function resolveSuperpowersSkillsDir(projectPath, scope) {
|
|
38
|
+
const packageRoot = resolvePackageRoot(projectPath, scope);
|
|
39
|
+
if (!packageRoot) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const skillsDir = path.join(packageRoot, 'skills');
|
|
43
|
+
return fs.existsSync(skillsDir) ? skillsDir : null;
|
|
44
|
+
}
|
|
45
|
+
export async function installSuperpowers(projectPath, scope) {
|
|
46
|
+
if (resolvePackageRoot(projectPath, scope)) {
|
|
47
|
+
return 'skipped';
|
|
48
|
+
}
|
|
49
|
+
const packageManager = detectPackageManager(projectPath);
|
|
50
|
+
const { executable, args } = getPackageManagerInstallArgs(packageManager, `${PACKAGE_NAME}@latest`, scope === 'global');
|
|
51
|
+
try {
|
|
52
|
+
execFileSync(executable, args, {
|
|
53
|
+
cwd: projectPath,
|
|
54
|
+
stdio: 'inherit',
|
|
55
|
+
timeout: 120_000,
|
|
56
|
+
shell: process.platform === 'win32',
|
|
57
|
+
});
|
|
58
|
+
return resolvePackageRoot(projectPath, scope) ? 'installed' : 'failed';
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(' 安装 Superpowers 失败:' + error.message);
|
|
62
|
+
return 'failed';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function listSuperpowersSkills(skillsDir) {
|
|
66
|
+
try {
|
|
67
|
+
return fs
|
|
68
|
+
.readdirSync(skillsDir)
|
|
69
|
+
.filter((entry) => fs.statSync(path.join(skillsDir, entry)).isDirectory());
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=superpowers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
2
|
+
export declare function readDir(dirPath: string): Promise<string[]>;
|
|
3
|
+
export declare function ensureDir(dirPath: string): Promise<void>;
|
|
4
|
+
export declare function copySkill(sourcePath: string, targetPath: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=file-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUhE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAiBD,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { promises as fs, constants } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export async function fileExists(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
await fs.access(filePath);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function readDir(dirPath) {
|
|
13
|
+
try {
|
|
14
|
+
return await fs.readdir(dirPath);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const code = error?.code;
|
|
18
|
+
if (code === 'ENOENT' || code === 'ENOTDIR') {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function ensureDir(dirPath) {
|
|
25
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
async function copyFileOrDir(sourcePath, targetPath) {
|
|
28
|
+
const stat = await fs.stat(sourcePath);
|
|
29
|
+
if (stat.isDirectory()) {
|
|
30
|
+
await fs.mkdir(targetPath, { recursive: true });
|
|
31
|
+
const entries = await fs.readdir(sourcePath);
|
|
32
|
+
await Promise.all(entries.map((entry) => copyFileOrDir(path.join(sourcePath, entry), path.join(targetPath, entry))));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
await fs.copyFile(sourcePath, targetPath, constants.COPYFILE_FICLONE);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export async function copySkill(sourcePath, targetPath) {
|
|
39
|
+
await copyFileOrDir(sourcePath, targetPath);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=file-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,EAAE,IAAI,CAAC;QACpD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,UAAkB;IACjE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACpB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAC1E,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,UAAkB;IACpE,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "xwang",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "xwang CLI",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"xwang",
|
|
7
|
+
"cli"
|
|
8
|
+
],
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"bin": {
|
|
12
|
+
"xwang": "./bin/xwang.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"bin",
|
|
17
|
+
"assets",
|
|
18
|
+
"!dist/**/*.test.js",
|
|
19
|
+
"!dist/**/__tests__"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "node build.js",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"lint": "eslint src/",
|
|
27
|
+
"lint:fix": "eslint src/ --fix",
|
|
28
|
+
"format": "prettier --write src/",
|
|
29
|
+
"format:check": "prettier --check src/"
|
|
30
|
+
},
|
|
31
|
+
"packageManager": "pnpm@10.18.3",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@eslint/js": "^10.0.1",
|
|
37
|
+
"@types/node": "^24.2.0",
|
|
38
|
+
"eslint": "^10.4.0",
|
|
39
|
+
"prettier": "^3.8.3",
|
|
40
|
+
"typescript": "^5.9.3",
|
|
41
|
+
"typescript-eslint": "^8.59.3",
|
|
42
|
+
"vitest": "^4.1.6"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@inquirer/prompts": "^8.4.3",
|
|
46
|
+
"commander": "^14.0.0",
|
|
47
|
+
"xwang-mattpocock": "^0.1.2",
|
|
48
|
+
"xwang-superpowers": "^1.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|