microfox 1.0.11
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/CHANGELOG.md +72 -0
- package/README.md +114 -0
- package/dist/agent-template.txt +486 -0
- package/dist/background-agent/.gitignore.txt +22 -0
- package/dist/background-agent/eslint.config.js.txt +48 -0
- package/dist/background-agent/microfox.json.txt +4 -0
- package/dist/background-agent/openapi.md.txt +1 -0
- package/dist/background-agent/package.json.txt +47 -0
- package/dist/background-agent/serverless.yml.txt +123 -0
- package/dist/background-agent/src/functions/cron-paginate.ts.txt +135 -0
- package/dist/background-agent/src/functions/cron-populate.ts.txt +33 -0
- package/dist/background-agent/src/functions/route-trigger-index.ts.txt +157 -0
- package/dist/background-agent/src/functions/route-trigger-populate.ts.txt +0 -0
- package/dist/background-agent/src/functions/sqs-index.ts.txt +147 -0
- package/dist/background-agent/src/helpers/ragRedis.ts.txt +78 -0
- package/dist/background-agent/src/index.ts.txt +69 -0
- package/dist/background-agent/tsconfig.json.txt +33 -0
- package/dist/chunk-4HNHBA2H.mjs +104 -0
- package/dist/chunk-4HNHBA2H.mjs.map +1 -0
- package/dist/chunk-ARAHSYJI.mjs +263 -0
- package/dist/chunk-ARAHSYJI.mjs.map +1 -0
- package/dist/chunk-JGAX4PD6.mjs +290 -0
- package/dist/chunk-JGAX4PD6.mjs.map +1 -0
- package/dist/chunk-KPJJOO76.mjs +12 -0
- package/dist/chunk-KPJJOO76.mjs.map +1 -0
- package/dist/chunk-TZQZMKHP.mjs +11 -0
- package/dist/chunk-TZQZMKHP.mjs.map +1 -0
- package/dist/chunk-UFRGJMF4.mjs +154 -0
- package/dist/chunk-UFRGJMF4.mjs.map +1 -0
- package/dist/chunk-UHWJTQKW.mjs +139 -0
- package/dist/chunk-UHWJTQKW.mjs.map +1 -0
- package/dist/chunk-UYROVW53.mjs +89 -0
- package/dist/chunk-UYROVW53.mjs.map +1 -0
- package/dist/chunk-XGFSFWK3.mjs +113 -0
- package/dist/chunk-XGFSFWK3.mjs.map +1 -0
- package/dist/cli.d.mts +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1154 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +52 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/commands/add.d.mts +5 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.js +126 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/add.mjs +10 -0
- package/dist/commands/add.mjs.map +1 -0
- package/dist/commands/code.d.mts +5 -0
- package/dist/commands/code.d.ts +5 -0
- package/dist/commands/code.js +187 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/code.mjs +9 -0
- package/dist/commands/code.mjs.map +1 -0
- package/dist/commands/install.d.mts +5 -0
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.js +296 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/install.mjs +9 -0
- package/dist/commands/install.mjs.map +1 -0
- package/dist/commands/kickstart.d.mts +5 -0
- package/dist/commands/kickstart.d.ts +5 -0
- package/dist/commands/kickstart.js +322 -0
- package/dist/commands/kickstart.js.map +1 -0
- package/dist/commands/kickstart.mjs +10 -0
- package/dist/commands/kickstart.mjs.map +1 -0
- package/dist/commands/push.d.mts +5 -0
- package/dist/commands/push.d.ts +5 -0
- package/dist/commands/push.js +137 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/push.mjs +9 -0
- package/dist/commands/push.mjs.map +1 -0
- package/dist/commands/status.d.mts +7 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +148 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.mjs +13 -0
- package/dist/commands/status.mjs.map +1 -0
- package/dist/commands/update.d.mts +5 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +172 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/update.mjs +9 -0
- package/dist/commands/update.mjs.map +1 -0
- package/dist/index.d.mts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +406 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +14 -0
- package/dist/index.mjs.map +1 -0
- package/dist/package-template.txt +494 -0
- package/package.json +68 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/install.ts
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
|
|
6
|
+
// src/utils/experimental-installer.ts
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
var CWD_PACKAGE_JSON = path.join(process.cwd(), "package.json");
|
|
12
|
+
var CWD_NODE_MODULES = path.join(process.cwd(), "node_modules");
|
|
13
|
+
var MICROFOX_NODE_MODULES;
|
|
14
|
+
function log(message, isError = false, isWarning = false) {
|
|
15
|
+
const timestamp = (/* @__PURE__ */ new Date()).toLocaleTimeString();
|
|
16
|
+
let prefix;
|
|
17
|
+
if (isError) {
|
|
18
|
+
prefix = chalk.red(`\u274C [install-microfox ${timestamp}]`);
|
|
19
|
+
} else if (isWarning) {
|
|
20
|
+
prefix = chalk.yellow(`\u26A0\uFE0F [install-microfox ${timestamp}]`);
|
|
21
|
+
} else {
|
|
22
|
+
prefix = chalk.blue(`\u2139\uFE0F [install-microfox ${timestamp}]`);
|
|
23
|
+
}
|
|
24
|
+
console.log(`${prefix} ${message}`);
|
|
25
|
+
}
|
|
26
|
+
function logSuccess(message) {
|
|
27
|
+
const timestamp = (/* @__PURE__ */ new Date()).toLocaleTimeString();
|
|
28
|
+
console.log(chalk.green(`\u2705 [install-microfox ${timestamp}] ${message}`));
|
|
29
|
+
}
|
|
30
|
+
function logSection(title) {
|
|
31
|
+
console.log("\n" + "=".repeat(60));
|
|
32
|
+
console.log(` ${title}`);
|
|
33
|
+
console.log("=".repeat(60));
|
|
34
|
+
}
|
|
35
|
+
function findSourceDir(targetDirName) {
|
|
36
|
+
let currentDir = process.cwd();
|
|
37
|
+
for (let i = 0; i < 10; i++) {
|
|
38
|
+
const gitDir = path.join(currentDir, ".git");
|
|
39
|
+
if (fs.existsSync(gitDir)) {
|
|
40
|
+
const parentDir = path.dirname(currentDir);
|
|
41
|
+
const microfoxDir = path.join(parentDir, targetDirName);
|
|
42
|
+
if (fs.existsSync(microfoxDir)) {
|
|
43
|
+
return microfoxDir;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const parent = path.dirname(currentDir);
|
|
47
|
+
if (parent === currentDir) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
currentDir = parent;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function copyDirectory(src, dest) {
|
|
55
|
+
try {
|
|
56
|
+
const normalizedSrc = path.resolve(src);
|
|
57
|
+
const normalizedDest = path.resolve(dest);
|
|
58
|
+
log(`Copying from: ${normalizedSrc}`);
|
|
59
|
+
log(`Copying to: ${normalizedDest}`);
|
|
60
|
+
if (!fs.existsSync(normalizedDest)) {
|
|
61
|
+
fs.mkdirSync(normalizedDest, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
const isWindows = process.platform === "win32";
|
|
64
|
+
if (isWindows) {
|
|
65
|
+
try {
|
|
66
|
+
execSync(`robocopy "${normalizedSrc}" "${normalizedDest}" /E /NFL /NDL /NJH /NJS /nc /ns /np`, { stdio: "pipe" });
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error.status !== 1 && error.status !== 0) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
execSync(`cp -r "${normalizedSrc}/." "${normalizedDest}"`, { stdio: "pipe" });
|
|
74
|
+
}
|
|
75
|
+
if (fs.existsSync(normalizedDest) && fs.readdirSync(normalizedDest).length > 0) {
|
|
76
|
+
log(`\u2705 Copied ${normalizedSrc} -> ${normalizedDest}`);
|
|
77
|
+
return true;
|
|
78
|
+
} else {
|
|
79
|
+
log(`\u274C Copy verification failed: destination is empty`);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
log(`\u274C Failed to copy ${src} -> ${dest}: ${error.message}`);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function updatePackageJson(packageName) {
|
|
88
|
+
var _a, _b, _c;
|
|
89
|
+
try {
|
|
90
|
+
log(`Updating package.json to add ${packageName} with "*" version...`);
|
|
91
|
+
if (!fs.existsSync(CWD_PACKAGE_JSON)) {
|
|
92
|
+
log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, "utf8"));
|
|
96
|
+
const existingVersion = ((_a = packageJson.dependencies) == null ? void 0 : _a[packageName]) || ((_b = packageJson.devDependencies) == null ? void 0 : _b[packageName]);
|
|
97
|
+
if (existingVersion && existingVersion !== "*") {
|
|
98
|
+
log(`Package ${packageName} already exists with version: ${existingVersion}`, false, true);
|
|
99
|
+
log(`Updating to "*" for local development...`, false, true);
|
|
100
|
+
}
|
|
101
|
+
if (!packageJson.dependencies) {
|
|
102
|
+
packageJson.dependencies = {};
|
|
103
|
+
}
|
|
104
|
+
packageJson.dependencies[packageName] = "*";
|
|
105
|
+
if ((_c = packageJson.devDependencies) == null ? void 0 : _c[packageName]) {
|
|
106
|
+
delete packageJson.devDependencies[packageName];
|
|
107
|
+
log(`Moved ${packageName} from devDependencies to dependencies`);
|
|
108
|
+
}
|
|
109
|
+
fs.writeFileSync(CWD_PACKAGE_JSON, JSON.stringify(packageJson, null, 2) + "\n");
|
|
110
|
+
logSuccess(`Added ${packageName}: "*" to package.json`);
|
|
111
|
+
return true;
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (error.code === "ENOENT") {
|
|
114
|
+
log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);
|
|
115
|
+
} else if (error instanceof SyntaxError) {
|
|
116
|
+
log(`Invalid JSON in package.json: ${error.message}`, true);
|
|
117
|
+
} else if (error.code === "EACCES") {
|
|
118
|
+
log(`Permission denied writing to package.json`, true);
|
|
119
|
+
} else {
|
|
120
|
+
log(`Failed to update package.json: ${error.message}`, true);
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function installSpecificPackage(packageName) {
|
|
126
|
+
logSection(`Installing Specific Package: ${packageName}`);
|
|
127
|
+
if (!packageName || typeof packageName !== "string" || !packageName.startsWith("@microfox/")) {
|
|
128
|
+
log(`Invalid package name format: "${packageName}". Must start with "@microfox/"`, true);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
const packageShortName = packageName.replace("@microfox/", "");
|
|
132
|
+
if (!packageShortName || packageShortName.trim() === "") {
|
|
133
|
+
log(`Invalid package name: "${packageName}"`, true);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
const microfoxDir = path.join(MICROFOX_NODE_MODULES, "@microfox");
|
|
137
|
+
const srcDir = path.join(microfoxDir, packageShortName);
|
|
138
|
+
log(`Searching for package: ${packageName}`);
|
|
139
|
+
log(`Source directory: ${srcDir}`);
|
|
140
|
+
if (!fs.existsSync(microfoxDir)) {
|
|
141
|
+
log(`Microfox packages directory not found at: ${microfoxDir}`, true);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
if (!fs.existsSync(srcDir)) {
|
|
145
|
+
log(`Package "${packageName}" not found in source packages`, true);
|
|
146
|
+
log(`Searched in: ${srcDir}`, true);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
if (!updatePackageJson(packageName)) {
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
const microfoxScopeDir = path.join(CWD_NODE_MODULES, "@microfox");
|
|
153
|
+
if (!fs.existsSync(microfoxScopeDir)) {
|
|
154
|
+
fs.mkdirSync(microfoxScopeDir, { recursive: true });
|
|
155
|
+
}
|
|
156
|
+
const destDir = path.join(CWD_NODE_MODULES, "@microfox", packageShortName);
|
|
157
|
+
log(`Copying package files...`);
|
|
158
|
+
if (copyDirectory(srcDir, destDir)) {
|
|
159
|
+
logSection(`\u2705 SUCCESS`);
|
|
160
|
+
logSuccess(`Package ${packageName} installed for local development!`);
|
|
161
|
+
log(`Package location: ${destDir}`);
|
|
162
|
+
} else {
|
|
163
|
+
log(`Failed to copy package files`, true);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function installAllPackages() {
|
|
168
|
+
log('Installing all @microfox/* packages with "*" version from package.json...');
|
|
169
|
+
const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, "utf8"));
|
|
170
|
+
const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
171
|
+
const microfoxPackages = Object.entries(dependencies).filter(([name, version]) => name.startsWith("@microfox/") && version === "*").map(([name]) => name);
|
|
172
|
+
if (microfoxPackages.length === 0) {
|
|
173
|
+
log('\u2139\uFE0F No @microfox/* packages with "*" version found in package.json');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
log(`Found ${microfoxPackages.length} @microfox/* packages to install:`);
|
|
177
|
+
microfoxPackages.forEach((pkg) => log(` - ${pkg}`));
|
|
178
|
+
const microfoxScopeDir = path.join(CWD_NODE_MODULES, "@microfox");
|
|
179
|
+
if (!fs.existsSync(microfoxScopeDir)) {
|
|
180
|
+
fs.mkdirSync(microfoxScopeDir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
let successCount = 0;
|
|
183
|
+
let failureCount = 0;
|
|
184
|
+
for (const packageName of microfoxPackages) {
|
|
185
|
+
const packageShortName = packageName.replace("@microfox/", "");
|
|
186
|
+
const srcDir = path.join(MICROFOX_NODE_MODULES, "@microfox", packageShortName);
|
|
187
|
+
const destDir = path.join(CWD_NODE_MODULES, "@microfox", packageShortName);
|
|
188
|
+
if (!fs.existsSync(srcDir)) {
|
|
189
|
+
log(`\u26A0\uFE0F Package ${packageName} not found in source node_modules, skipping...`);
|
|
190
|
+
failureCount++;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (copyDirectory(srcDir, destDir)) {
|
|
194
|
+
successCount++;
|
|
195
|
+
} else {
|
|
196
|
+
failureCount++;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
log(`
|
|
200
|
+
\u{1F4CA} Installation Summary:`);
|
|
201
|
+
log(` \u2705 Successfully installed: ${successCount} packages`);
|
|
202
|
+
if (failureCount > 0) {
|
|
203
|
+
log(` \u274C Failed to install: ${failureCount} packages`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function runExperimentalInstall(packages, targetDirName) {
|
|
207
|
+
try {
|
|
208
|
+
logSection("Microfox Local Package Installer (Experimental)");
|
|
209
|
+
log(`Started at: ${(/* @__PURE__ */ new Date()).toLocaleString()}`);
|
|
210
|
+
log(`Working directory: ${process.cwd()}`);
|
|
211
|
+
const sourceDir = findSourceDir(targetDirName);
|
|
212
|
+
if (!sourceDir) {
|
|
213
|
+
log(`Could not find source directory '${targetDirName}' in any parent of a .git directory.`, true);
|
|
214
|
+
log(`Searched up to 10 levels from ${process.cwd()}`, true);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
log(`Found source directory at: ${sourceDir}`);
|
|
218
|
+
MICROFOX_NODE_MODULES = path.join(sourceDir, "node_modules");
|
|
219
|
+
if (!fs.existsSync(MICROFOX_NODE_MODULES)) {
|
|
220
|
+
log(`Source node_modules directory not found at: ${MICROFOX_NODE_MODULES}`, true);
|
|
221
|
+
log(`Please run 'npm install' or 'pnpm install' in ${sourceDir}`, true);
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
if (!fs.existsSync(CWD_PACKAGE_JSON)) {
|
|
225
|
+
log(`package.json not found in current directory: ${CWD_PACKAGE_JSON}`, true);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
if (packages.length > 0) {
|
|
229
|
+
log(`Installing ${packages.length} specific package(s)...`);
|
|
230
|
+
for (let i = 0; i < packages.length; i++) {
|
|
231
|
+
const packageName = packages[i];
|
|
232
|
+
log(`
|
|
233
|
+
[${i + 1}/${packages.length}] Processing: ${packageName}`);
|
|
234
|
+
installSpecificPackage(packageName);
|
|
235
|
+
}
|
|
236
|
+
logSection("\u{1F389} All Specified Packages Installed Successfully");
|
|
237
|
+
} else {
|
|
238
|
+
installAllPackages();
|
|
239
|
+
}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
log("", true);
|
|
242
|
+
log(`Unexpected error occurred: ${error.message}`, true);
|
|
243
|
+
if (error.stack) {
|
|
244
|
+
log(`Stack trace: ${error.stack}`, true);
|
|
245
|
+
}
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// src/commands/install.ts
|
|
251
|
+
var installCommand = new Command("install").description("Install packages for local development.").argument("[packages...]", "Specific packages to install").option("--experimental", "Enable experimental features").option("--target <name>", "Specify the target source directory name", "Microfox").action(async (packages, options) => {
|
|
252
|
+
if (options.experimental) {
|
|
253
|
+
await runExperimentalInstall(packages, options.target);
|
|
254
|
+
} else {
|
|
255
|
+
console.log("This command is only available with the --experimental flag.");
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
export {
|
|
261
|
+
installCommand
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=chunk-ARAHSYJI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/install.ts","../src/utils/experimental-installer.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runExperimentalInstall } from '../utils/experimental-installer';\n\nexport const installCommand = new Command('install')\n .description('Install packages for local development.')\n .argument('[packages...]', 'Specific packages to install')\n .option('--experimental', 'Enable experimental features')\n .option('--target <name>', 'Specify the target source directory name', 'Microfox')\n .action(async (packages, options) => {\n if (options.experimental) {\n await runExperimentalInstall(packages, options.target);\n } else {\n console.log('This command is only available with the --experimental flag.');\n process.exit(1);\n }\n }); ","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\n\nconst CWD_PACKAGE_JSON = path.join(process.cwd(), 'package.json');\nconst CWD_NODE_MODULES = path.join(process.cwd(), 'node_modules');\nlet MICROFOX_NODE_MODULES: string;\n\nfunction log(message: string, isError = false, isWarning = false) {\n const timestamp = new Date().toLocaleTimeString();\n let prefix;\n\n if (isError) {\n prefix = chalk.red(`ā [install-microfox ${timestamp}]`);\n } else if (isWarning) {\n prefix = chalk.yellow(`ā ļø [install-microfox ${timestamp}]`);\n } else {\n prefix = chalk.blue(`ā¹ļø [install-microfox ${timestamp}]`);\n }\n\n console.log(`${prefix} ${message}`);\n}\n\nfunction logSuccess(message: string) {\n const timestamp = new Date().toLocaleTimeString();\n console.log(chalk.green(`ā
[install-microfox ${timestamp}] ${message}`));\n}\n\nfunction logSection(title: string) {\n console.log('\\n' + '='.repeat(60));\n console.log(` ${title}`);\n console.log('='.repeat(60));\n}\n\nfunction findSourceDir(targetDirName: string): string | null {\n let currentDir = process.cwd();\n for (let i = 0; i < 10; i++) {\n const gitDir = path.join(currentDir, '.git');\n if (fs.existsSync(gitDir)) {\n const parentDir = path.dirname(currentDir);\n const microfoxDir = path.join(parentDir, targetDirName);\n if (fs.existsSync(microfoxDir)) {\n return microfoxDir;\n }\n }\n const parent = path.dirname(currentDir);\n if (parent === currentDir) {\n break;\n }\n currentDir = parent;\n }\n return null;\n}\n\nfunction copyDirectory(src: string, dest: string): boolean {\n try {\n const normalizedSrc = path.resolve(src);\n const normalizedDest = path.resolve(dest);\n\n log(`Copying from: ${normalizedSrc}`);\n log(`Copying to: ${normalizedDest}`);\n\n if (!fs.existsSync(normalizedDest)) {\n fs.mkdirSync(normalizedDest, { recursive: true });\n }\n\n const isWindows = process.platform === 'win32';\n\n if (isWindows) {\n try {\n execSync(`robocopy \"${normalizedSrc}\" \"${normalizedDest}\" /E /NFL /NDL /NJH /NJS /nc /ns /np`, { stdio: 'pipe' });\n } catch (error: any) {\n if (error.status !== 1 && error.status !== 0) {\n throw error;\n }\n }\n } else {\n execSync(`cp -r \"${normalizedSrc}/.\" \"${normalizedDest}\"`, { stdio: 'pipe' });\n }\n\n if (fs.existsSync(normalizedDest) && fs.readdirSync(normalizedDest).length > 0) {\n log(`ā
Copied ${normalizedSrc} -> ${normalizedDest}`);\n return true;\n } else {\n log(`ā Copy verification failed: destination is empty`);\n return false;\n }\n } catch (error: any) {\n log(`ā Failed to copy ${src} -> ${dest}: ${error.message}`);\n return false;\n }\n}\n\nfunction updatePackageJson(packageName: string): boolean {\n try {\n log(`Updating package.json to add ${packageName} with \"*\" version...`);\n\n if (!fs.existsSync(CWD_PACKAGE_JSON)) {\n log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);\n return false;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, 'utf8'));\n\n const existingVersion = packageJson.dependencies?.[packageName] || packageJson.devDependencies?.[packageName];\n if (existingVersion && existingVersion !== '*') {\n log(`Package ${packageName} already exists with version: ${existingVersion}`, false, true);\n log(`Updating to \"*\" for local development...`, false, true);\n }\n\n if (!packageJson.dependencies) {\n packageJson.dependencies = {};\n }\n\n packageJson.dependencies[packageName] = '*';\n\n if (packageJson.devDependencies?.[packageName]) {\n delete packageJson.devDependencies[packageName];\n log(`Moved ${packageName} from devDependencies to dependencies`);\n }\n\n fs.writeFileSync(CWD_PACKAGE_JSON, JSON.stringify(packageJson, null, 2) + '\\n');\n\n logSuccess(`Added ${packageName}: \"*\" to package.json`);\n return true;\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);\n } else if (error instanceof SyntaxError) {\n log(`Invalid JSON in package.json: ${error.message}`, true);\n } else if (error.code === 'EACCES') {\n log(`Permission denied writing to package.json`, true);\n } else {\n log(`Failed to update package.json: ${error.message}`, true);\n }\n return false;\n }\n}\n\nfunction installSpecificPackage(packageName: string) {\n logSection(`Installing Specific Package: ${packageName}`);\n\n if (!packageName || typeof packageName !== 'string' || !packageName.startsWith('@microfox/')) {\n log(`Invalid package name format: \"${packageName}\". Must start with \"@microfox/\"`, true);\n process.exit(1);\n }\n\n const packageShortName = packageName.replace('@microfox/', '');\n if (!packageShortName || packageShortName.trim() === '') {\n log(`Invalid package name: \"${packageName}\"`, true);\n process.exit(1);\n }\n\n const microfoxDir = path.join(MICROFOX_NODE_MODULES, '@microfox');\n const srcDir = path.join(microfoxDir, packageShortName);\n\n log(`Searching for package: ${packageName}`);\n log(`Source directory: ${srcDir}`);\n\n if (!fs.existsSync(microfoxDir)) {\n log(`Microfox packages directory not found at: ${microfoxDir}`, true);\n process.exit(1);\n }\n\n if (!fs.existsSync(srcDir)) {\n log(`Package \"${packageName}\" not found in source packages`, true);\n log(`Searched in: ${srcDir}`, true);\n process.exit(1);\n }\n\n if (!updatePackageJson(packageName)) {\n process.exit(1);\n }\n\n const microfoxScopeDir = path.join(CWD_NODE_MODULES, '@microfox');\n if (!fs.existsSync(microfoxScopeDir)) {\n fs.mkdirSync(microfoxScopeDir, { recursive: true });\n }\n\n const destDir = path.join(CWD_NODE_MODULES, '@microfox', packageShortName);\n\n log(`Copying package files...`);\n if (copyDirectory(srcDir, destDir)) {\n logSection(`ā
SUCCESS`);\n logSuccess(`Package ${packageName} installed for local development!`);\n log(`Package location: ${destDir}`);\n } else {\n log(`Failed to copy package files`, true);\n process.exit(1);\n }\n}\n\nfunction installAllPackages() {\n log('Installing all @microfox/* packages with \"*\" version from package.json...');\n\n const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, 'utf8'));\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n const microfoxPackages = Object.entries(dependencies)\n .filter(([name, version]) => name.startsWith('@microfox/') && version === '*')\n .map(([name]) => name);\n\n if (microfoxPackages.length === 0) {\n log('ā¹ļø No @microfox/* packages with \"*\" version found in package.json');\n return;\n }\n\n log(`Found ${microfoxPackages.length} @microfox/* packages to install:`);\n microfoxPackages.forEach(pkg => log(` - ${pkg}`));\n\n const microfoxScopeDir = path.join(CWD_NODE_MODULES, '@microfox');\n if (!fs.existsSync(microfoxScopeDir)) {\n fs.mkdirSync(microfoxScopeDir, { recursive: true });\n }\n\n let successCount = 0;\n let failureCount = 0;\n\n for (const packageName of microfoxPackages) {\n const packageShortName = packageName.replace('@microfox/', '');\n const srcDir = path.join(MICROFOX_NODE_MODULES, '@microfox', packageShortName);\n const destDir = path.join(CWD_NODE_MODULES, '@microfox', packageShortName);\n\n if (!fs.existsSync(srcDir)) {\n log(`ā ļø Package ${packageName} not found in source node_modules, skipping...`);\n failureCount++;\n continue;\n }\n\n if (copyDirectory(srcDir, destDir)) {\n successCount++;\n } else {\n failureCount++;\n }\n }\n\n log(`\\nš Installation Summary:`);\n log(` ā
Successfully installed: ${successCount} packages`);\n if (failureCount > 0) {\n log(` ā Failed to install: ${failureCount} packages`);\n }\n}\n\nexport async function runExperimentalInstall(packages: string[], targetDirName: string) {\n try {\n logSection('Microfox Local Package Installer (Experimental)');\n log(`Started at: ${new Date().toLocaleString()}`);\n log(`Working directory: ${process.cwd()}`);\n\n const sourceDir = findSourceDir(targetDirName);\n if (!sourceDir) {\n log(`Could not find source directory '${targetDirName}' in any parent of a .git directory.`, true)\n log(`Searched up to 10 levels from ${process.cwd()}`, true)\n process.exit(1);\n }\n log(`Found source directory at: ${sourceDir}`);\n MICROFOX_NODE_MODULES = path.join(sourceDir, 'node_modules');\n\n if (!fs.existsSync(MICROFOX_NODE_MODULES)) {\n log(`Source node_modules directory not found at: ${MICROFOX_NODE_MODULES}`, true);\n log(`Please run 'npm install' or 'pnpm install' in ${sourceDir}`, true);\n process.exit(1);\n }\n\n if (!fs.existsSync(CWD_PACKAGE_JSON)) {\n log(`package.json not found in current directory: ${CWD_PACKAGE_JSON}`, true);\n process.exit(1);\n }\n\n if (packages.length > 0) {\n log(`Installing ${packages.length} specific package(s)...`);\n for (let i = 0; i < packages.length; i++) {\n const packageName = packages[i];\n log(`\\n[${i + 1}/${packages.length}] Processing: ${packageName}`);\n installSpecificPackage(packageName);\n }\n logSection('š All Specified Packages Installed Successfully');\n } else {\n installAllPackages();\n }\n } catch (error: any) {\n log('', true);\n log(`Unexpected error occurred: ${error.message}`, true);\n if (error.stack) {\n log(`Stack trace: ${error.stack}`, true);\n }\n process.exit(1);\n }\n} "],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getWorkingDirectory
|
|
4
|
+
} from "./chunk-TZQZMKHP.mjs";
|
|
5
|
+
import {
|
|
6
|
+
__require
|
|
7
|
+
} from "./chunk-KPJJOO76.mjs";
|
|
8
|
+
|
|
9
|
+
// src/commands/kickstart.ts
|
|
10
|
+
import { Command } from "commander";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import path from "path";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import readlineSync from "readline-sync";
|
|
15
|
+
import inquirer from "inquirer";
|
|
16
|
+
|
|
17
|
+
// src/utils/npmChecker.ts
|
|
18
|
+
async function isPackageNameAvailable(packageName) {
|
|
19
|
+
try {
|
|
20
|
+
const controller = new AbortController();
|
|
21
|
+
const timeoutId = setTimeout(() => controller.abort(), 5e3);
|
|
22
|
+
const response = await fetch(`https://registry.npmjs.org/${packageName}`, {
|
|
23
|
+
signal: controller.signal
|
|
24
|
+
});
|
|
25
|
+
clearTimeout(timeoutId);
|
|
26
|
+
if (response.ok) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (response.status === 404) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
console.warn(
|
|
33
|
+
`Warning: Unexpected status ${response.status} when checking npm availability for ${packageName}. Proceeding with caution.`
|
|
34
|
+
);
|
|
35
|
+
return false;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (error.name === "AbortError") {
|
|
38
|
+
console.warn(
|
|
39
|
+
`Warning: Timeout when checking npm availability for ${packageName}. Proceeding with caution.`
|
|
40
|
+
);
|
|
41
|
+
} else {
|
|
42
|
+
console.warn(
|
|
43
|
+
`Warning: Could not check npm availability for ${packageName}. Proceeding with caution.`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function checkPackageNameAndPrompt(packageName) {
|
|
50
|
+
const readlineSync2 = __require("readline-sync");
|
|
51
|
+
let currentName = (packageName == null ? void 0 : packageName.startsWith("@microfox/")) ? packageName : `@microfox/${packageName}`;
|
|
52
|
+
while (true) {
|
|
53
|
+
console.log(`\u{1F50D} Checking npm availability for "${currentName}"...`);
|
|
54
|
+
const isAvailable = await isPackageNameAvailable(currentName);
|
|
55
|
+
if (isAvailable) {
|
|
56
|
+
console.log(`\u2705 Package name "${currentName}" is available on npm!`);
|
|
57
|
+
return currentName;
|
|
58
|
+
} else {
|
|
59
|
+
console.log(`\u274C Package name "${currentName}" is already taken on npm.`);
|
|
60
|
+
const newName = readlineSync2.question(
|
|
61
|
+
"Please enter a new package name: "
|
|
62
|
+
);
|
|
63
|
+
if (!newName || newName.trim() === "") {
|
|
64
|
+
console.log("\u274C Invalid package name. Please try again.");
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
currentName = newName.trim();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// src/commands/kickstart.ts
|
|
73
|
+
async function createAgentProject(agentName) {
|
|
74
|
+
const workingDir = getWorkingDirectory();
|
|
75
|
+
const agentDir = path.join(workingDir, agentName);
|
|
76
|
+
if (fs.existsSync(agentDir)) {
|
|
77
|
+
throw new Error(`Directory already exists at ${agentDir}`);
|
|
78
|
+
}
|
|
79
|
+
console.log(
|
|
80
|
+
chalk.blue(
|
|
81
|
+
`\u{1F680} Creating agent ${chalk.bold(agentName)} at ${agentDir}
|
|
82
|
+
`
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
fs.mkdirSync(agentDir, { recursive: true });
|
|
86
|
+
const templatePath = path.resolve(__dirname, "agent-template.txt");
|
|
87
|
+
const templateContent = fs.readFileSync(templatePath, "utf-8");
|
|
88
|
+
const fileSections = templateContent.split("--- filename: ").slice(1);
|
|
89
|
+
for (const section of fileSections) {
|
|
90
|
+
const lines = section.split("\n");
|
|
91
|
+
const filePath = lines.shift().trim();
|
|
92
|
+
const content = lines.join("\n").replace(/<%= agentName %>/g, agentName);
|
|
93
|
+
const destPath = path.join(agentDir, filePath);
|
|
94
|
+
const destDir = path.dirname(destPath);
|
|
95
|
+
if (!fs.existsSync(destDir)) {
|
|
96
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
fs.writeFileSync(destPath, content);
|
|
99
|
+
console.log(chalk.green(`\u2705 Created ${filePath}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function createPackageProject(packageName) {
|
|
103
|
+
const simpleName = packageName.includes("/") ? packageName.split("/")[1] : packageName;
|
|
104
|
+
const titleName = simpleName.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
105
|
+
const description = `A TypeScript SDK for ${titleName}.`;
|
|
106
|
+
const className = simpleName.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("") + "Sdk";
|
|
107
|
+
const workingDir = getWorkingDirectory();
|
|
108
|
+
const packageDir = path.join(workingDir, simpleName);
|
|
109
|
+
if (fs.existsSync(packageDir)) {
|
|
110
|
+
throw new Error(`Directory already exists at ${packageDir}`);
|
|
111
|
+
}
|
|
112
|
+
console.log(
|
|
113
|
+
chalk.blue(
|
|
114
|
+
`\u{1F680} Creating package ${chalk.bold(packageName)} at ${packageDir}
|
|
115
|
+
`
|
|
116
|
+
)
|
|
117
|
+
);
|
|
118
|
+
fs.mkdirSync(packageDir, { recursive: true });
|
|
119
|
+
const templatePath = path.resolve(__dirname, "package-template.txt");
|
|
120
|
+
const templateContent = fs.readFileSync(templatePath, "utf-8");
|
|
121
|
+
const fileSections = templateContent.split("--- filename: ").slice(1);
|
|
122
|
+
for (const section of fileSections) {
|
|
123
|
+
const lines = section.split("\n");
|
|
124
|
+
const filePath = lines.shift().trim().replace(/<%= simpleName %>/g, simpleName);
|
|
125
|
+
let content = lines.join("\n");
|
|
126
|
+
content = content.replace(/<%= packageName %>/g, packageName);
|
|
127
|
+
content = content.replace(/<%= simpleName %>/g, simpleName);
|
|
128
|
+
content = content.replace(/<%= titleName %>/g, titleName);
|
|
129
|
+
content = content.replace(/<%= description %>/g, description);
|
|
130
|
+
content = content.replace(/<%= className %>/g, className);
|
|
131
|
+
const destPath = path.join(packageDir, filePath);
|
|
132
|
+
const destDir = path.dirname(destPath);
|
|
133
|
+
if (!fs.existsSync(destDir)) {
|
|
134
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
fs.writeFileSync(destPath, content);
|
|
137
|
+
console.log(chalk.green(`\u2705 Created ${filePath}`));
|
|
138
|
+
}
|
|
139
|
+
const docsDir = path.join(packageDir, "docs");
|
|
140
|
+
const docsConstructors = path.join(docsDir, "constructors");
|
|
141
|
+
const docsFunctions = path.join(docsDir, "functions");
|
|
142
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
|
143
|
+
fs.mkdirSync(docsConstructors, { recursive: true });
|
|
144
|
+
fs.mkdirSync(docsFunctions, { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
async function createBackgroundAgentProject(agentName) {
|
|
147
|
+
const workingDir = getWorkingDirectory();
|
|
148
|
+
const agentDir = path.join(workingDir, agentName);
|
|
149
|
+
if (fs.existsSync(agentDir)) {
|
|
150
|
+
throw new Error(`Directory already exists at ${agentDir}`);
|
|
151
|
+
}
|
|
152
|
+
console.log(
|
|
153
|
+
chalk.blue(
|
|
154
|
+
`\u{1F680} Creating background agent ${chalk.bold(agentName)} at ${agentDir}
|
|
155
|
+
`
|
|
156
|
+
)
|
|
157
|
+
);
|
|
158
|
+
fs.mkdirSync(agentDir, { recursive: true });
|
|
159
|
+
const templateDir = path.resolve(__dirname, "background-agent");
|
|
160
|
+
const copyTemplates = (src, dest) => {
|
|
161
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
162
|
+
for (const entry of entries) {
|
|
163
|
+
const srcPath = path.join(src, entry.name);
|
|
164
|
+
const destPath = path.join(dest, entry.name.replace(/\.txt$/, ""));
|
|
165
|
+
if (entry.isDirectory()) {
|
|
166
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
167
|
+
copyTemplates(srcPath, destPath);
|
|
168
|
+
} else if (entry.name.endsWith(".txt")) {
|
|
169
|
+
const templateContent = fs.readFileSync(srcPath, "utf-8");
|
|
170
|
+
const content = templateContent.replace(/<%= agentName %>/g, agentName);
|
|
171
|
+
fs.writeFileSync(destPath, content);
|
|
172
|
+
console.log(chalk.green(`\u2705 Created ${path.relative(agentDir, destPath)}`));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
copyTemplates(templateDir, agentDir);
|
|
177
|
+
}
|
|
178
|
+
async function kickstartAction() {
|
|
179
|
+
console.log(chalk.cyan("\u{1F680} Let's kickstart your new project!\n"));
|
|
180
|
+
const { boilerplateType } = await inquirer.prompt([
|
|
181
|
+
{
|
|
182
|
+
type: "list",
|
|
183
|
+
name: "boilerplateType",
|
|
184
|
+
message: "Select boilerplate type:",
|
|
185
|
+
choices: ["package", "agent"]
|
|
186
|
+
}
|
|
187
|
+
]);
|
|
188
|
+
if (!boilerplateType) {
|
|
189
|
+
console.log(chalk.yellow("Operation cancelled."));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (boilerplateType === "agent") {
|
|
193
|
+
const { agentType } = await inquirer.prompt([
|
|
194
|
+
{
|
|
195
|
+
type: "list",
|
|
196
|
+
name: "agentType",
|
|
197
|
+
message: "Select agent type:",
|
|
198
|
+
choices: ["plain", "background"]
|
|
199
|
+
}
|
|
200
|
+
]);
|
|
201
|
+
if (agentType === "plain") {
|
|
202
|
+
const agentName = readlineSync.question(
|
|
203
|
+
chalk.yellow("\u{1F4E6} Enter agent name: ")
|
|
204
|
+
);
|
|
205
|
+
if (!agentName.trim()) {
|
|
206
|
+
throw new Error("Agent name cannot be empty");
|
|
207
|
+
}
|
|
208
|
+
await createAgentProject(agentName.trim());
|
|
209
|
+
console.log(
|
|
210
|
+
chalk.green(
|
|
211
|
+
`
|
|
212
|
+
\u{1F389} Successfully created agent ${chalk.bold(agentName)}!`
|
|
213
|
+
)
|
|
214
|
+
);
|
|
215
|
+
console.log(chalk.gray(`\u{1F4CD} Located at ${path.join(getWorkingDirectory(), agentName)}`));
|
|
216
|
+
console.log(chalk.yellow("\n\u{1F4A1} Next steps:"));
|
|
217
|
+
console.log(chalk.yellow(` 1. cd ${agentName}`));
|
|
218
|
+
console.log(chalk.yellow(" 2. npm install"));
|
|
219
|
+
console.log(chalk.yellow(" 3. Configure your env.json"));
|
|
220
|
+
console.log(chalk.yellow(" 4. npm run dev"));
|
|
221
|
+
console.log(chalk.yellow(" 5. Start developing your agent!"));
|
|
222
|
+
} else if (agentType === "background") {
|
|
223
|
+
const agentName = readlineSync.question(
|
|
224
|
+
chalk.yellow("\u{1F4E6} Enter agent name: ")
|
|
225
|
+
);
|
|
226
|
+
if (!agentName.trim()) {
|
|
227
|
+
throw new Error("Agent name cannot be empty");
|
|
228
|
+
}
|
|
229
|
+
await createBackgroundAgentProject(agentName.trim());
|
|
230
|
+
console.log(
|
|
231
|
+
chalk.green(
|
|
232
|
+
`
|
|
233
|
+
\u{1F389} Successfully created background agent ${chalk.bold(agentName)}!`
|
|
234
|
+
)
|
|
235
|
+
);
|
|
236
|
+
console.log(chalk.gray(`\u{1F4CD} Located at ${path.join(getWorkingDirectory(), agentName)}`));
|
|
237
|
+
console.log(chalk.yellow("\n\u{1F4A1} Next steps:"));
|
|
238
|
+
console.log(chalk.yellow(` 1. cd ${agentName}`));
|
|
239
|
+
console.log(chalk.yellow(" 2. npm install"));
|
|
240
|
+
console.log(chalk.yellow(" 3. Configure your env.json"));
|
|
241
|
+
console.log(chalk.yellow(" 4. npm run dev"));
|
|
242
|
+
console.log(chalk.yellow(" 5. Start developing your agent!"));
|
|
243
|
+
}
|
|
244
|
+
} else if (boilerplateType === "package") {
|
|
245
|
+
const packageName = readlineSync.question(
|
|
246
|
+
chalk.yellow("\u{1F4E6} Enter package name: ")
|
|
247
|
+
);
|
|
248
|
+
if (!packageName.trim()) {
|
|
249
|
+
throw new Error("Package name cannot be empty");
|
|
250
|
+
}
|
|
251
|
+
const finalPackageName = await checkPackageNameAndPrompt(`@microfox/${packageName.trim()}`);
|
|
252
|
+
await createPackageProject(finalPackageName);
|
|
253
|
+
const simpleName = finalPackageName.includes("/") ? finalPackageName.split("/")[1] : finalPackageName;
|
|
254
|
+
console.log(
|
|
255
|
+
chalk.green(
|
|
256
|
+
`
|
|
257
|
+
\u{1F389} Successfully created package ${chalk.bold(finalPackageName)}!`
|
|
258
|
+
)
|
|
259
|
+
);
|
|
260
|
+
console.log(chalk.gray(`\u{1F4CD} Located at ${path.join(getWorkingDirectory(), simpleName)}`));
|
|
261
|
+
console.log(chalk.yellow("\n\u{1F4A1} Next steps:"));
|
|
262
|
+
console.log(chalk.yellow(` 1. cd ${simpleName}`));
|
|
263
|
+
console.log(chalk.yellow(" 2. npm install"));
|
|
264
|
+
console.log(chalk.yellow(" 3. npm run build"));
|
|
265
|
+
console.log(chalk.yellow(" 4. npm test"));
|
|
266
|
+
console.log(chalk.yellow(" 5. Start developing your SDK!"));
|
|
267
|
+
console.log(
|
|
268
|
+
chalk.gray(
|
|
269
|
+
`
|
|
270
|
+
\u{1F4DA} Your package is ready to be published to npm as "${finalPackageName}"`
|
|
271
|
+
)
|
|
272
|
+
);
|
|
273
|
+
} else {
|
|
274
|
+
console.log(chalk.red('Invalid boilerplate type selected. Please choose "package" or "agent".'));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
var kickstartCommand = new Command("kickstart").description("Kickstart a new TypeScript SDK or agent package").action(async () => {
|
|
278
|
+
try {
|
|
279
|
+
console.log(chalk.blue("\u{1F680} Package Kickstarter\n"));
|
|
280
|
+
await kickstartAction();
|
|
281
|
+
} catch (error) {
|
|
282
|
+
console.error(chalk.red("\u274C Error:"), error instanceof Error ? error.message : String(error));
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
export {
|
|
288
|
+
kickstartCommand
|
|
289
|
+
};
|
|
290
|
+
//# sourceMappingURL=chunk-JGAX4PD6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/kickstart.ts","../src/utils/npmChecker.ts"],"sourcesContent":["import { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport readlineSync from 'readline-sync';\nimport inquirer from 'inquirer';\nimport { getWorkingDirectory } from '../utils/getProjectRoot';\nimport { checkPackageNameAndPrompt } from '../utils/npmChecker';\n\nasync function createAgentProject(agentName: string): Promise<void> {\n const workingDir = getWorkingDirectory();\n const agentDir = path.join(workingDir, agentName);\n\n if (fs.existsSync(agentDir)) {\n throw new Error(`Directory already exists at ${agentDir}`);\n }\n\n console.log(\n chalk.blue(\n `š Creating agent ${chalk.bold(agentName)} at ${agentDir}\\n`,\n ),\n );\n\n fs.mkdirSync(agentDir, { recursive: true });\n\n const templatePath = path.resolve(__dirname, 'agent-template.txt');\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n\n const fileSections = templateContent.split('--- filename: ').slice(1);\n\n for (const section of fileSections) {\n const lines = section.split('\\n');\n const filePath = lines.shift()!.trim();\n const content = lines.join('\\n').replace(/<%= agentName %>/g, agentName);\n \n const destPath = path.join(agentDir, filePath);\n const destDir = path.dirname(destPath);\n\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`ā
Created ${filePath}`));\n }\n}\n\nasync function createPackageProject(packageName: string): Promise<void> {\n const simpleName = packageName.includes('/')\n ? packageName.split('/')[1]\n : packageName;\n const titleName = simpleName\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n const description = `A TypeScript SDK for ${titleName}.`;\n const className = simpleName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('') + 'Sdk';\n\n const workingDir = getWorkingDirectory();\n const packageDir = path.join(workingDir, simpleName);\n\n if (fs.existsSync(packageDir)) {\n throw new Error(`Directory already exists at ${packageDir}`);\n }\n\n console.log(\n chalk.blue(\n `š Creating package ${chalk.bold(packageName)} at ${packageDir}\\n`,\n ),\n );\n \n fs.mkdirSync(packageDir, { recursive: true });\n\n const templatePath = path.resolve(__dirname, 'package-template.txt');\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n\n const fileSections = templateContent.split('--- filename: ').slice(1);\n\n for (const section of fileSections) {\n const lines = section.split('\\n');\n const filePath = lines.shift()!.trim().replace(/<%= simpleName %>/g, simpleName);\n let content = lines.join('\\n');\n\n content = content.replace(/<%= packageName %>/g, packageName);\n content = content.replace(/<%= simpleName %>/g, simpleName);\n content = content.replace(/<%= titleName %>/g, titleName);\n content = content.replace(/<%= description %>/g, description);\n content = content.replace(/<%= className %>/g, className);\n\n const destPath = path.join(packageDir, filePath);\n const destDir = path.dirname(destPath);\n\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`ā
Created ${filePath}`));\n }\n\n const docsDir = path.join(packageDir, 'docs');\n const docsConstructors = path.join(docsDir, 'constructors');\n const docsFunctions = path.join(docsDir, 'functions');\n\n fs.mkdirSync(docsDir, { recursive: true });\n fs.mkdirSync(docsConstructors, { recursive: true });\n fs.mkdirSync(docsFunctions, { recursive: true });\n}\n\nasync function createBackgroundAgentProject(agentName: string): Promise<void> {\n const workingDir = getWorkingDirectory();\n const agentDir = path.join(workingDir, agentName);\n \n if (fs.existsSync(agentDir)) {\n throw new Error(`Directory already exists at ${agentDir}`);\n }\n \n console.log(\n chalk.blue(\n `š Creating background agent ${chalk.bold(agentName)} at ${agentDir}\\n`,\n ),\n );\n \n fs.mkdirSync(agentDir, { recursive: true });\n \n const templateDir = path.resolve(__dirname, 'background-agent');\n \n const copyTemplates = (src: string, dest: string) => {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name.replace(/\\.txt$/, ''));\n \n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyTemplates(srcPath, destPath);\n } else if (entry.name.endsWith('.txt')) {\n const templateContent = fs.readFileSync(srcPath, 'utf-8');\n const content = templateContent.replace(/<%= agentName %>/g, agentName);\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`ā
Created ${path.relative(agentDir, destPath)}`));\n }\n }\n };\n \n copyTemplates(templateDir, agentDir);\n}\n\nasync function kickstartAction(): Promise<void> {\n console.log(chalk.cyan(\"š Let's kickstart your new project!\\n\"));\n\n const { boilerplateType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'boilerplateType',\n message: 'Select boilerplate type:',\n choices: ['package', 'agent'],\n },\n ]);\n\n if (!boilerplateType) {\n console.log(chalk.yellow('Operation cancelled.'));\n return;\n }\n\n if (boilerplateType === 'agent') {\n const { agentType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'agentType',\n message: 'Select agent type:',\n choices: ['plain', 'background'],\n },\n ]);\n \n if(agentType === 'plain'){\n const agentName = readlineSync.question(\n chalk.yellow('š¦ Enter agent name: '),\n );\n \n if (!agentName.trim()) {\n throw new Error('Agent name cannot be empty');\n }\n await createAgentProject(agentName.trim());\n \n console.log(\n chalk.green(\n `\\nš Successfully created agent ${chalk.bold(agentName)}!`,\n ),\n );\n console.log(chalk.gray(`š Located at ${path.join(getWorkingDirectory(), agentName)}`));\n console.log(chalk.yellow('\\nš” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${agentName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. Configure your env.json'));\n console.log(chalk.yellow(' 4. npm run dev'));\n console.log(chalk.yellow(' 5. Start developing your agent!'));\n\n } else if (agentType === 'background') {\n const agentName = readlineSync.question(\n chalk.yellow('š¦ Enter agent name: '),\n );\n \n if (!agentName.trim()) {\n throw new Error('Agent name cannot be empty');\n }\n await createBackgroundAgentProject(agentName.trim());\n\n console.log(\n chalk.green(\n `\\nš Successfully created background agent ${chalk.bold(agentName)}!`,\n ),\n );\n console.log(chalk.gray(`š Located at ${path.join(getWorkingDirectory(), agentName)}`));\n console.log(chalk.yellow('\\nš” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${agentName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. Configure your env.json'));\n console.log(chalk.yellow(' 4. npm run dev'));\n console.log(chalk.yellow(' 5. Start developing your agent!'));\n }\n\n } else if (boilerplateType === 'package') {\n // Ask for package name interactively\n const packageName = readlineSync.question(\n chalk.yellow('š¦ Enter package name: '),\n );\n\n if (!packageName.trim()) {\n throw new Error('Package name cannot be empty');\n }\n\n // Check npm availability and get final package name\n const finalPackageName = await checkPackageNameAndPrompt(`@microfox/${packageName.trim()}`);\n await createPackageProject(finalPackageName);\n\n const simpleName = finalPackageName.includes('/')\n ? finalPackageName.split('/')[1]\n : finalPackageName;\n\n console.log(\n chalk.green(\n `\\nš Successfully created package ${chalk.bold(finalPackageName)}!`,\n ),\n );\n console.log(chalk.gray(`š Located at ${path.join(getWorkingDirectory(), simpleName)}`));\n console.log(chalk.yellow('\\nš” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${simpleName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. npm run build'));\n console.log(chalk.yellow(' 4. npm test'));\n console.log(chalk.yellow(' 5. Start developing your SDK!'));\n console.log(\n chalk.gray(\n `\\nš Your package is ready to be published to npm as \"${finalPackageName}\"`,\n ),\n );\n } else {\n console.log(chalk.red('Invalid boilerplate type selected. Please choose \"package\" or \"agent\".'));\n }\n}\n\nexport const kickstartCommand = new Command('kickstart')\n .description('Kickstart a new TypeScript SDK or agent package')\n .action(async () => {\n try {\n console.log(chalk.blue('š Package Kickstarter\\n'));\n await kickstartAction();\n } catch (error) {\n console.error(chalk.red('ā Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n","export async function isPackageNameAvailable(\n packageName: string,\n): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`https://registry.npmjs.org/${packageName}`, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // If we get a 200 response, the package exists\n if (response.ok) {\n return false;\n }\n\n // If we get a 404, the package doesn't exist (available)\n if (response.status === 404) {\n return true;\n }\n\n // For other status codes, assume unavailable for safety\n console.warn(\n `Warning: Unexpected status ${response.status} when checking npm availability for ${packageName}. Proceeding with caution.`,\n );\n return false;\n } catch (error: any) {\n // For network errors, timeouts, etc., assume unavailable for safety\n if (error.name === 'AbortError') {\n console.warn(\n `Warning: Timeout when checking npm availability for ${packageName}. Proceeding with caution.`,\n );\n } else {\n console.warn(\n `Warning: Could not check npm availability for ${packageName}. Proceeding with caution.`,\n );\n }\n return false;\n }\n}\n\nexport async function checkPackageNameAndPrompt(\n packageName: string,\n): Promise<string> {\n const readlineSync = require('readline-sync');\n let currentName = packageName?.startsWith('@microfox/')\n ? packageName\n : `@microfox/${packageName}`;\n\n while (true) {\n console.log(`š Checking npm availability for \"${currentName}\"...`);\n\n const isAvailable = await isPackageNameAvailable(currentName);\n\n if (isAvailable) {\n console.log(`ā
Package name \"${currentName}\" is available on npm!`);\n return currentName;\n } else {\n console.log(`ā Package name \"${currentName}\" is already taken on npm.`);\n\n const newName = readlineSync.question(\n 'Please enter a new package name: ',\n );\n if (!newName || newName.trim() === '') {\n console.log('ā Invalid package name. Please try again.');\n continue;\n }\n\n currentName = newName.trim();\n }\n }\n}\n"],"mappings":"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","names":["readlineSync"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
+
}) : x)(function(x) {
|
|
5
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
__require
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=chunk-KPJJOO76.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|