create-principles-disciple 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Principles Disciple Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # create-principles-disciple
2
+
3
+ Interactive CLI installer for [Principles Disciple](https://github.com/csuzngjh/principles) OpenClaw plugin.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ npx create-principles-disciple
9
+ ```
10
+
11
+ ## Options
12
+
13
+ ```
14
+ --lang <en|zh> Language preference (default: en)
15
+ --force Force overwrite existing installation
16
+ ```
17
+
18
+ ## Commands
19
+
20
+ - `install` - Install OpenClaw plugin (default)
21
+ - `uninstall` - Remove OpenClaw plugin
22
+ - `status` - Show installation status
23
+
24
+ ## Requirements
25
+
26
+ - Node.js >= 18.0.0
27
+ - Claude Code CLI
28
+
29
+ ## License
30
+
31
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Principles Disciple - OpenClaw Plugin Installer
4
+ *
5
+ * 交互式安装/卸载器,支持:
6
+ * - npx create-principles-disciple [install]
7
+ * - npx create-principles-disciple uninstall
8
+ * - npx create-principles-disciple --lang zh --force
9
+ */
10
+ import { Command } from 'commander';
11
+ import * as path from 'path';
12
+ import * as url from 'url';
13
+ import * as os from 'os';
14
+ import { banner, logger } from './utils/logger.js';
15
+ import { runPrompts } from './prompts.js';
16
+ import { install } from './installer.js';
17
+ import { uninstall, checkInstallStatus } from './uninstaller.js';
18
+ import { checkEnvironment } from './utils/env.js';
19
+ // ESM 模块中获取 __dirname
20
+ const __filename = url.fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+ // 插件目录(相对于此文件的上级上级)
23
+ const PLUGIN_DIR = path.resolve(__dirname, '..', '..', 'openclaw-plugin');
24
+ const program = new Command();
25
+ program
26
+ .name('create-principles-disciple')
27
+ .description('Principles Disciple - OpenClaw Plugin Installer/Uninstaller')
28
+ .version('1.0.0');
29
+ // 默认命令:安装
30
+ program
31
+ .command('install', { isDefault: true, hidden: true })
32
+ .description('安装 Principles Disciple 插件')
33
+ .option('-l, --lang <lang>', 'Language (zh/en)', 'zh')
34
+ .option('-f, --force', 'Force overwrite mode', false)
35
+ .option('-s, --smart', 'Smart merge mode (generate .update files)', false)
36
+ .option('-w, --workspace <path>', 'Workspace directory')
37
+ .option('--non-interactive', 'Skip interactive prompts', false)
38
+ .action(async (options) => {
39
+ await runInstall(options);
40
+ });
41
+ // 卸载命令
42
+ program
43
+ .command('uninstall')
44
+ .alias('remove')
45
+ .alias('rm')
46
+ .description('卸载 Principles Disciple 插件(保留用户数据)')
47
+ .option('-f, --force', 'Force uninstall without confirmation', false)
48
+ .action(async (options) => {
49
+ await runUninstall(options);
50
+ });
51
+ // 状态命令
52
+ program
53
+ .command('status')
54
+ .description('检查安装状态')
55
+ .action(async () => {
56
+ await showStatus();
57
+ });
58
+ /**
59
+ * 运行安装
60
+ */
61
+ async function runInstall(options) {
62
+ console.log(banner);
63
+ console.log();
64
+ // 1. 环境检测
65
+ const env = checkEnvironment();
66
+ if (!env.hasNode) {
67
+ logger.error('Node.js 未安装,请先安装 Node.js >= 18');
68
+ process.exit(1);
69
+ }
70
+ logger.success(`Node.js ${env.nodeVersion}`);
71
+ if (!env.hasOpenClaw) {
72
+ logger.warn('OpenClaw 未安装,部分功能可能不可用');
73
+ logger.info('安装指南: https://github.com/openclaw/openclaw');
74
+ }
75
+ else {
76
+ logger.success(`OpenClaw ${env.openclawVersion}`);
77
+ }
78
+ // 2. 解析 CLI 选项
79
+ const cliOptions = {
80
+ language: options.lang,
81
+ workspaceDir: options.workspace,
82
+ };
83
+ // 确定安装模式
84
+ if (options.force) {
85
+ cliOptions.mode = 'force';
86
+ }
87
+ else if (options.smart) {
88
+ cliOptions.mode = 'smart';
89
+ }
90
+ // 3. 运行交互式问答
91
+ let installOptions;
92
+ if (options.nonInteractive) {
93
+ // 非交互模式:使用默认值
94
+ installOptions = {
95
+ language: cliOptions.language || 'zh',
96
+ mode: cliOptions.mode || 'smart',
97
+ workspaceDir: cliOptions.workspaceDir || path.join(os.homedir(), 'clawd'),
98
+ features: ['evolution', 'trust', 'pain'],
99
+ overwriteConfig: false,
100
+ };
101
+ }
102
+ else {
103
+ // 交互模式
104
+ installOptions = await runPrompts(cliOptions);
105
+ }
106
+ // 用户取消
107
+ if (!installOptions) {
108
+ logger.info('安装已取消');
109
+ process.exit(0);
110
+ }
111
+ // 4. 执行安装
112
+ const result = await install(installOptions, PLUGIN_DIR);
113
+ // 5. 显示结果
114
+ if (result.success) {
115
+ console.log();
116
+ logger.success('安装完成!');
117
+ console.log();
118
+ console.log('📁 安装信息:');
119
+ console.log(` 语言: ${installOptions.language}`);
120
+ console.log(` 模式: ${installOptions.mode === 'force' ? '强制覆盖' : '智能合并'}`);
121
+ console.log(` Skills: ${result.skillsCount} 个`);
122
+ console.log(` 模板: ${result.templatesCount} 个`);
123
+ console.log(` 工作区: ${result.workspaceDir}`);
124
+ console.log();
125
+ console.log('🚀 下一步操作:');
126
+ console.log(' 1. 重启 OpenClaw Gateway:');
127
+ console.log(' openclaw gateway --force');
128
+ console.log();
129
+ console.log(' 2. 在项目中初始化核心文件:');
130
+ console.log(' openclaw skill init-strategy');
131
+ }
132
+ else {
133
+ logger.error(`安装失败: ${result.error}`);
134
+ process.exit(1);
135
+ }
136
+ }
137
+ /**
138
+ * 运行卸载
139
+ */
140
+ async function runUninstall(options) {
141
+ console.log(banner);
142
+ console.log();
143
+ logger.info('准备卸载 Principles Disciple...\n');
144
+ const result = await uninstall({
145
+ force: options.force,
146
+ });
147
+ if (!result.success) {
148
+ logger.error(`卸载失败: ${result.error}`);
149
+ process.exit(1);
150
+ }
151
+ }
152
+ /**
153
+ * 显示状态
154
+ */
155
+ async function showStatus() {
156
+ console.log(banner);
157
+ console.log();
158
+ const status = checkInstallStatus();
159
+ console.log('📊 安装状态:\n');
160
+ for (const p of status.paths) {
161
+ const icon = p.type === 'dir' ? '📁' : '📄';
162
+ const statusIcon = p.exists ? '✅' : '❌';
163
+ console.log(` ${statusIcon} ${icon} ${p.name}`);
164
+ console.log(` ${p.path}`);
165
+ }
166
+ console.log();
167
+ if (status.isInstalled) {
168
+ logger.success('Principles Disciple 已安装');
169
+ console.log('\n 💡 卸载时将保留您的个人数据(MD文件、记忆、状态等)');
170
+ }
171
+ else {
172
+ logger.warn('Principles Disciple 未安装');
173
+ console.log('\n 运行以下命令安装:');
174
+ console.log(' npx create-principles-disciple');
175
+ }
176
+ }
177
+ // 错误处理
178
+ process.on('uncaughtException', (error) => {
179
+ if (error instanceof Error && error.name === 'ExitPromptError') {
180
+ logger.info('👋 再见!');
181
+ }
182
+ else {
183
+ logger.error(`未捕获的错误: ${error.message}`);
184
+ process.exit(1);
185
+ }
186
+ });
187
+ // 解析参数
188
+ program.parse(process.argv);
189
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { InstallOptions } from './prompts.js';
2
+ export interface InstallResult {
3
+ success: boolean;
4
+ pluginDir: string;
5
+ workspaceDir: string;
6
+ skillsCount: number;
7
+ templatesCount: number;
8
+ error?: string;
9
+ }
10
+ /**
11
+ * 主安装流程
12
+ */
13
+ export declare function install(options: InstallOptions, pluginDir: string): Promise<InstallResult>;
14
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoQD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiEhG"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * 安装器模块
3
+ */
4
+ import { existsSync, readdirSync, statSync, readFileSync, writeFileSync } from 'fs';
5
+ import fse from 'fs-extra';
6
+ import * as path from 'path';
7
+ import { execSync } from 'child_process';
8
+ import ora from 'ora';
9
+ import { logger } from './utils/logger.js';
10
+ import { getOpenClawConfigDir, getPluginExtDir } from './utils/env.js';
11
+ /**
12
+ * 获取模板目录
13
+ */
14
+ function getTemplatesDir(pluginDir, language) {
15
+ return path.join(pluginDir, 'templates', 'langs', language);
16
+ }
17
+ /**
18
+ * 清理旧版本
19
+ */
20
+ async function cleanOldVersion() {
21
+ const extDir = getPluginExtDir();
22
+ if (existsSync(extDir)) {
23
+ await fse.remove(extDir);
24
+ logger.info(`已删除旧版本: ${extDir}`);
25
+ }
26
+ }
27
+ /**
28
+ * 构建插件
29
+ */
30
+ async function buildPlugin(pluginDir) {
31
+ logger.step('构建插件');
32
+ // 安装依赖
33
+ execSync('npm install --silent', { cwd: pluginDir, stdio: 'inherit' });
34
+ // 构建
35
+ execSync('npm run build', { cwd: pluginDir, stdio: 'inherit' });
36
+ logger.success('插件构建完成');
37
+ }
38
+ /**
39
+ * 安装插件到 OpenClaw
40
+ */
41
+ async function installPlugin(pluginDir) {
42
+ logger.step('安装插件到 OpenClaw');
43
+ const extDir = getPluginExtDir();
44
+ const configDir = getOpenClawConfigDir();
45
+ const configPath = path.join(configDir, 'openclaw.json');
46
+ // 方案一:尝试使用 openclaw plugins install(静默模式)
47
+ try {
48
+ const result = execSync(`openclaw plugins install "${pluginDir}" 2>&1`, { encoding: 'utf-8', timeout: 60000 });
49
+ // 检查是否安装成功
50
+ if (existsSync(extDir) && existsSync(path.join(extDir, 'dist', 'index.js'))) {
51
+ logger.success('插件安装成功 (openclaw)');
52
+ return;
53
+ }
54
+ }
55
+ catch {
56
+ // 继续使用备用方案
57
+ }
58
+ // 方案二:手动复制 + 更新配置
59
+ logger.info('使用手动安装方式...');
60
+ // 1. 复制插件文件
61
+ await fse.ensureDir(extDir);
62
+ await fse.copy(pluginDir, extDir, { overwrite: true });
63
+ // 2. 读取并更新 openclaw.json
64
+ if (existsSync(configPath)) {
65
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
66
+ // 添加到 allow 列表
67
+ if (!config.plugins)
68
+ config.plugins = {};
69
+ if (!config.plugins.allow)
70
+ config.plugins.allow = [];
71
+ if (!config.plugins.allow.includes('principles-disciple')) {
72
+ config.plugins.allow.push('principles-disciple');
73
+ }
74
+ // 添加到 entries
75
+ if (!config.plugins.entries)
76
+ config.plugins.entries = {};
77
+ config.plugins.entries['principles-disciple'] = { enabled: true };
78
+ // 添加到 installs(使用 OpenClaw 正确格式)
79
+ if (!config.plugins.installs)
80
+ config.plugins.installs = {};
81
+ config.plugins.installs['principles-disciple'] = {
82
+ source: 'path',
83
+ installPath: extDir,
84
+ installedAt: new Date().toISOString(),
85
+ };
86
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
87
+ }
88
+ logger.success('插件安装成功 (手动)');
89
+ }
90
+ /**
91
+ * 安装插件依赖
92
+ */
93
+ async function installPluginDependencies() {
94
+ const extDir = getPluginExtDir();
95
+ const nodeModulesPath = path.join(extDir, 'node_modules');
96
+ if (!existsSync(nodeModulesPath)) {
97
+ logger.step('安装插件运行时依赖');
98
+ execSync('npm install --silent micromatch@^4.0.8 @sinclair/typebox@^0.34.48', {
99
+ cwd: extDir,
100
+ stdio: 'inherit',
101
+ });
102
+ logger.success('插件依赖安装完成');
103
+ }
104
+ }
105
+ /**
106
+ * 复制 Skills
107
+ */
108
+ async function copySkills(pluginDir, language) {
109
+ logger.step('复制 Skills');
110
+ const skillsSrc = path.join(getTemplatesDir(pluginDir, language), 'skills');
111
+ const skillsDest = path.join(getPluginExtDir(), 'skills');
112
+ if (!existsSync(skillsSrc)) {
113
+ // 回退到中文
114
+ const fallbackSrc = path.join(getTemplatesDir(pluginDir, 'zh'), 'skills');
115
+ if (existsSync(fallbackSrc)) {
116
+ await fse.ensureDir(skillsDest);
117
+ await fse.copy(fallbackSrc, skillsDest, { overwrite: true });
118
+ }
119
+ }
120
+ else {
121
+ await fse.ensureDir(skillsDest);
122
+ await fse.copy(skillsSrc, skillsDest, { overwrite: true });
123
+ }
124
+ const count = existsSync(skillsDest) ? readdirSync(skillsDest).length : 0;
125
+ logger.success(`已复制 ${count} 个 Skills`);
126
+ return count;
127
+ }
128
+ /**
129
+ * 复制核心模板到工作区
130
+ */
131
+ async function copyCoreTemplates(pluginDir, language, workspaceDir, mode) {
132
+ logger.step('复制核心模板');
133
+ let count = 0;
134
+ const coreSrc = path.join(getTemplatesDir(pluginDir, language), 'core');
135
+ if (!existsSync(coreSrc)) {
136
+ logger.warn('核心模板目录不存在');
137
+ return 0;
138
+ }
139
+ const files = readdirSync(coreSrc).filter(f => f.endsWith('.md'));
140
+ for (const file of files) {
141
+ const srcPath = path.join(coreSrc, file);
142
+ const destPath = path.join(workspaceDir, file);
143
+ if (existsSync(destPath) && mode === 'smart') {
144
+ // 智能模式:生成 .update 文件
145
+ const updatePath = `${destPath}.update`;
146
+ await fse.copy(srcPath, updatePath, { overwrite: true });
147
+ logger.info(`${file} -> ${file}.update (智能模式)`);
148
+ }
149
+ else {
150
+ await fse.ensureDir(workspaceDir);
151
+ await fse.copy(srcPath, destPath, { overwrite: true });
152
+ logger.info(`${file} (已复制)`);
153
+ }
154
+ count++;
155
+ }
156
+ logger.success(`已复制 ${count} 个核心模板`);
157
+ return count;
158
+ }
159
+ /**
160
+ * 复制身份层文件到工作区
161
+ */
162
+ async function copyPrinciplesLayer(pluginDir, workspaceDir, mode) {
163
+ logger.step('复制身份层文件');
164
+ let count = 0;
165
+ const principlesSrc = path.join(pluginDir, 'templates', 'workspace', '.principles');
166
+ const principlesDest = path.join(workspaceDir, '.principles');
167
+ if (!existsSync(principlesSrc)) {
168
+ logger.warn('身份层模板目录不存在');
169
+ return 0;
170
+ }
171
+ // 复制所有文件
172
+ const files = readdirSync(principlesSrc);
173
+ for (const file of files) {
174
+ const srcPath = path.join(principlesSrc, file);
175
+ const destPath = path.join(principlesDest, file);
176
+ // 跳过目录(models 目录单独处理)
177
+ if (statSync(srcPath).isDirectory()) {
178
+ continue;
179
+ }
180
+ if (existsSync(destPath) && mode === 'smart') {
181
+ const updatePath = `${destPath}.update`;
182
+ await fse.copy(srcPath, updatePath, { overwrite: true });
183
+ logger.info(`.principles/${file} -> .update (智能模式)`);
184
+ }
185
+ else {
186
+ await fse.ensureDir(principlesDest);
187
+ await fse.copy(srcPath, destPath, { overwrite: true });
188
+ logger.info(`.principles/${file} (已复制)`);
189
+ }
190
+ count++;
191
+ }
192
+ // 复制 models 目录
193
+ const modelsSrc = path.join(principlesSrc, 'models');
194
+ const modelsDest = path.join(principlesDest, 'models');
195
+ if (existsSync(modelsSrc)) {
196
+ await fse.ensureDir(modelsDest);
197
+ await fse.copy(modelsSrc, modelsDest, { overwrite: true });
198
+ const modelCount = readdirSync(modelsDest).length;
199
+ logger.info(`.principles/models/ (${modelCount} 个思维模型)`);
200
+ count += modelCount;
201
+ }
202
+ logger.success(`身份层文件已复制`);
203
+ return count;
204
+ }
205
+ /**
206
+ * 创建配置文件
207
+ */
208
+ async function createConfigFile(workspaceDir) {
209
+ const configDir = getOpenClawConfigDir();
210
+ const configPath = path.join(configDir, 'principles-disciple.json');
211
+ const config = {
212
+ workspace: workspaceDir,
213
+ state: path.join(workspaceDir, '.state'),
214
+ debug: false,
215
+ installedAt: new Date().toISOString(),
216
+ };
217
+ await fse.ensureDir(configDir);
218
+ await fse.writeJson(configPath, config, { spaces: 2 });
219
+ logger.success(`配置文件已创建: ${configPath}`);
220
+ }
221
+ /**
222
+ * 主安装流程
223
+ */
224
+ export async function install(options, pluginDir) {
225
+ const spinner = ora('正在安装...').start();
226
+ try {
227
+ // 1. 清理旧版本
228
+ spinner.text = '清理旧版本...';
229
+ await cleanOldVersion();
230
+ // 2. 构建插件
231
+ spinner.text = '构建插件...';
232
+ await buildPlugin(pluginDir);
233
+ // 3. 安装插件
234
+ spinner.text = '安装插件...';
235
+ await installPlugin(pluginDir);
236
+ // 4. 安装插件依赖
237
+ spinner.text = '安装插件依赖...';
238
+ await installPluginDependencies();
239
+ // 5. 复制 Skills
240
+ spinner.text = '复制 Skills...';
241
+ const skillsCount = await copySkills(pluginDir, options.language);
242
+ // 6. 复制核心模板
243
+ spinner.text = '复制核心模板...';
244
+ const templatesCount = await copyCoreTemplates(pluginDir, options.language, options.workspaceDir, options.mode);
245
+ // 7. 复制身份层
246
+ spinner.text = '复制身份层...';
247
+ const principlesCount = await copyPrinciplesLayer(pluginDir, options.workspaceDir, options.mode);
248
+ // 8. 创建配置文件
249
+ spinner.text = '创建配置文件...';
250
+ await createConfigFile(options.workspaceDir);
251
+ spinner.succeed('安装完成!');
252
+ return {
253
+ success: true,
254
+ pluginDir: getPluginExtDir(),
255
+ workspaceDir: options.workspaceDir,
256
+ skillsCount,
257
+ templatesCount: templatesCount + principlesCount,
258
+ };
259
+ }
260
+ catch (error) {
261
+ spinner.fail('安装失败');
262
+ return {
263
+ success: false,
264
+ pluginDir: getPluginExtDir(),
265
+ workspaceDir: options.workspaceDir,
266
+ skillsCount: 0,
267
+ templatesCount: 0,
268
+ error: error instanceof Error ? error.message : String(error),
269
+ };
270
+ }
271
+ }
272
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 交互式问答模块
3
+ */
4
+ import { select, confirm, input, checkbox } from '@inquirer/prompts';
5
+ export interface InstallOptions {
6
+ language: 'zh' | 'en';
7
+ mode: 'smart' | 'force';
8
+ workspaceDir: string;
9
+ features: string[];
10
+ overwriteConfig: boolean;
11
+ }
12
+ /**
13
+ * 运行所有交互式问答
14
+ */
15
+ export declare function runPrompts(cliOptions?: Partial<InstallOptions>): Promise<InstallOptions | null>;
16
+ export { confirm, input, select, checkbox };
17
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAsHD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,GAAE,OAAO,CAAC,cAAc,CAAM,GACvC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgChC;AAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * 交互式问答模块
3
+ */
4
+ import { select, confirm, input, checkbox } from '@inquirer/prompts';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { detectWorkspace } from './utils/env.js';
8
+ /**
9
+ * 语言选择
10
+ */
11
+ async function promptLanguage() {
12
+ return await select({
13
+ message: '选择语言 / Select language',
14
+ choices: [
15
+ { name: '🇨🇳 中文', value: 'zh' },
16
+ { name: '🇺🇸 English', value: 'en' },
17
+ ],
18
+ default: 'zh',
19
+ });
20
+ }
21
+ /**
22
+ * 安装模式选择
23
+ */
24
+ async function promptInstallMode() {
25
+ return await select({
26
+ message: '选择安装模式',
27
+ choices: [
28
+ {
29
+ name: '智能合并 - 已存在的文件会生成 .update 副本,保护用户修改',
30
+ value: 'smart',
31
+ description: '推荐:保护你的自定义修改'
32
+ },
33
+ {
34
+ name: '强制覆盖 - 直接覆盖所有文件,保持与模板同步',
35
+ value: 'force',
36
+ description: '注意:会覆盖所有已有文件'
37
+ },
38
+ ],
39
+ default: 'smart',
40
+ });
41
+ }
42
+ /**
43
+ * 工作区路径配置
44
+ */
45
+ async function promptWorkspace(workspaceInfo) {
46
+ const choices = [
47
+ {
48
+ name: `使用检测到的目录: ${workspaceInfo.detectedPath}`,
49
+ value: 'detected',
50
+ },
51
+ {
52
+ name: '自定义目录',
53
+ value: 'custom',
54
+ },
55
+ ];
56
+ const selection = await select({
57
+ message: `工作区目录 ${workspaceInfo.hasPrinciples ? '(已检测到 Principles)' : ''}`,
58
+ choices,
59
+ default: 'detected',
60
+ });
61
+ if (selection === 'custom') {
62
+ return await input({
63
+ message: '输入工作区路径',
64
+ default: path.join(os.homedir(), 'clawd'),
65
+ validate: (value) => {
66
+ if (!value.trim())
67
+ return '路径不能为空';
68
+ return true;
69
+ },
70
+ });
71
+ }
72
+ return workspaceInfo.detectedPath;
73
+ }
74
+ /**
75
+ * 功能选择
76
+ */
77
+ async function promptFeatures() {
78
+ return await checkbox({
79
+ message: '选择要安装的功能(空格选择)',
80
+ choices: [
81
+ { name: '进化系统', value: 'evolution', checked: true },
82
+ { name: '信任引擎', value: 'trust', checked: true },
83
+ { name: '深度反思', value: 'reflection' },
84
+ { name: 'OKR 管理', value: 'okr' },
85
+ { name: 'Pain 信号检测', value: 'pain', checked: true },
86
+ { name: '认知卫生', value: 'hygiene' },
87
+ ],
88
+ });
89
+ }
90
+ /**
91
+ * 确认覆盖配置
92
+ */
93
+ async function promptOverwriteConfig() {
94
+ return await confirm({
95
+ message: '检测到已有配置,是否覆盖?',
96
+ default: false,
97
+ });
98
+ }
99
+ /**
100
+ * 最终确认
101
+ */
102
+ async function promptConfirm(options) {
103
+ console.log('\n📦 安装配置:');
104
+ console.log(` 语言: ${options.language}`);
105
+ console.log(` 模式: ${options.mode === 'force' ? '强制覆盖' : '智能合并'}`);
106
+ console.log(` 工作区: ${options.workspaceDir}`);
107
+ if (options.features && options.features.length > 0) {
108
+ console.log(` 功能: ${options.features.join(', ')}`);
109
+ }
110
+ return await confirm({
111
+ message: '确认安装?',
112
+ default: true,
113
+ });
114
+ }
115
+ /**
116
+ * 运行所有交互式问答
117
+ */
118
+ export async function runPrompts(cliOptions = {}) {
119
+ // 检测工作区
120
+ const workspaceInfo = detectWorkspace();
121
+ // 1. 语言选择(如果 CLI 未指定)
122
+ const language = cliOptions.language ?? await promptLanguage();
123
+ // 2. 安装模式选择(如果 CLI 未指定)
124
+ const mode = cliOptions.mode ?? await promptInstallMode();
125
+ // 3. 工作区路径配置(始终询问)
126
+ const workspaceDir = cliOptions.workspaceDir ?? await promptWorkspace(workspaceInfo);
127
+ // 4. 功能选择
128
+ const features = cliOptions.features ?? await promptFeatures();
129
+ // 5. 组装选项
130
+ const options = {
131
+ language,
132
+ mode,
133
+ workspaceDir,
134
+ features,
135
+ overwriteConfig: false,
136
+ };
137
+ // 6. 最终确认
138
+ const confirmed = await promptConfirm(options);
139
+ if (!confirmed) {
140
+ return null;
141
+ }
142
+ return options;
143
+ }
144
+ export { confirm, input, select, checkbox };
145
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface UninstallResult {
2
+ success: boolean;
3
+ removedDirs: string[];
4
+ removedFiles: string[];
5
+ preservedPaths: string[];
6
+ error?: string;
7
+ }
8
+ /**
9
+ * 检查安装状态
10
+ */
11
+ export declare function checkInstallStatus(): {
12
+ isInstalled: boolean;
13
+ paths: {
14
+ exists: boolean;
15
+ path: string;
16
+ name: string;
17
+ type: 'dir' | 'file';
18
+ }[];
19
+ };
20
+ /**
21
+ * 执行卸载
22
+ *
23
+ * @param options.force 跳过确认提示(危险,仅用于脚本)
24
+ */
25
+ export declare function uninstall(options?: {
26
+ force?: boolean;
27
+ }): Promise<UninstallResult>;
28
+ //# sourceMappingURL=uninstaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstaller.d.ts","sourceRoot":"","sources":["../src/uninstaller.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE;QACL,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAkBA;AAoBD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,GACL,OAAO,CAAC,eAAe,CAAC,CA4G1B"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * 卸载器模块
3
+ *
4
+ * ⚠️ 安全原则:
5
+ * 1. 只删除插件系统文件(~/.openclaw/extensions/principles-disciple)
6
+ * 2. 只删除插件配置文件(~/.openclaw/principles-disciple.json)
7
+ * 3. 绝对不删除用户工作区的任何文件:
8
+ * - MD 文件(AGENTS.md, SOUL.md 等)
9
+ * - 记忆文件(.principles/ 目录)
10
+ * - 状态文件(.state/ 目录)
11
+ * - 任何用户数据
12
+ */
13
+ import { existsSync } from 'fs';
14
+ import fse from 'fs-extra';
15
+ import * as path from 'path';
16
+ import { confirm } from '@inquirer/prompts';
17
+ import { logger } from './utils/logger.js';
18
+ import { getOpenClawConfigDir, getPluginExtDir } from './utils/env.js';
19
+ /**
20
+ * 检查安装状态
21
+ */
22
+ export function checkInstallStatus() {
23
+ const configDir = getOpenClawConfigDir();
24
+ const paths = [
25
+ { path: getPluginExtDir(), name: '插件扩展目录', type: 'dir' },
26
+ { path: path.join(configDir, 'principles-disciple.json'), name: '配置文件', type: 'file' },
27
+ ];
28
+ const checkedPaths = paths.map(p => ({
29
+ exists: existsSync(p.path),
30
+ path: p.path,
31
+ name: p.name,
32
+ type: p.type,
33
+ }));
34
+ const isInstalled = checkedPaths.some(p => p.exists);
35
+ return { isInstalled, paths: checkedPaths };
36
+ }
37
+ /**
38
+ * 获取用户工作区路径(用于显示保护提醒)
39
+ */
40
+ function getWorkspacePath() {
41
+ const configDir = getOpenClawConfigDir();
42
+ const configPath = path.join(configDir, 'principles-disciple.json');
43
+ if (existsSync(configPath)) {
44
+ try {
45
+ const config = require(configPath);
46
+ return config.workspace || null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * 执行卸载
56
+ *
57
+ * @param options.force 跳过确认提示(危险,仅用于脚本)
58
+ */
59
+ export async function uninstall(options = {}) {
60
+ const result = {
61
+ success: false,
62
+ removedDirs: [],
63
+ removedFiles: [],
64
+ preservedPaths: [],
65
+ };
66
+ try {
67
+ // 1. 检查安装状态
68
+ const status = checkInstallStatus();
69
+ if (!status.isInstalled) {
70
+ logger.warn('未检测到已安装的 Principles Disciple');
71
+ result.success = true;
72
+ return result;
73
+ }
74
+ // 2. 获取工作区路径并显示保护提醒
75
+ const workspaceDir = getWorkspacePath();
76
+ console.log('');
77
+ logger.warn('⚠️ 重要提醒:');
78
+ console.log(' 卸载操作仅移除插件系统文件,不会删除您的个人数据。');
79
+ console.log('');
80
+ if (workspaceDir && existsSync(workspaceDir)) {
81
+ logger.info('以下工作区文件将被保留:');
82
+ console.log(` 📁 工作区目录: ${workspaceDir}`);
83
+ console.log(' 📄 MD 文件 (AGENTS.md, SOUL.md, PRINCIPLES.md 等)');
84
+ console.log(' 📁 .principles/ 目录(身份层配置)');
85
+ console.log(' 📁 .state/ 目录(进化状态和记忆)');
86
+ console.log('');
87
+ }
88
+ // 3. 显示将要删除的内容
89
+ logger.info('以下插件文件将被删除:');
90
+ for (const p of status.paths) {
91
+ if (p.exists) {
92
+ const icon = p.type === 'dir' ? '📁' : '📄';
93
+ console.log(` ${icon} ${p.name}: ${p.path}`);
94
+ }
95
+ }
96
+ console.log('');
97
+ // 4. 确认卸载(除非 --force)
98
+ if (!options.force) {
99
+ const confirmed = await confirm({
100
+ message: '确认卸载插件?(您的个人数据将保留)',
101
+ default: false,
102
+ });
103
+ if (!confirmed) {
104
+ logger.info('卸载已取消');
105
+ result.success = true;
106
+ return result;
107
+ }
108
+ }
109
+ // 5. 执行删除(仅限插件系统文件)
110
+ for (const p of status.paths) {
111
+ if (!p.exists)
112
+ continue;
113
+ try {
114
+ if (p.type === 'dir') {
115
+ await fse.remove(p.path);
116
+ result.removedDirs.push(p.path);
117
+ logger.success(`已删除: ${p.name}`);
118
+ }
119
+ else {
120
+ await fse.remove(p.path);
121
+ result.removedFiles.push(p.path);
122
+ logger.success(`已删除: ${p.name}`);
123
+ }
124
+ }
125
+ catch (error) {
126
+ logger.error(`删除失败: ${p.name} - ${error instanceof Error ? error.message : String(error)}`);
127
+ }
128
+ }
129
+ // 6. 记录保留的路径
130
+ if (workspaceDir) {
131
+ result.preservedPaths.push(workspaceDir);
132
+ if (existsSync(path.join(workspaceDir, '.principles'))) {
133
+ result.preservedPaths.push(path.join(workspaceDir, '.principles'));
134
+ }
135
+ if (existsSync(path.join(workspaceDir, '.state'))) {
136
+ result.preservedPaths.push(path.join(workspaceDir, '.state'));
137
+ }
138
+ }
139
+ result.success = true;
140
+ console.log('');
141
+ logger.success('✅ 卸载完成!');
142
+ console.log('');
143
+ if (result.preservedPaths.length > 0) {
144
+ logger.info('💡 您的个人数据已保留在以下位置:');
145
+ result.preservedPaths.forEach(p => console.log(` ${p}`));
146
+ console.log('');
147
+ logger.info('如需彻底清理,请手动删除上述目录。');
148
+ }
149
+ return result;
150
+ }
151
+ catch (error) {
152
+ result.error = error instanceof Error ? error.message : String(error);
153
+ logger.error(`卸载失败: ${result.error}`);
154
+ return result;
155
+ }
156
+ }
157
+ //# sourceMappingURL=uninstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstaller.js","sourceRoot":"","sources":["../src/uninstaller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface EnvCheckResult {
2
+ hasOpenClaw: boolean;
3
+ openclawVersion?: string;
4
+ hasNode: boolean;
5
+ nodeVersion?: string;
6
+ hasPython: boolean;
7
+ pythonVersion?: string;
8
+ hasGit: boolean;
9
+ }
10
+ export interface WorkspaceInfo {
11
+ detectedPath: string;
12
+ exists: boolean;
13
+ hasPrinciples: boolean;
14
+ }
15
+ /**
16
+ * 检测运行环境
17
+ */
18
+ export declare function checkEnvironment(): EnvCheckResult;
19
+ /**
20
+ * 检测 OpenClaw 工作区
21
+ */
22
+ export declare function detectWorkspace(): WorkspaceInfo;
23
+ /**
24
+ * 获取 OpenClaw 配置目录
25
+ */
26
+ export declare function getOpenClawConfigDir(): string;
27
+ /**
28
+ * 获取插件扩展目录
29
+ */
30
+ export declare function getPluginExtDir(): string;
31
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CA+CjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,aAAa,CAgC/C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * 环境检测工具
3
+ */
4
+ import { execSync } from 'child_process';
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ /**
9
+ * 检测运行环境
10
+ */
11
+ export function checkEnvironment() {
12
+ const result = {
13
+ hasOpenClaw: false,
14
+ hasNode: false,
15
+ hasPython: false,
16
+ hasGit: false,
17
+ };
18
+ // 检测 Node.js
19
+ try {
20
+ result.nodeVersion = execSync('node -v', { encoding: 'utf-8' }).trim();
21
+ result.hasNode = true;
22
+ }
23
+ catch {
24
+ result.hasNode = false;
25
+ }
26
+ // 检测 OpenClaw
27
+ try {
28
+ result.openclawVersion = execSync('openclaw --version', { encoding: 'utf-8' }).trim();
29
+ result.hasOpenClaw = true;
30
+ }
31
+ catch {
32
+ // 尝试 clawd 命令
33
+ try {
34
+ result.openclawVersion = execSync('clawd --version', { encoding: 'utf-8' }).trim();
35
+ result.hasOpenClaw = true;
36
+ }
37
+ catch {
38
+ result.hasOpenClaw = false;
39
+ }
40
+ }
41
+ // 检测 Python
42
+ try {
43
+ result.pythonVersion = execSync('python3 --version', { encoding: 'utf-8' }).trim().split(' ')[1];
44
+ result.hasPython = true;
45
+ }
46
+ catch {
47
+ result.hasPython = false;
48
+ }
49
+ // 检测 Git
50
+ try {
51
+ execSync('git --version', { encoding: 'utf-8' });
52
+ result.hasGit = true;
53
+ }
54
+ catch {
55
+ result.hasGit = false;
56
+ }
57
+ return result;
58
+ }
59
+ /**
60
+ * 检测 OpenClaw 工作区
61
+ */
62
+ export function detectWorkspace() {
63
+ const homeDir = os.homedir();
64
+ const candidates = [];
65
+ // 安全地添加候选路径
66
+ if (process.env.OPENCLAW_WORKSPACE) {
67
+ candidates.push(process.env.OPENCLAW_WORKSPACE);
68
+ }
69
+ if (process.env.PD_WORKSPACE_DIR) {
70
+ candidates.push(process.env.PD_WORKSPACE_DIR);
71
+ }
72
+ candidates.push(path.join(homeDir, 'clawd'));
73
+ candidates.push(path.join(homeDir, '.openclaw', 'workspace'));
74
+ for (const candidate of candidates) {
75
+ if (fs.existsSync(candidate)) {
76
+ const principlesPath = path.join(candidate, '.principles', 'PRINCIPLES.md');
77
+ return {
78
+ detectedPath: candidate,
79
+ exists: true,
80
+ hasPrinciples: fs.existsSync(principlesPath),
81
+ };
82
+ }
83
+ }
84
+ // 默认返回 ~/clawd
85
+ const defaultPath = path.join(homeDir, 'clawd');
86
+ return {
87
+ detectedPath: defaultPath,
88
+ exists: false,
89
+ hasPrinciples: false,
90
+ };
91
+ }
92
+ /**
93
+ * 获取 OpenClaw 配置目录
94
+ */
95
+ export function getOpenClawConfigDir() {
96
+ return path.join(os.homedir(), '.openclaw');
97
+ }
98
+ /**
99
+ * 获取插件扩展目录
100
+ */
101
+ export function getPluginExtDir() {
102
+ return path.join(getOpenClawConfigDir(), 'extensions', 'principles-disciple');
103
+ }
104
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ declare const logger: {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ warn: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ step: (msg: string) => void;
7
+ list: (title: string, entries: {
8
+ name: string;
9
+ value: string;
10
+ }[]) => void;
11
+ };
12
+ declare const banner: string;
13
+ export { logger, banner };
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM;gBACE,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;gBAEP,MAAM;kBAIJ,MAAM,WAAW;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;CAIjE,CAAC;AAEF,QAAA,MAAM,MAAM,QAEmE,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 彩色日志输出工具
3
+ */
4
+ import pc from 'picocolors';
5
+ const logger = {
6
+ info: (msg) => console.log(`${pc.blue('ℹ')} ${msg}`),
7
+ success: (msg) => console.log(`${pc.green('✔')} ${msg}`),
8
+ warn: (msg) => console.log(`${pc.yellow('⚠')} ${msg}`),
9
+ error: (msg) => console.log(`${pc.red('✖')} ${msg}`),
10
+ step: (msg) => {
11
+ console.log(`\n${pc.yellow('📦')} ${msg}\n`);
12
+ },
13
+ list: (title, entries) => {
14
+ console.log(`\n${pc.bold(title)}`);
15
+ entries.forEach(e => console.log(` ${pc.cyan(e.name)}: ${e.value}`));
16
+ }
17
+ };
18
+ const banner = `${pc.blue('╔══════════════════════════════════════════════════════════════╗')}
19
+ ${pc.blue('║')} ${pc.bold(pc.red('🦞 Principles Disciple'))} - OpenClaw Plugin Installer ${pc.blue('║')}
20
+ ${pc.blue('╚══════════════════════════════════════════════════════════════╝')}`;
21
+ export { logger, banner };
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAC5D,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAChE,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAC9D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAE5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,EAAE,CAAC,KAAa,EAAE,OAA0C,EAAE,EAAE;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kEAAkE,CAAC;EAC3F,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,qCAAqC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;EAC9G,EAAE,CAAC,IAAI,CAAC,kEAAkE,CAAC,EAAE,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "create-principles-disciple",
3
+ "version": "1.0.0",
4
+ "description": "Interactive CLI installer for Principles Disciple OpenClaw plugin",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-principles-disciple": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "openclaw",
21
+ "principles-disciple",
22
+ "cli",
23
+ "installer",
24
+ "interactive"
25
+ ],
26
+ "author": "csuzngjh",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@inquirer/prompts": "^7.0.0",
30
+ "commander": "^12.0.0",
31
+ "fs-extra": "^11.2.0",
32
+ "ora": "^8.0.0",
33
+ "picocolors": "^1.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/fs-extra": "^11.0.4",
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.0.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ },
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/csuzngjh/principles.git",
46
+ "directory": "packages/create-principles-disciple"
47
+ }
48
+ }