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.
Files changed (55) hide show
  1. package/assets/skills/xwang/SKILL.md +112 -0
  2. package/assets/skills/xwang/scripts/xwang-env.sh +48 -0
  3. package/assets/skills/xwang/scripts/xwang-guard.sh +530 -0
  4. package/assets/skills/xwang/scripts/xwang-state.sh +374 -0
  5. package/assets/skills/xwang-archive/SKILL.md +86 -0
  6. package/assets/skills/xwang-build/REFERENCE.md +94 -0
  7. package/assets/skills/xwang-build/SKILL.md +113 -0
  8. package/assets/skills/xwang-design/SKILL.md +104 -0
  9. package/assets/skills/xwang-hotfix/SKILL.md +102 -0
  10. package/assets/skills/xwang-open/SKILL.md +108 -0
  11. package/assets/skills/xwang-open/scripts/xwang-open-check.sh +197 -0
  12. package/assets/skills/xwang-tweak/SKILL.md +99 -0
  13. package/assets/skills/xwang-verify/SKILL.md +112 -0
  14. package/bin/xwang.js +3 -0
  15. package/dist/cli/index.d.ts +2 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +30 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/commands/init.d.ts +9 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +238 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/core/detect.d.ts +6 -0
  24. package/dist/core/detect.d.ts.map +1 -0
  25. package/dist/core/detect.js +74 -0
  26. package/dist/core/detect.js.map +1 -0
  27. package/dist/core/mattpocock.d.ts +6 -0
  28. package/dist/core/mattpocock.d.ts.map +1 -0
  29. package/dist/core/mattpocock.js +82 -0
  30. package/dist/core/mattpocock.js.map +1 -0
  31. package/dist/core/openspec.d.ts +3 -0
  32. package/dist/core/openspec.d.ts.map +1 -0
  33. package/dist/core/openspec.js +178 -0
  34. package/dist/core/openspec.js.map +1 -0
  35. package/dist/core/package-manager.d.ts +8 -0
  36. package/dist/core/package-manager.d.ts.map +1 -0
  37. package/dist/core/package-manager.js +62 -0
  38. package/dist/core/package-manager.js.map +1 -0
  39. package/dist/core/platforms.d.ts +22 -0
  40. package/dist/core/platforms.d.ts.map +1 -0
  41. package/dist/core/platforms.js +23 -0
  42. package/dist/core/platforms.js.map +1 -0
  43. package/dist/core/superpowers.d.ts +5 -0
  44. package/dist/core/superpowers.d.ts.map +1 -0
  45. package/dist/core/superpowers.js +75 -0
  46. package/dist/core/superpowers.js.map +1 -0
  47. package/dist/core/types.d.ts +2 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js +2 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/utils/file-system.d.ts +5 -0
  52. package/dist/utils/file-system.d.ts.map +1 -0
  53. package/dist/utils/file-system.js +41 -0
  54. package/dist/utils/file-system.js.map +1 -0
  55. 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EACL,oBAAoB,EACpB,4BAA4B,GAE7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AAErF,MAAM,sBAAsB,GAAG;IAC7B,SAAS;IACT,SAAS;IACT,KAAK;IACL,UAAU;IACV,OAAO;IACP,IAAI;IACJ,MAAM;IACN,SAAS;IACT,cAAc;IACd,QAAQ;IACR,SAAS;CACD,CAAC;AAEX,MAAM,oBAAoB,GACxB,IAAI,CAAC,SAAS,CACZ;IACE,YAAY,EAAE,EAAE;IAChB,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,CAAC,GAAG,sBAAsB,CAAC;CACvC,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AAEX,SAAS,2BAA2B;IAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,aAAa,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,6BAA6B;IACpC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5D,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAE7F,OAAO;YACL,UAAU;YACV,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,eAAe,EAAE,UAAU;aAC5B;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAQD,SAAS,gCAAgC;IACvC,MAAM,UAAU,GAAG,4BAA4B,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC;IAChD,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC;QACH,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAE5D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA2B;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACtD,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAmB,EAAE,WAAmB;IACvE,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,cAAc,GAAmB,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,4BAA4B,CACvD,cAAc,EACd,6BAA6B,EAC7B,KAAK,KAAK,QAAQ,CACnB,CAAC;QACF,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QACH,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAI,KAAe,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,OAAiB,EACjB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,uEAAuE,CACxE,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAEnE,IAAI,UAA8B,CAAC;IACnC,IAAI,YAAY,GAAwB,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;QACpD,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;QAEpC,YAAY,GAAG,gCAAgC,EAAE,CAAC;QAElD,YAAY,CACV,UAAU,EACV,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EACzE;YACE,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAI,KAAe,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -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,2 @@
1
+ export type InstallScope = 'project' | 'global';
2
+ //# sourceMappingURL=types.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }