farseer-cli 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 +15 -0
- package/README.md +741 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.js +349 -0
- package/dist/commands/app.js.map +7 -0
- package/dist/commands/apps.d.ts +2 -0
- package/dist/commands/apps.js +111 -0
- package/dist/commands/apps.js.map +7 -0
- package/dist/commands/checkout.d.ts +2 -0
- package/dist/commands/checkout.js +166 -0
- package/dist/commands/checkout.js.map +7 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +139 -0
- package/dist/commands/config.js.map +7 -0
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.js +183 -0
- package/dist/commands/diff.js.map +7 -0
- package/dist/commands/files.js +99 -0
- package/dist/commands/files.js.map +7 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.js +79 -0
- package/dist/commands/install.js.map +7 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +92 -0
- package/dist/commands/list.js.map +7 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +134 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +59 -0
- package/dist/commands/logout.js.map +7 -0
- package/dist/commands/mcp-server.d.ts +8 -0
- package/dist/commands/mcp-server.js +41 -0
- package/dist/commands/mcp-server.js.map +7 -0
- package/dist/commands/model.d.ts +2 -0
- package/dist/commands/model.js +189 -0
- package/dist/commands/model.js.map +7 -0
- package/dist/commands/pull.d.ts +2 -0
- package/dist/commands/pull.js +287 -0
- package/dist/commands/pull.js.map +7 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +251 -0
- package/dist/commands/push.js.map +7 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +246 -0
- package/dist/commands/run.js.map +7 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +137 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +145 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/unsetup.d.ts +2 -0
- package/dist/commands/unsetup.js +122 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +63 -0
- package/dist/commands/whoami.js.map +7 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +7 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.js +35 -0
- package/dist/mcp/index.js.map +7 -0
- package/dist/mcp/prompts/workflows.d.ts +7 -0
- package/dist/mcp/prompts/workflows.js +374 -0
- package/dist/mcp/prompts/workflows.js.map +7 -0
- package/dist/mcp/resources/documentation.d.ts +8 -0
- package/dist/mcp/resources/documentation.js +167 -0
- package/dist/mcp/resources/documentation.js.map +7 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +49 -0
- package/dist/mcp/server.js.map +7 -0
- package/dist/mcp/tools/appTools.d.ts +7 -0
- package/dist/mcp/tools/appTools.js +377 -0
- package/dist/mcp/tools/appTools.js.map +7 -0
- package/dist/mcp/tools/authTools.d.ts +7 -0
- package/dist/mcp/tools/authTools.js +158 -0
- package/dist/mcp/tools/authTools.js.map +7 -0
- package/dist/mcp/tools/modelTools.d.ts +7 -0
- package/dist/mcp/tools/modelTools.js +331 -0
- package/dist/mcp/tools/modelTools.js.map +7 -0
- package/dist/mcp/tools/runTools.d.ts +7 -0
- package/dist/mcp/tools/runTools.js +231 -0
- package/dist/mcp/tools/runTools.js.map +7 -0
- package/dist/mcp/tools/syncTools.d.ts +7 -0
- package/dist/mcp/tools/syncTools.js +382 -0
- package/dist/mcp/tools/syncTools.js.map +7 -0
- package/dist/mcp/utils/helpers.d.ts +69 -0
- package/dist/mcp/utils/helpers.js +113 -0
- package/dist/mcp/utils/helpers.js.map +7 -0
- package/dist/services/appSyncService.d.ts +75 -0
- package/dist/services/appSyncService.js +370 -0
- package/dist/services/appSyncService.js.map +7 -0
- package/dist/services/configService.d.ts +39 -0
- package/dist/services/configService.js +196 -0
- package/dist/services/configService.js.map +7 -0
- package/dist/services/farseerApi.d.ts +166 -0
- package/dist/services/farseerApi.js +378 -0
- package/dist/services/farseerApi.js.map +7 -0
- package/dist/services/farseerFactory.d.ts +88 -0
- package/dist/services/farseerFactory.js +179 -0
- package/dist/services/farseerFactory.js.map +7 -0
- package/dist/services/farseerService.d.ts +96 -0
- package/dist/services/farseerService.js +614 -0
- package/dist/services/farseerService.js.map +7 -0
- package/dist/services/gitService.d.ts +31 -0
- package/dist/services/gitService.js +134 -0
- package/dist/services/gitService.js.map +7 -0
- package/dist/services/syncService.d.ts +44 -0
- package/dist/services/syncService.js +320 -0
- package/dist/services/syncService.js.map +7 -0
- package/dist/utils/constants.d.ts +7 -0
- package/dist/utils/constants.js +46 -0
- package/dist/utils/constants.js.map +7 -0
- package/dist/utils/helpers.d.ts +69 -0
- package/dist/utils/helpers.js +413 -0
- package/dist/utils/helpers.js.map +7 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.js +76 -0
- package/dist/utils/logger.js.map +7 -0
- package/package.json +62 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/helpers.ts"],
|
|
4
|
+
"sourcesContent": ["import * as crypto from 'crypto';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { getCurrentTenant, getCurrentCheckout, getCurrentOrganisation, getTenantOrg, saveTenantOrgMapping } from '../services/configService';\nimport { logger } from './logger';\n\nexport function calculateHash(content: string | Buffer): string {\n return crypto.createHash('md5').update(content).digest('hex');\n}\n\nexport function getAppsDir(): string {\n // Use current working directory - files are saved where user runs the command\n return path.join(process.cwd(), 'farseer');\n}\n\nexport function getTenantDir(tenant: string): string {\n return path.join(getAppsDir(), tenant);\n}\n\nexport function getTenantFilesDir(tenant: string): string {\n return path.join(getTenantDir(tenant), 'files');\n}\n\n// Legacy - for backwards compatibility with run command\nexport function getTenantSrcDir(tenant: string): string {\n return path.join(getTenantFilesDir(tenant), 'Scripts');\n}\n\nexport function getSyncFilePath(tenant: string): string {\n return path.join(getTenantDir(tenant), '.farseer-sync.json');\n}\n\nexport function getAuditLogPath(tenant: string): string {\n return path.join(getTenantDir(tenant), '.farseer-audit.log');\n}\n\nexport function getTenantAppsDir(tenant: string): string {\n return path.join(getTenantDir(tenant), 'apps');\n}\n\nexport function ensureDirectoryExists(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\n/**\n * Detect if we're running inside the remotejobs repository.\n * Used to enable/disable git operations automatically.\n *\n * @returns true if in remotejobs repo, false if standalone\n */\nexport function isInRemotejobsRepo(): boolean {\n try {\n // Get the apps directory (e.g., /path/to/remotejobs/apps)\n const appsDir = getAppsDir();\n const repoRoot = path.dirname(appsDir); // /path/to/remotejobs\n\n // Check for remotejobs signature: cli/ and docs/ folders exist\n const hasCli = fs.existsSync(path.join(repoRoot, 'cli'));\n const hasDocs = fs.existsSync(path.join(repoRoot, 'docs'));\n\n // Both must exist to confirm we're in remotejobs\n return hasCli && hasDocs;\n } catch {\n // If anything fails (path resolution, fs errors), assume standalone\n return false;\n }\n}\n\nexport function getRelativePath(fullPath: string, basePath: string): string {\n return path.relative(basePath, fullPath);\n}\n\nexport function getAllFiles(dirPath: string, basePath?: string): string[] {\n if (!fs.existsSync(dirPath)) {\n return [];\n }\n\n const base = basePath || dirPath;\n const files: string[] = [];\n\n const items = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const item of items) {\n const fullPath = path.join(dirPath, item.name);\n\n if (item.isDirectory()) {\n files.push(...getAllFiles(fullPath, base));\n } else if (item.isFile() && isScriptFile(item.name)) {\n files.push(getRelativePath(fullPath, base));\n }\n }\n\n return files;\n}\n\n// Get all files in directory (not just scripts)\nexport function getAllFilesInDir(dirPath: string, basePath?: string): string[] {\n if (!fs.existsSync(dirPath)) {\n return [];\n }\n\n const base = basePath || dirPath;\n const files: string[] = [];\n\n const items = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const item of items) {\n const fullPath = path.join(dirPath, item.name);\n\n if (item.isDirectory()) {\n files.push(...getAllFilesInDir(fullPath, base));\n } else if (item.isFile()) {\n files.push(getRelativePath(fullPath, base));\n }\n }\n\n return files;\n}\n\nexport function isScriptFile(filename: string): boolean {\n const ext = path.extname(filename).toLowerCase();\n return ['.ts', '.js', '.mjs', '.cjs'].includes(ext);\n}\n\nexport function isTextFile(filename: string): boolean {\n const ext = path.extname(filename).toLowerCase().slice(1); // remove leading dot\n return ['ts', 'js', 'mjs', 'cjs', 'json', 'txt', 'md', 'csv', 'xml', 'html', 'css', 'yaml', 'yml'].includes(ext);\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString();\n}\n\nexport function getCredentialsHint(tenant: string): string {\n return `Use: farseer login\n Or: farseer config set ${tenant} --api-key <key> --org <organisation>`;\n}\n\n/**\n * Resolve tenant from argument or checkout.\n * If tenant is provided, use it. Otherwise, use checked-out tenant.\n * Returns null if no tenant is available.\n */\nexport interface ResolvedCheckout {\n organisation: string;\n tenant: string;\n}\n\n/**\n * Resolve organisation and tenant from argument or checkout.\n * When only tenant is provided, assumes organisation = tenant.\n */\nexport function resolveOrgAndTenant(tenantArg?: string): ResolvedCheckout | null {\n if (tenantArg) {\n // When tenant is specified as arg, assume org = tenant\n // (User can use checkout for different org/tenant)\n return { organisation: tenantArg, tenant: tenantArg };\n }\n\n const checkout = getCurrentCheckout();\n if (checkout) {\n if (checkout.organisation === checkout.tenant) {\n logger.dim(`Using checked-out tenant: ${checkout.tenant}`);\n } else {\n logger.dim(`Using checked-out tenant: ${checkout.tenant} (org: ${checkout.organisation})`);\n }\n return checkout;\n }\n\n return null;\n}\n\nexport function resolveTenant(tenantArg?: string): string | null {\n const resolved = resolveOrgAndTenant(tenantArg);\n return resolved?.tenant || null;\n}\n\n/**\n * Resolve tenant or exit with error if not available.\n */\nexport function resolveTenantOrExit(tenantArg?: string): string {\n const tenant = resolveTenant(tenantArg);\n if (!tenant) {\n logger.error('No tenant specified.');\n logger.dim('Either specify a tenant: farseer <command> <tenant>');\n logger.dim('Or checkout a tenant: farseer checkout <tenant>');\n process.exit(1);\n }\n return tenant;\n}\n\n/**\n * Resolve organisation and tenant with support for org-tenant mapping.\n *\n * Usage patterns:\n * - <org> <tenant>: Explicit org and tenant, saves mapping for future use\n * - <tenant>: Look up org from saved mapping or use checkout\n * - (no args): Use current checkout\n *\n * @param arg1 - Organisation (if 2 args) or tenant (if 1 arg)\n * @param arg2 - Tenant (if 2 args)\n * @returns ResolvedCheckout or exits with error\n */\nexport function resolveTenantWithOrgMapping(arg1?: string, arg2?: string): ResolvedCheckout {\n // Case 1: Two arguments - <org> <tenant>\n if (arg1 && arg2) {\n const org = arg1;\n const tenant = arg2;\n\n // Save mapping for future use\n saveTenantOrgMapping(tenant, org);\n\n if (org === tenant) {\n logger.dim(`Using tenant: ${tenant}`);\n } else {\n logger.dim(`Using tenant: ${tenant} (org: ${org})`);\n }\n\n return { organisation: org, tenant };\n }\n\n // Case 2: One argument - <tenant>\n if (arg1) {\n const tenant = arg1;\n\n // Try to get org from saved mapping\n const savedOrg = getTenantOrg(tenant);\n if (savedOrg) {\n if (savedOrg === tenant) {\n logger.dim(`Using tenant: ${tenant} (from saved mapping)`);\n } else {\n logger.dim(`Using tenant: ${tenant} (org: ${savedOrg}, from saved mapping)`);\n }\n return { organisation: savedOrg, tenant };\n }\n\n // No saved mapping - show error with helpful message\n logger.error(`Organisation unknown for tenant \"${tenant}\".`);\n logger.dim('Please specify both organisation and tenant:');\n logger.dim(` farseer <command> <organisation> <tenant>`);\n logger.dim(` Example: farseer pull jgl tt-hotels-hr-dev`);\n logger.dim('');\n logger.dim('Or checkout the tenant first:');\n logger.dim(` farseer checkout <organisation> <tenant>`);\n process.exit(1);\n }\n\n // Case 3: No arguments - use current checkout\n const checkout = getCurrentCheckout();\n if (checkout) {\n if (checkout.organisation === checkout.tenant) {\n logger.dim(`Using checked-out tenant: ${checkout.tenant}`);\n } else {\n logger.dim(`Using checked-out tenant: ${checkout.tenant} (org: ${checkout.organisation})`);\n }\n return checkout;\n }\n\n // No checkout either\n logger.error('No tenant specified.');\n logger.dim('Either specify organisation and tenant: farseer <command> <org> <tenant>');\n logger.dim('Or checkout a tenant: farseer checkout <org> <tenant>');\n process.exit(1);\n}\n\n/**\n * Resolve organisation and tenant or exit with error.\n */\nexport function resolveOrgAndTenantOrExit(tenantArg?: string): ResolvedCheckout {\n const resolved = resolveOrgAndTenant(tenantArg);\n if (!resolved) {\n logger.error('No tenant specified.');\n logger.dim('Either specify a tenant: farseer <command> <tenant>');\n logger.dim('Or checkout a tenant: farseer checkout <tenant>');\n process.exit(1);\n }\n return resolved;\n}\n\n/**\n * Check if a string is a known tenant (has credentials configured).\n */\nexport function isKnownTenant(name: string): boolean {\n // Import here to avoid circular dependency\n const { getCredential } = require('../services/configService');\n return !!getCredential(name);\n}\n\nexport interface ParsedAppArgs {\n organisation: string;\n tenant: string;\n appName: string;\n}\n\n/**\n * Parse variadic arguments to extract tenant and app name.\n * If first arg is a known tenant, use it as tenant and rest as app name.\n * Otherwise, use checked-out tenant and all args as app name.\n *\n * @param args Array of arguments (from variadic command)\n * @returns { organisation: string, tenant: string, appName: string }\n */\nexport function parseAppArgs(args: string[]): ParsedAppArgs {\n if (args.length === 0) {\n logger.error('App name is required.');\n process.exit(1);\n }\n\n // Check if first argument is a known tenant\n if (args.length >= 2 && isKnownTenant(args[0])) {\n // First arg is tenant, rest is app name\n // Assume organisation = tenant when specified via command line\n return {\n organisation: args[0],\n tenant: args[0],\n appName: args.slice(1).join(' ')\n };\n }\n\n // Use checked-out tenant, all args are app name\n const checkout = getCurrentCheckout();\n if (checkout) {\n if (checkout.organisation === checkout.tenant) {\n logger.dim(`Using checked-out tenant: ${checkout.tenant}`);\n } else {\n logger.dim(`Using checked-out tenant: ${checkout.tenant} (org: ${checkout.organisation})`);\n }\n return {\n organisation: checkout.organisation,\n tenant: checkout.tenant,\n appName: args.join(' ')\n };\n }\n\n // No checked-out tenant and first arg isn't a known tenant\n // Assume first arg is tenant (will fail later if invalid)\n if (args.length >= 2) {\n return {\n organisation: args[0],\n tenant: args[0],\n appName: args.slice(1).join(' ')\n };\n }\n\n // Only one arg and no checkout - could be tenant or app name\n logger.error('No tenant specified.');\n logger.dim('Either specify a tenant: farseer app show <tenant> <app-name>');\n logger.dim('Or checkout a tenant: farseer checkout <tenant>');\n process.exit(1);\n}\n\n// Credential injection/stripping for local development\n// Matches: const farseerClient = new farseer.FarseerClient();\n// and: const fClient = new farseer.FarseerClient();\n\ninterface CredentialConfig {\n basePath: string;\n tenantId: string;\n apiKey: string;\n}\n\n// Pattern to match empty FarseerClient() constructor\nconst EMPTY_CLIENT_PATTERNS = [\n /const farseerClient = new farseer\\.FarseerClient\\(\\s*\\);/g,\n /const fClient = new farseer\\.FarseerClient\\(\\s*\\);/g,\n];\n\n// Pattern to match FarseerClient with injected credentials (multiline)\nconst INJECTED_CLIENT_PATTERN = /const (farseerClient|fClient) = new farseer\\.FarseerClient\\(\\{[\\s\\S]*?basePath:[\\s\\S]*?headers:[\\s\\S]*?'X-TENANT-ID':[\\s\\S]*?'X-API-KEY':[\\s\\S]*?\\}\\);/g;\n\nexport function injectCredentials(code: string, credential: CredentialConfig): string {\n const clientConfig = `{\n basePath: '${credential.basePath}',\n headers: {\n 'X-TENANT-ID': '${credential.tenantId}',\n 'X-API-KEY': '${credential.apiKey}',\n }\n }`;\n\n let modified = code;\n\n // Pattern 1: const farseerClient = new farseer.FarseerClient();\n modified = modified.replace(\n /const farseerClient = new farseer\\.FarseerClient\\(\\s*\\);/g,\n `const farseerClient = new farseer.FarseerClient(${clientConfig});`\n );\n\n // Pattern 2: const fClient = new farseer.FarseerClient();\n modified = modified.replace(\n /const fClient = new farseer\\.FarseerClient\\(\\s*\\);/g,\n `const fClient = new farseer.FarseerClient(${clientConfig});`\n );\n\n return modified;\n}\n\nexport function stripCredentials(code: string): string {\n // Replace injected credentials back to empty constructor\n let modified = code;\n\n // Match farseerClient with credentials\n modified = modified.replace(\n /const farseerClient = new farseer\\.FarseerClient\\(\\{[\\s\\S]*?basePath:[\\s\\S]*?headers:[\\s\\S]*?'X-TENANT-ID':[\\s\\S]*?'X-API-KEY':[\\s\\S]*?\\}\\);/g,\n 'const farseerClient = new farseer.FarseerClient();'\n );\n\n // Match fClient with credentials\n modified = modified.replace(\n /const fClient = new farseer\\.FarseerClient\\(\\{[\\s\\S]*?basePath:[\\s\\S]*?headers:[\\s\\S]*?'X-TENANT-ID':[\\s\\S]*?'X-API-KEY':[\\s\\S]*?\\}\\);/g,\n 'const fClient = new farseer.FarseerClient();'\n );\n\n return modified;\n}\n\nexport function hasInjectedCredentials(code: string): boolean {\n return INJECTED_CLIENT_PATTERN.test(code);\n}\n\nexport function hasEmptyFarseerClient(code: string): boolean {\n return EMPTY_CLIENT_PATTERNS.some(pattern => pattern.test(code));\n}\n\n// Process all script files in a directory\nexport function injectCredentialsInDir(srcDir: string, credential: CredentialConfig): number {\n let count = 0;\n const files = getAllFiles(srcDir);\n\n for (const file of files) {\n const filePath = path.join(srcDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n const modified = injectCredentials(content, credential);\n\n if (modified !== content) {\n fs.writeFileSync(filePath, modified);\n count++;\n }\n }\n\n return count;\n}\n\nexport function stripCredentialsInDir(srcDir: string): number {\n let count = 0;\n const files = getAllFiles(srcDir);\n\n for (const file of files) {\n const filePath = path.join(srcDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n const modified = stripCredentials(content);\n\n if (modified !== content) {\n fs.writeFileSync(filePath, modified);\n count++;\n }\n }\n\n return count;\n}\n\n// Audit log helpers\nexport interface AuditLogEntry {\n operation: 'pulled' | 'pushed' | 'deleted';\n filePath: string;\n uploadTime?: string;\n uploaderEmail?: string;\n uploaderName?: string;\n}\n\nexport function appendToAuditLog(tenant: string, entries: AuditLogEntry[]): void {\n if (entries.length === 0) {\n return;\n }\n\n const logPath = getAuditLogPath(tenant);\n const timestamp = new Date().toISOString();\n\n let logContent = '';\n for (const entry of entries) {\n const uploaderInfo = entry.uploaderName\n ? `${entry.uploaderName} (${entry.uploaderEmail})`\n : entry.uploaderEmail || 'Unknown';\n\n const uploadedAt = entry.uploadTime\n ? new Date(entry.uploadTime).toLocaleString()\n : 'Unknown';\n\n logContent += `${timestamp} | ${entry.operation} | ${entry.filePath} | Modified by: ${uploaderInfo} | Uploaded: ${uploadedAt}\\n`;\n }\n\n fs.appendFileSync(logPath, logContent, 'utf-8');\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
info: (message: string) => void;
|
|
3
|
+
success: (message: string) => void;
|
|
4
|
+
warning: (message: string) => void;
|
|
5
|
+
error: (message: string) => void;
|
|
6
|
+
log: (message: string) => void;
|
|
7
|
+
dim: (message: string) => void;
|
|
8
|
+
header: (message: string) => void;
|
|
9
|
+
list: (items: string[], indent?: number) => void;
|
|
10
|
+
table: (rows: {
|
|
11
|
+
label: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}[]) => void;
|
|
14
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var logger_exports = {};
|
|
29
|
+
__export(logger_exports, {
|
|
30
|
+
logger: () => logger
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(logger_exports);
|
|
33
|
+
var import_chalk = __toESM(require("chalk"));
|
|
34
|
+
const logger = {
|
|
35
|
+
info: (message) => {
|
|
36
|
+
console.log(import_chalk.default.blue("\u2139"), message);
|
|
37
|
+
},
|
|
38
|
+
success: (message) => {
|
|
39
|
+
console.log(import_chalk.default.green("\u2713"), message);
|
|
40
|
+
},
|
|
41
|
+
warning: (message) => {
|
|
42
|
+
console.log(import_chalk.default.yellow("\u26A0"), message);
|
|
43
|
+
},
|
|
44
|
+
error: (message) => {
|
|
45
|
+
console.log(import_chalk.default.red("\u2717"), message);
|
|
46
|
+
},
|
|
47
|
+
log: (message) => {
|
|
48
|
+
console.log(message);
|
|
49
|
+
},
|
|
50
|
+
dim: (message) => {
|
|
51
|
+
console.log(import_chalk.default.dim(message));
|
|
52
|
+
},
|
|
53
|
+
header: (message) => {
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(import_chalk.default.bold.underline(message));
|
|
56
|
+
console.log();
|
|
57
|
+
},
|
|
58
|
+
list: (items, indent = 2) => {
|
|
59
|
+
const prefix = " ".repeat(indent);
|
|
60
|
+
items.forEach((item) => {
|
|
61
|
+
console.log(`${prefix}${item}`);
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
table: (rows) => {
|
|
65
|
+
const maxLabelLength = Math.max(...rows.map((r) => r.label.length));
|
|
66
|
+
rows.forEach((row) => {
|
|
67
|
+
const paddedLabel = row.label.padEnd(maxLabelLength);
|
|
68
|
+
console.log(` ${import_chalk.default.dim(paddedLabel)} ${row.value}`);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
logger
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/logger.ts"],
|
|
4
|
+
"sourcesContent": ["import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string) => {\n console.log(chalk.blue('\u2139'), message);\n },\n\n success: (message: string) => {\n console.log(chalk.green('\u2713'), message);\n },\n\n warning: (message: string) => {\n console.log(chalk.yellow('\u26A0'), message);\n },\n\n error: (message: string) => {\n console.log(chalk.red('\u2717'), message);\n },\n\n log: (message: string) => {\n console.log(message);\n },\n\n dim: (message: string) => {\n console.log(chalk.dim(message));\n },\n\n header: (message: string) => {\n console.log();\n console.log(chalk.bold.underline(message));\n console.log();\n },\n\n list: (items: string[], indent: number = 2) => {\n const prefix = ' '.repeat(indent);\n items.forEach(item => {\n console.log(`${prefix}${item}`);\n });\n },\n\n table: (rows: { label: string; value: string }[]) => {\n const maxLabelLength = Math.max(...rows.map(r => r.label.length));\n rows.forEach(row => {\n const paddedLabel = row.label.padEnd(maxLabelLength);\n console.log(` ${chalk.dim(paddedLabel)} ${row.value}`);\n });\n }\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAEX,MAAM,SAAS;AAAA,EAClB,MAAM,CAAC,YAAoB;AACvB,YAAQ,IAAI,aAAAA,QAAM,KAAK,QAAG,GAAG,OAAO;AAAA,EACxC;AAAA,EAEA,SAAS,CAAC,YAAoB;AAC1B,YAAQ,IAAI,aAAAA,QAAM,MAAM,QAAG,GAAG,OAAO;AAAA,EACzC;AAAA,EAEA,SAAS,CAAC,YAAoB;AAC1B,YAAQ,IAAI,aAAAA,QAAM,OAAO,QAAG,GAAG,OAAO;AAAA,EAC1C;AAAA,EAEA,OAAO,CAAC,YAAoB;AACxB,YAAQ,IAAI,aAAAA,QAAM,IAAI,QAAG,GAAG,OAAO;AAAA,EACvC;AAAA,EAEA,KAAK,CAAC,YAAoB;AACtB,YAAQ,IAAI,OAAO;AAAA,EACvB;AAAA,EAEA,KAAK,CAAC,YAAoB;AACtB,YAAQ,IAAI,aAAAA,QAAM,IAAI,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,QAAQ,CAAC,YAAoB;AACzB,YAAQ,IAAI;AACZ,YAAQ,IAAI,aAAAA,QAAM,KAAK,UAAU,OAAO,CAAC;AACzC,YAAQ,IAAI;AAAA,EAChB;AAAA,EAEA,MAAM,CAAC,OAAiB,SAAiB,MAAM;AAC3C,UAAM,SAAS,IAAI,OAAO,MAAM;AAChC,UAAM,QAAQ,UAAQ;AAClB,cAAQ,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE;AAAA,IAClC,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,CAAC,SAA6C;AACjD,UAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,OAAK,EAAE,MAAM,MAAM,CAAC;AAChE,SAAK,QAAQ,SAAO;AAChB,YAAM,cAAc,IAAI,MAAM,OAAO,cAAc;AACnD,cAAQ,IAAI,KAAK,aAAAA,QAAM,IAAI,WAAW,CAAC,KAAK,IAAI,KAAK,EAAE;AAAA,IAC3D,CAAC;AAAA,EACL;AACJ;",
|
|
6
|
+
"names": ["chalk"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "farseer-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for syncing Farseer App scripts between local repository and Farseer instances",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"farseer": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "node build.js",
|
|
16
|
+
"typecheck": "tsc --noEmit",
|
|
17
|
+
"build:tsc": "tsc",
|
|
18
|
+
"dev": "ts-node src/index.ts",
|
|
19
|
+
"start": "node dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"farseer",
|
|
23
|
+
"cli",
|
|
24
|
+
"sync",
|
|
25
|
+
"scripts",
|
|
26
|
+
"mcp",
|
|
27
|
+
"model-context-protocol"
|
|
28
|
+
],
|
|
29
|
+
"author": "Farseer",
|
|
30
|
+
"license": "ISC",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/farseerdev/farseer.git",
|
|
34
|
+
"directory": "cli"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/farseerdev/farseer/tree/dev/cli#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/farseerdev/farseer/issues"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
45
|
+
"chalk": "^4.1.2",
|
|
46
|
+
"commander": "^11.1.0",
|
|
47
|
+
"diff": "^5.1.0",
|
|
48
|
+
"farseer-client": "https://storage.googleapis.com/farseer-remote-jobs-results/farseer-client/release-1.4.5.tar",
|
|
49
|
+
"inquirer": "^8.2.6",
|
|
50
|
+
"simple-git": "^3.21.0",
|
|
51
|
+
"tsx": "^4.21.0",
|
|
52
|
+
"zod": "^3.25.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/diff": "^5.0.8",
|
|
56
|
+
"@types/inquirer": "^9.0.7",
|
|
57
|
+
"@types/node": "^20.10.0",
|
|
58
|
+
"esbuild": "^0.27.2",
|
|
59
|
+
"ts-node": "^10.9.2",
|
|
60
|
+
"typescript": "^5.3.2"
|
|
61
|
+
}
|
|
62
|
+
}
|