@jvittechs/j 1.0.67 → 1.0.68
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/dist/{chunk-XZ7VS36G.js → chunk-NOCP6JJX.js} +1 -1
- package/dist/chunk-NOCP6JJX.js.map +1 -0
- package/dist/cli.js +11 -3
- package/dist/cli.js.map +1 -1
- package/dist/components.service-LNJNZYH7.js +7 -0
- package/package.json +1 -1
- package/dist/chunk-XZ7VS36G.js.map +0 -1
- package/dist/components.service-NWAWKII3.js +0 -7
- /package/dist/{components.service-NWAWKII3.js.map → components.service-LNJNZYH7.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/components.service.ts","../src/errors/index.ts"],"sourcesContent":["import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip' | 'rule-preset'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n defaultTarget?: string[];\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Rule preset bundle structure\n */\ninterface RulePresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * Expand component paths with special prefixes\n *\n * Supported formats:\n * - Standard paths: \"rule-presets/react-spa-zustand\", \"rules/jai1.md\", \"workflows/commit-it.md\"\n * - Package prefix: \"package:core\" -> expands to all components in that package\n *\n * @param config - Jai1 config\n * @param paths - Array of component paths (may include special prefixes)\n * @returns Array of expanded component paths\n */\n async expandPaths(config: Jai1Config, paths: string[]): Promise<string[]> {\n const expandedPaths: string[] = [];\n\n for (const path of paths) {\n if (path.startsWith('package:')) {\n // Package prefix: fetch all components and filter by package\n const packageName = path.substring('package:'.length);\n const components = await this.list(config);\n\n // Currently only 'core' package is supported\n // All components in the API are from the core package\n if (packageName === 'core') {\n expandedPaths.push(...components.map(c => c.filepath));\n } else {\n console.warn(`Warning: Unknown package '${packageName}', skipping`);\n }\n } else {\n // Standard path: use as-is\n expandedPaths.push(path);\n }\n }\n\n return expandedPaths;\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n let checksumContent = component.content; // Default for simple types\n\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else if (component.contentType === 'rule-preset') {\n // Rule preset: gzipped base64 bundle with preset metadata and .mdc files\n // Single preset per project: always save to .jai1/rule-preset/ (singular)\n const compressed = Buffer.from(component.content, 'base64');\n const bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n\n const bundle = JSON.parse(bundleJson) as RulePresetBundle;\n\n // Single preset directory: .jai1/rule-preset/ (replaces old preset)\n const presetDir = join(targetDir, 'rule-preset');\n\n // Remove old preset if exists\n try {\n await fs.rm(presetDir, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, that's fine\n }\n\n await fs.mkdir(presetDir, { recursive: true });\n\n // Write preset.json\n await fs.writeFile(\n join(presetDir, 'preset.json'),\n JSON.stringify(bundle.preset, null, 2)\n );\n\n // Write all .mdc files\n for (const [filename, content] of Object.entries(bundle.files)) {\n const filePath = join(presetDir, filename);\n await fs.mkdir(join(filePath, '..'), { recursive: true });\n await fs.writeFile(filePath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file - create parent directory\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n await fs.mkdir(targetFolder, { recursive: true });\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
NetworkError,
|
|
6
6
|
NotFoundError,
|
|
7
7
|
ValidationError
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NOCP6JJX.js";
|
|
9
9
|
import {
|
|
10
10
|
createSettingsShowCommand
|
|
11
11
|
} from "./chunk-5RDBJYO2.js";
|
|
@@ -160,7 +160,7 @@ import { basename as basename5 } from "path";
|
|
|
160
160
|
// package.json
|
|
161
161
|
var package_default = {
|
|
162
162
|
name: "@jvittechs/j",
|
|
163
|
-
version: "1.0.
|
|
163
|
+
version: "1.0.68",
|
|
164
164
|
description: "A unified CLI tool for JV-IT TECHS developers to manage Jai1 Framework. Supports both `j` and `jai1` commands. Please contact TeamAI for usage instructions.",
|
|
165
165
|
type: "module",
|
|
166
166
|
bin: {
|
|
@@ -1774,6 +1774,14 @@ async function nonInteractiveApply(config, items, options) {
|
|
|
1774
1774
|
console.log(`\u{1F4E6} Applying package '${items[0]}'...`);
|
|
1775
1775
|
const components = await componentsService.list(config, { tag: items[0] });
|
|
1776
1776
|
filepaths = components.map((c) => c.filepath);
|
|
1777
|
+
const matchedTag = tags.find((t) => t.tag === items[0]);
|
|
1778
|
+
if (matchedTag?.defaultTarget?.length) {
|
|
1779
|
+
if (options.target) {
|
|
1780
|
+
console.log(`\u26A0\uFE0F Package '${items[0]}' has fixed target: ${matchedTag.defaultTarget.join(", ")}. Ignoring --target.`);
|
|
1781
|
+
}
|
|
1782
|
+
options.target = matchedTag.defaultTarget;
|
|
1783
|
+
console.log(`\u{1F3AF} Target: ${options.target.join(", ")}`);
|
|
1784
|
+
}
|
|
1777
1785
|
} else {
|
|
1778
1786
|
filepaths = items;
|
|
1779
1787
|
}
|
|
@@ -15021,7 +15029,7 @@ function createSkillsInfoCommand() {
|
|
|
15021
15029
|
process.exit(1);
|
|
15022
15030
|
}
|
|
15023
15031
|
const filepath = name.startsWith("skills/") ? name : `skills/${name}`;
|
|
15024
|
-
const { ComponentsService: ComponentsService2 } = await import("./components.service-
|
|
15032
|
+
const { ComponentsService: ComponentsService2 } = await import("./components.service-LNJNZYH7.js");
|
|
15025
15033
|
const componentsService = new ComponentsService2();
|
|
15026
15034
|
try {
|
|
15027
15035
|
const component = await componentsService.get(config, filepath);
|