@raven.js/cli 1.2.2 → 1.2.4

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/raven CHANGED
@@ -217,7 +217,7 @@ async function cmdInit(options) {
217
217
  const doInit = async () => {
218
218
  if (!ravenRootExists || !ravenYamlExists) {
219
219
  await ensureDir(ravenDir);
220
- await createRavenYaml(ravenDir, version);
220
+ await createRavenYaml(ravenDir, version, options?.language);
221
221
  modifiedFiles.push(ravenYamlPath);
222
222
  }
223
223
  };
@@ -243,8 +243,12 @@ async function cmdInit(options) {
243
243
  const status = await getStatus(registry, options);
244
244
  console.log(JSON.stringify(status));
245
245
  }
246
- async function createRavenYaml(destDir, version) {
247
- const content = stringify({ version });
246
+ async function createRavenYaml(destDir, version, language) {
247
+ const data = { version };
248
+ if (language !== undefined) {
249
+ data.language = language;
250
+ }
251
+ const content = stringify(data);
248
252
  await writeFile(join(destDir, "raven.yaml"), content);
249
253
  }
250
254
  async function getInstalledModules(ravenDir, registry) {
@@ -305,6 +309,7 @@ async function getStatus(registry, options) {
305
309
  const fileHashes = {};
306
310
  const knownModules = getModuleNames(registry).sort();
307
311
  const moduleStatus = [];
312
+ let language;
308
313
  if (await pathExists(ravenDir)) {
309
314
  const yamlPath = join(ravenDir, "raven.yaml");
310
315
  try {
@@ -313,6 +318,9 @@ async function getStatus(registry, options) {
313
318
  if (config?.version) {
314
319
  currentVersion = config.version;
315
320
  }
321
+ if (config?.language !== undefined) {
322
+ language = config.language;
323
+ }
316
324
  } catch (_e) {
317
325
  }
318
326
  for (const name of knownModules) {
@@ -356,6 +364,7 @@ async function getStatus(registry, options) {
356
364
  return {
357
365
  modules: moduleStatus,
358
366
  version: currentVersion,
367
+ language: language ?? "English (default)",
359
368
  modifiedFiles,
360
369
  fileHashes
361
370
  };
@@ -368,10 +377,13 @@ async function cmdStatus(options) {
368
377
  var program = new Command("raven");
369
378
  program.version(loadCliVersion());
370
379
  program.option("--registry <path>", "Registry json path (default: same dir as CLI)").option("--root <dir>", "RavenJS root directory (default: raven)").option("-v, --verbose", "Verbose output");
371
- program.command("init").description("Initialize raven root (directory and raven.yaml). Install AI skills with install-raven.").action(() => cmdInit(program.opts()));
380
+ program.command("init").description("Initialize raven root (directory and raven.yaml). Install AI skills with install-raven.").option("--language <lang>", "Language (stored in raven.yaml)").action(function() {
381
+ const opts = this.opts();
382
+ cmdInit({ ...program.opts(), language: opts.language });
383
+ });
372
384
  program.command("add <module>").description("Add a module (e.g., core)").action((module) => cmdAdd(module, program.opts()));
373
385
  program.command("status").description("Show RavenJS installation status (core, modules)").action(() => cmdStatus(program.opts()));
374
386
  program.parse();
375
387
 
376
- //# debugId=18CE5936F1B83A4764756E2164756E21
388
+ //# debugId=42611CBFE26601C764756E2164756E21
377
389
  //# sourceMappingURL=raven.map
package/dist/raven.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../index.ts"],
4
4
  "sourcesContent": [
5
- "#!/usr/bin/env bun\n\nimport { Command } from \"commander\";\nimport { mkdir, readdir, stat, readFile, writeFile, access } from \"fs/promises\";\nimport { join, dirname, resolve, isAbsolute } from \"path\";\nimport { cwd } from \"process\";\nimport { createHash } from \"crypto\";\nimport { fileURLToPath } from \"url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nimport pc from \"picocolors\";\nimport { spinner as makeSpinner, log } from \"@clack/prompts\";\nimport { parse, stringify } from \"yaml\";\n\nfunction loadCliVersion(): string {\n return process.env.RAVEN_CLI_VERSION ?? \"0.0.0\";\n}\n\nconst DEFAULT_ROOT = \"raven\";\n\ninterface CLIOptions {\n verbose?: boolean;\n root?: string;\n prerelease?: boolean;\n registry?: string;\n}\n\ninterface RegistryModule {\n files: string[];\n fileMapping?: Record<string, string>;\n dependencies?: Record<string, string>;\n dependsOn?: string[];\n description?: string;\n}\n\ninterface Registry {\n version: string;\n modules: Record<string, RegistryModule>;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function loadRegistry(options?: {\n registry?: string;\n}): Promise<Registry> {\n const candidates: string[] = [];\n if (options?.registry) {\n candidates.push(\n isAbsolute(options.registry)\n ? options.registry\n : resolve(cwd(), options.registry),\n );\n }\n if (process.env.RAVEN_DEFAULT_REGISTRY_PATH) {\n const p = process.env.RAVEN_DEFAULT_REGISTRY_PATH;\n candidates.push(isAbsolute(p) ? p : resolve(cwd(), p));\n }\n candidates.push(join(__dirname, \"registry.json\"));\n\n for (const p of candidates) {\n if (await fileExists(p)) {\n const content = await readFile(p, \"utf-8\");\n return JSON.parse(content) as Registry;\n }\n }\n console.error(\n \"registry.json not found. Run 'bun run build' in packages/cli first.\",\n );\n process.exit(1);\n}\n\nfunction getRoot(options: CLIOptions): string {\n return options.root || process.env.RAVEN_ROOT || DEFAULT_ROOT;\n}\n\nasync function verboseLog(message: string, options?: CLIOptions) {\n if (options?.verbose) {\n console.log(message);\n }\n}\n\nfunction error(message: string): never {\n // Use stderr for programmatic consumption (e.g. tests, piping). @clack/prompts\n // log.error writes to stdout which breaks stderr-based assertions.\n console.error(message);\n process.exit(1);\n}\n\nfunction success(message: string) {\n log.success(message);\n}\n\nfunction printSectionHeader(title: string) {\n log.step(title);\n}\n\nfunction printListItem(item: string) {\n log.message(item, { symbol: pc.dim(\"-\") });\n}\n\nasync function ensureDir(path: string) {\n try {\n await mkdir(path, { recursive: true });\n } catch (e: any) {\n if (e.code !== \"EEXIST\") throw e;\n }\n}\n\nasync function isDirEmpty(path: string): Promise<boolean> {\n try {\n const entries = await readdir(path);\n return entries.length === 0;\n } catch (e: any) {\n if (e.code === \"ENOENT\") return true;\n throw e;\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (e: any) {\n if (e.code === \"ENOENT\") return false;\n throw e;\n }\n}\n\nasync function ensureRavenInstalled(\n options: CLIOptions,\n): Promise<{ ravenDir: string; version: string }> {\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n if (!(await pathExists(ravenDir))) {\n error(`RavenJS not installed at ${root}/. Run 'raven init' first.`);\n }\n\n const yamlPath = join(ravenDir, \"raven.yaml\");\n try {\n const content = await readFile(yamlPath, \"utf-8\");\n const config = parse(content) as RavenYamlConfig;\n if (!config?.version) {\n error(\"Invalid raven.yaml: version field is missing\");\n }\n return { ravenDir, version: config.version };\n } catch (e: any) {\n error(`Failed to load raven.yaml: ${e.message}`);\n }\n}\n\nfunction getModuleNames(registry: Registry): string[] {\n return Object.keys(registry.modules);\n}\n\nfunction getInstallOrder(\n moduleName: string,\n registry: Registry,\n installed: Set<string>,\n): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const path: string[] = [];\n let cycle: string[] | null = null;\n\n function visit(name: string) {\n if (recStack.has(name)) {\n const idx = path.indexOf(name);\n cycle = path.slice(idx).concat(name);\n return;\n }\n if (visited.has(name)) return;\n visited.add(name);\n recStack.add(name);\n path.push(name);\n\n const mod = registry.modules[name];\n if (mod?.dependsOn) {\n for (const dep of mod.dependsOn) {\n if (registry.modules[dep]) visit(dep);\n }\n }\n if (!installed.has(name)) {\n result.push(name);\n }\n path.pop();\n recStack.delete(name);\n }\n\n visit(moduleName);\n if (cycle !== null) {\n error(`Circular dependency: ${(cycle as string[]).join(\" -> \")}`);\n }\n return result;\n}\n\nconst RAVENJS_PREFIX = \"@raven.js/\";\n\nfunction replaceRavenImports(\n content: string,\n fromModuleDir: string,\n registry: Registry,\n): string {\n const moduleNames = Object.keys(registry.modules);\n let out = content;\n const depth = fromModuleDir.split(\"/\").filter(Boolean).length;\n const prefix = depth > 0 ? \"../\".repeat(depth) : \"./\";\n for (const modName of moduleNames) {\n const pkg = `${RAVENJS_PREFIX}${modName}`;\n const rel = prefix + modName;\n\n const dq = new RegExp(\n `from\\\\s+\"${pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\"`,\n \"g\",\n );\n const sq = new RegExp(\n `from\\\\s+'${pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}'`,\n \"g\",\n );\n out = out.replace(dq, `from \"${rel}\"`).replace(sq, `from '${rel}'`);\n }\n return out;\n}\n\nconst SOURCE_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n\nfunction isSourceFile(file: string): boolean {\n return SOURCE_EXTENSIONS.some((ext) => file.endsWith(ext));\n}\n\nasync function installModule(\n registry: Registry,\n moduleName: string,\n destDir: string,\n options?: CLIOptions,\n targetSubdir?: string,\n): Promise<string[]> {\n const module = registry.modules[moduleName];\n if (!module) {\n throw new Error(`Module ${moduleName} not found in registry`);\n }\n\n verboseLog(`Installing ${moduleName} files...`, options);\n\n const embeddedSourceDir = join(__dirname, \"source\");\n const fromModuleDir = targetSubdir ?? moduleName;\n\n const modifiedFiles: string[] = [];\n const copies = module.files.map(async (file: string) => {\n let destPath: string;\n\n if (module.fileMapping?.[file]) {\n destPath = join(destDir, module.fileMapping[file]);\n } else if (targetSubdir) {\n destPath = join(destDir, targetSubdir, file);\n } else {\n destPath = join(destDir, moduleName, file);\n }\n\n verboseLog(` Copying ${file}...`, options);\n\n const srcPath = join(embeddedSourceDir, moduleName, file);\n if (!(await fileExists(srcPath))) {\n throw new Error(`Missing embedded source file: ${srcPath}`);\n }\n\n let content = await readFile(srcPath, \"utf-8\");\n\n if (isSourceFile(file)) {\n content = replaceRavenImports(content, fromModuleDir, registry);\n }\n\n await ensureDir(dirname(destPath));\n await writeFile(destPath, content);\n modifiedFiles.push(destPath);\n });\n\n await Promise.all(copies);\n return modifiedFiles;\n}\n\nasync function cmdInit(options: CLIOptions) {\n const registry = await loadRegistry(options);\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n verboseLog(`Initializing RavenJS in ${targetDir}`, options);\n\n const version = registry.version;\n const modifiedFiles: string[] = [];\n\n const ravenRootExists = await pathExists(ravenDir);\n const ravenYamlPath = join(ravenDir, \"raven.yaml\");\n const ravenYamlExists = await pathExists(ravenYamlPath);\n\n const doInit = async () => {\n if (!ravenRootExists || !ravenYamlExists) {\n await ensureDir(ravenDir);\n await createRavenYaml(ravenDir, version);\n modifiedFiles.push(ravenYamlPath);\n }\n };\n\n if (options?.verbose) {\n await doInit();\n } else {\n const s = makeSpinner();\n s.start(\"Initializing raven root...\");\n try {\n await doInit();\n } catch (e: any) {\n s.stop(\"Initialization failed\");\n error(e.message);\n }\n s.stop(\"Initializing raven root...\");\n }\n\n success(\"RavenJS raven root initialized. Install AI skills with: install-raven (or npx install-raven).\");\n\n printSectionHeader(\"Modified Files\");\n for (const file of modifiedFiles) {\n printListItem(file);\n }\n\n printSectionHeader(\"Status\");\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n}\n\ninterface RavenYamlConfig {\n version: string;\n}\n\nasync function createRavenYaml(destDir: string, version: string) {\n const content = stringify({ version });\n await writeFile(join(destDir, \"raven.yaml\"), content);\n}\n\nasync function getInstalledModules(\n ravenDir: string,\n registry: Registry,\n): Promise<Set<string>> {\n const installed = new Set<string>();\n for (const name of getModuleNames(registry)) {\n const modDir = join(ravenDir, name);\n if ((await pathExists(modDir)) && !(await isDirEmpty(modDir))) {\n installed.add(name);\n }\n }\n return installed;\n}\n\nasync function cmdAdd(moduleName: string, options: CLIOptions) {\n const registry = await loadRegistry(options);\n if (!moduleName) {\n error(\n `Please specify a module to add. Available: ${getModuleNames(registry).join(\", \")}`,\n );\n }\n\n const available = getModuleNames(registry);\n\n if (!available.includes(moduleName)) {\n error(`Unknown module: ${moduleName}`);\n }\n\n const { ravenDir } = await ensureRavenInstalled(options);\n\n const installed = await getInstalledModules(ravenDir, registry);\n const order = getInstallOrder(moduleName, registry, installed);\n\n try {\n const modifiedFiles: string[] = [];\n const allDependencies: Record<string, string> = {};\n for (const name of order) {\n const files = await installModule(\n registry,\n name,\n ravenDir,\n options,\n );\n modifiedFiles.push(...files);\n const mod = registry.modules[name];\n if (mod?.dependencies) {\n Object.assign(allDependencies, mod.dependencies);\n }\n }\n\n // Two JSON lines for Agent: add result + status in one call to save tokens.\n console.log(\n JSON.stringify({\n success: true,\n moduleName,\n modifiedFiles,\n dependencies: allDependencies,\n }),\n );\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n } catch (e: any) {\n error(e.message);\n }\n}\n\n// === SECTION: Status ===\n\ninterface ModuleInfo {\n name: string;\n description?: string;\n installed: boolean;\n /** 模块目录的绝对路径 */\n installDir?: string;\n}\n\ninterface StatusResult {\n modules: ModuleInfo[];\n version?: string;\n modifiedFiles?: string[];\n fileHashes?: Record<string, string>;\n}\n\nasync function computeFileHash(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nasync function getStatus(\n registry: Registry,\n options: CLIOptions,\n): Promise<StatusResult> {\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n let currentVersion: string | undefined;\n const modifiedFiles: string[] = [];\n const fileHashes: Record<string, string> = {};\n\n const knownModules = getModuleNames(registry).sort();\n const moduleStatus: ModuleInfo[] = [];\n\n if (await pathExists(ravenDir)) {\n const yamlPath = join(ravenDir, \"raven.yaml\");\n try {\n const content = await readFile(yamlPath, \"utf-8\");\n const config = parse(content) as RavenYamlConfig;\n if (config?.version) {\n currentVersion = config.version;\n }\n } catch (_e) {\n // raven.yaml missing or invalid\n }\n\n for (const name of knownModules) {\n const modDir = join(ravenDir, name);\n const installed =\n (await pathExists(modDir)) && !(await isDirEmpty(modDir));\n const mod = registry.modules[name];\n moduleStatus.push({\n name,\n description: mod?.description,\n installed,\n installDir: resolve(modDir),\n });\n }\n\n // Compute file hashes for all files in raven/\n async function traverseDir(dir: string, baseDir: string) {\n const dirEntries = await readdir(dir, { withFileTypes: true });\n for (const e of dirEntries) {\n const fullPath = join(dir, e.name);\n const relPath = fullPath.slice(baseDir.length + 1);\n if (e.isDirectory()) {\n await traverseDir(fullPath, baseDir);\n } else {\n const hash = await computeFileHash(fullPath);\n fileHashes[relPath] = hash;\n }\n }\n }\n await traverseDir(ravenDir, ravenDir);\n }\n\n if (moduleStatus.length === 0) {\n for (const name of knownModules) {\n const mod = registry.modules[name];\n const modDir = join(ravenDir, name);\n moduleStatus.push({\n name,\n description: mod?.description,\n installed: false,\n installDir: resolve(modDir),\n });\n }\n }\n\n return {\n modules: moduleStatus,\n version: currentVersion,\n modifiedFiles,\n fileHashes,\n };\n}\n\ninterface StatusCLIOptions extends CLIOptions {}\n\nasync function cmdStatus(options: StatusCLIOptions) {\n const registry = await loadRegistry(options);\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n}\n\nconst program = new Command(\"raven\");\nprogram.version(loadCliVersion());\n\nprogram\n .option(\"--registry <path>\", \"Registry json path (default: same dir as CLI)\")\n .option(\"--root <dir>\", \"RavenJS root directory (default: raven)\")\n .option(\"-v, --verbose\", \"Verbose output\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize raven root (directory and raven.yaml). Install AI skills with install-raven.\")\n .action(() => cmdInit(program.opts() as CLIOptions));\n\nprogram\n .command(\"add <module>\")\n .description(\"Add a module (e.g., core)\")\n .action((module: string) => cmdAdd(module, program.opts() as CLIOptions));\n\nprogram\n .command(\"status\")\n .description(\"Show RavenJS installation status (core, modules)\")\n .action(() => cmdStatus(program.opts() as StatusCLIOptions));\n\nprogram.parse();\n"
5
+ "#!/usr/bin/env bun\n\nimport { Command } from \"commander\";\nimport { mkdir, readdir, stat, readFile, writeFile, access } from \"fs/promises\";\nimport { join, dirname, resolve, isAbsolute } from \"path\";\nimport { cwd } from \"process\";\nimport { createHash } from \"crypto\";\nimport { fileURLToPath } from \"url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nimport pc from \"picocolors\";\nimport { spinner as makeSpinner, log } from \"@clack/prompts\";\nimport { parse, stringify } from \"yaml\";\n\nfunction loadCliVersion(): string {\n return process.env.RAVEN_CLI_VERSION ?? \"0.0.0\";\n}\n\nconst DEFAULT_ROOT = \"raven\";\n\ninterface CLIOptions {\n verbose?: boolean;\n root?: string;\n prerelease?: boolean;\n registry?: string;\n language?: string;\n}\n\ninterface RegistryModule {\n files: string[];\n fileMapping?: Record<string, string>;\n dependencies?: Record<string, string>;\n dependsOn?: string[];\n description?: string;\n}\n\ninterface Registry {\n version: string;\n modules: Record<string, RegistryModule>;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function loadRegistry(options?: {\n registry?: string;\n}): Promise<Registry> {\n const candidates: string[] = [];\n if (options?.registry) {\n candidates.push(\n isAbsolute(options.registry)\n ? options.registry\n : resolve(cwd(), options.registry),\n );\n }\n if (process.env.RAVEN_DEFAULT_REGISTRY_PATH) {\n const p = process.env.RAVEN_DEFAULT_REGISTRY_PATH;\n candidates.push(isAbsolute(p) ? p : resolve(cwd(), p));\n }\n candidates.push(join(__dirname, \"registry.json\"));\n\n for (const p of candidates) {\n if (await fileExists(p)) {\n const content = await readFile(p, \"utf-8\");\n return JSON.parse(content) as Registry;\n }\n }\n console.error(\n \"registry.json not found. Run 'bun run build' in packages/cli first.\",\n );\n process.exit(1);\n}\n\nfunction getRoot(options: CLIOptions): string {\n return options.root || process.env.RAVEN_ROOT || DEFAULT_ROOT;\n}\n\nasync function verboseLog(message: string, options?: CLIOptions) {\n if (options?.verbose) {\n console.log(message);\n }\n}\n\nfunction error(message: string): never {\n // Use stderr for programmatic consumption (e.g. tests, piping). @clack/prompts\n // log.error writes to stdout which breaks stderr-based assertions.\n console.error(message);\n process.exit(1);\n}\n\nfunction success(message: string) {\n log.success(message);\n}\n\nfunction printSectionHeader(title: string) {\n log.step(title);\n}\n\nfunction printListItem(item: string) {\n log.message(item, { symbol: pc.dim(\"-\") });\n}\n\nasync function ensureDir(path: string) {\n try {\n await mkdir(path, { recursive: true });\n } catch (e: any) {\n if (e.code !== \"EEXIST\") throw e;\n }\n}\n\nasync function isDirEmpty(path: string): Promise<boolean> {\n try {\n const entries = await readdir(path);\n return entries.length === 0;\n } catch (e: any) {\n if (e.code === \"ENOENT\") return true;\n throw e;\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (e: any) {\n if (e.code === \"ENOENT\") return false;\n throw e;\n }\n}\n\nasync function ensureRavenInstalled(\n options: CLIOptions,\n): Promise<{ ravenDir: string; version: string }> {\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n if (!(await pathExists(ravenDir))) {\n error(`RavenJS not installed at ${root}/. Run 'raven init' first.`);\n }\n\n const yamlPath = join(ravenDir, \"raven.yaml\");\n try {\n const content = await readFile(yamlPath, \"utf-8\");\n const config = parse(content) as RavenYamlConfig;\n if (!config?.version) {\n error(\"Invalid raven.yaml: version field is missing\");\n }\n return { ravenDir, version: config.version };\n } catch (e: any) {\n error(`Failed to load raven.yaml: ${e.message}`);\n }\n}\n\nfunction getModuleNames(registry: Registry): string[] {\n return Object.keys(registry.modules);\n}\n\nfunction getInstallOrder(\n moduleName: string,\n registry: Registry,\n installed: Set<string>,\n): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const path: string[] = [];\n let cycle: string[] | null = null;\n\n function visit(name: string) {\n if (recStack.has(name)) {\n const idx = path.indexOf(name);\n cycle = path.slice(idx).concat(name);\n return;\n }\n if (visited.has(name)) return;\n visited.add(name);\n recStack.add(name);\n path.push(name);\n\n const mod = registry.modules[name];\n if (mod?.dependsOn) {\n for (const dep of mod.dependsOn) {\n if (registry.modules[dep]) visit(dep);\n }\n }\n if (!installed.has(name)) {\n result.push(name);\n }\n path.pop();\n recStack.delete(name);\n }\n\n visit(moduleName);\n if (cycle !== null) {\n error(`Circular dependency: ${(cycle as string[]).join(\" -> \")}`);\n }\n return result;\n}\n\nconst RAVENJS_PREFIX = \"@raven.js/\";\n\nfunction replaceRavenImports(\n content: string,\n fromModuleDir: string,\n registry: Registry,\n): string {\n const moduleNames = Object.keys(registry.modules);\n let out = content;\n const depth = fromModuleDir.split(\"/\").filter(Boolean).length;\n const prefix = depth > 0 ? \"../\".repeat(depth) : \"./\";\n for (const modName of moduleNames) {\n const pkg = `${RAVENJS_PREFIX}${modName}`;\n const rel = prefix + modName;\n\n const dq = new RegExp(\n `from\\\\s+\"${pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\"`,\n \"g\",\n );\n const sq = new RegExp(\n `from\\\\s+'${pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}'`,\n \"g\",\n );\n out = out.replace(dq, `from \"${rel}\"`).replace(sq, `from '${rel}'`);\n }\n return out;\n}\n\nconst SOURCE_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n\nfunction isSourceFile(file: string): boolean {\n return SOURCE_EXTENSIONS.some((ext) => file.endsWith(ext));\n}\n\nasync function installModule(\n registry: Registry,\n moduleName: string,\n destDir: string,\n options?: CLIOptions,\n targetSubdir?: string,\n): Promise<string[]> {\n const module = registry.modules[moduleName];\n if (!module) {\n throw new Error(`Module ${moduleName} not found in registry`);\n }\n\n verboseLog(`Installing ${moduleName} files...`, options);\n\n const embeddedSourceDir = join(__dirname, \"source\");\n const fromModuleDir = targetSubdir ?? moduleName;\n\n const modifiedFiles: string[] = [];\n const copies = module.files.map(async (file: string) => {\n let destPath: string;\n\n if (module.fileMapping?.[file]) {\n destPath = join(destDir, module.fileMapping[file]);\n } else if (targetSubdir) {\n destPath = join(destDir, targetSubdir, file);\n } else {\n destPath = join(destDir, moduleName, file);\n }\n\n verboseLog(` Copying ${file}...`, options);\n\n const srcPath = join(embeddedSourceDir, moduleName, file);\n if (!(await fileExists(srcPath))) {\n throw new Error(`Missing embedded source file: ${srcPath}`);\n }\n\n let content = await readFile(srcPath, \"utf-8\");\n\n if (isSourceFile(file)) {\n content = replaceRavenImports(content, fromModuleDir, registry);\n }\n\n await ensureDir(dirname(destPath));\n await writeFile(destPath, content);\n modifiedFiles.push(destPath);\n });\n\n await Promise.all(copies);\n return modifiedFiles;\n}\n\nasync function cmdInit(options: CLIOptions) {\n const registry = await loadRegistry(options);\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n verboseLog(`Initializing RavenJS in ${targetDir}`, options);\n\n const version = registry.version;\n const modifiedFiles: string[] = [];\n\n const ravenRootExists = await pathExists(ravenDir);\n const ravenYamlPath = join(ravenDir, \"raven.yaml\");\n const ravenYamlExists = await pathExists(ravenYamlPath);\n\n const doInit = async () => {\n if (!ravenRootExists || !ravenYamlExists) {\n await ensureDir(ravenDir);\n await createRavenYaml(ravenDir, version, options?.language);\n modifiedFiles.push(ravenYamlPath);\n }\n };\n\n if (options?.verbose) {\n await doInit();\n } else {\n const s = makeSpinner();\n s.start(\"Initializing raven root...\");\n try {\n await doInit();\n } catch (e: any) {\n s.stop(\"Initialization failed\");\n error(e.message);\n }\n s.stop(\"Initializing raven root...\");\n }\n\n success(\"RavenJS raven root initialized. Install AI skills with: install-raven (or npx install-raven).\");\n\n printSectionHeader(\"Modified Files\");\n for (const file of modifiedFiles) {\n printListItem(file);\n }\n\n printSectionHeader(\"Status\");\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n}\n\ninterface RavenYamlConfig {\n version: string;\n language?: string;\n}\n\nasync function createRavenYaml(\n destDir: string,\n version: string,\n language?: string,\n) {\n const data: RavenYamlConfig = { version };\n if (language !== undefined) {\n data.language = language;\n }\n const content = stringify(data);\n await writeFile(join(destDir, \"raven.yaml\"), content);\n}\n\nasync function getInstalledModules(\n ravenDir: string,\n registry: Registry,\n): Promise<Set<string>> {\n const installed = new Set<string>();\n for (const name of getModuleNames(registry)) {\n const modDir = join(ravenDir, name);\n if ((await pathExists(modDir)) && !(await isDirEmpty(modDir))) {\n installed.add(name);\n }\n }\n return installed;\n}\n\nasync function cmdAdd(moduleName: string, options: CLIOptions) {\n const registry = await loadRegistry(options);\n if (!moduleName) {\n error(\n `Please specify a module to add. Available: ${getModuleNames(registry).join(\", \")}`,\n );\n }\n\n const available = getModuleNames(registry);\n\n if (!available.includes(moduleName)) {\n error(`Unknown module: ${moduleName}`);\n }\n\n const { ravenDir } = await ensureRavenInstalled(options);\n\n const installed = await getInstalledModules(ravenDir, registry);\n const order = getInstallOrder(moduleName, registry, installed);\n\n try {\n const modifiedFiles: string[] = [];\n const allDependencies: Record<string, string> = {};\n for (const name of order) {\n const files = await installModule(\n registry,\n name,\n ravenDir,\n options,\n );\n modifiedFiles.push(...files);\n const mod = registry.modules[name];\n if (mod?.dependencies) {\n Object.assign(allDependencies, mod.dependencies);\n }\n }\n\n // Two JSON lines for Agent: add result + status in one call to save tokens.\n console.log(\n JSON.stringify({\n success: true,\n moduleName,\n modifiedFiles,\n dependencies: allDependencies,\n }),\n );\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n } catch (e: any) {\n error(e.message);\n }\n}\n\n// === SECTION: Status ===\n\ninterface ModuleInfo {\n name: string;\n description?: string;\n installed: boolean;\n /** 模块目录的绝对路径 */\n installDir?: string;\n}\n\ninterface StatusResult {\n modules: ModuleInfo[];\n version?: string;\n language?: string;\n modifiedFiles?: string[];\n fileHashes?: Record<string, string>;\n}\n\nasync function computeFileHash(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nasync function getStatus(\n registry: Registry,\n options: CLIOptions,\n): Promise<StatusResult> {\n const targetDir = cwd();\n const root = getRoot(options);\n const ravenDir = join(targetDir, root);\n\n let currentVersion: string | undefined;\n const modifiedFiles: string[] = [];\n const fileHashes: Record<string, string> = {};\n\n const knownModules = getModuleNames(registry).sort();\n const moduleStatus: ModuleInfo[] = [];\n let language: string | undefined;\n\n if (await pathExists(ravenDir)) {\n const yamlPath = join(ravenDir, \"raven.yaml\");\n try {\n const content = await readFile(yamlPath, \"utf-8\");\n const config = parse(content) as RavenYamlConfig;\n if (config?.version) {\n currentVersion = config.version;\n }\n if (config?.language !== undefined) {\n language = config.language;\n }\n } catch (_e) {\n // raven.yaml missing or invalid\n }\n\n for (const name of knownModules) {\n const modDir = join(ravenDir, name);\n const installed =\n (await pathExists(modDir)) && !(await isDirEmpty(modDir));\n const mod = registry.modules[name];\n moduleStatus.push({\n name,\n description: mod?.description,\n installed,\n installDir: resolve(modDir),\n });\n }\n\n // Compute file hashes for all files in raven/\n async function traverseDir(dir: string, baseDir: string) {\n const dirEntries = await readdir(dir, { withFileTypes: true });\n for (const e of dirEntries) {\n const fullPath = join(dir, e.name);\n const relPath = fullPath.slice(baseDir.length + 1);\n if (e.isDirectory()) {\n await traverseDir(fullPath, baseDir);\n } else {\n const hash = await computeFileHash(fullPath);\n fileHashes[relPath] = hash;\n }\n }\n }\n await traverseDir(ravenDir, ravenDir);\n }\n\n if (moduleStatus.length === 0) {\n for (const name of knownModules) {\n const mod = registry.modules[name];\n const modDir = join(ravenDir, name);\n moduleStatus.push({\n name,\n description: mod?.description,\n installed: false,\n installDir: resolve(modDir),\n });\n }\n }\n\n return {\n modules: moduleStatus,\n version: currentVersion,\n language: language ?? \"English (default)\",\n modifiedFiles,\n fileHashes,\n };\n}\n\ninterface StatusCLIOptions extends CLIOptions {}\n\nasync function cmdStatus(options: StatusCLIOptions) {\n const registry = await loadRegistry(options);\n const status = await getStatus(registry, options);\n console.log(JSON.stringify(status));\n}\n\nconst program = new Command(\"raven\");\nprogram.version(loadCliVersion());\n\nprogram\n .option(\"--registry <path>\", \"Registry json path (default: same dir as CLI)\")\n .option(\"--root <dir>\", \"RavenJS root directory (default: raven)\")\n .option(\"-v, --verbose\", \"Verbose output\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize raven root (directory and raven.yaml). Install AI skills with install-raven.\")\n .option(\"--language <lang>\", \"Language (stored in raven.yaml)\")\n .action(function (this: { opts: () => CLIOptions }) {\n const opts = this.opts();\n cmdInit({ ...program.opts(), language: opts.language } as CLIOptions);\n });\n\nprogram\n .command(\"add <module>\")\n .description(\"Add a module (e.g., core)\")\n .action((module: string) => cmdAdd(module, program.opts() as CLIOptions));\n\nprogram\n .command(\"status\")\n .description(\"Show RavenJS installation status (core, modules)\")\n .action(() => cmdStatus(program.opts() as StatusCLIOptions));\n\nprogram.parse();\n"
6
6
  ],
7
- "mappings": ";;;;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA,oBAAS;AACT;AAHA,IAAM,aAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAKxD,SAAS,cAAc,GAAW;AAChC,SAAO,QAAQ,IAAI,qBAAqB;AAAA;AAG1C,IAAM,eAAe;AAsBrB,eAAe,UAAU,CAAC,MAAgC;AACxD,MAAI;AACF,UAAM,OAAO,IAAI;AACjB,WAAO;AAAA,UACP;AACA,WAAO;AAAA;AAAA;AAIX,eAAe,YAAY,CAAC,SAEN;AACpB,QAAM,aAAuB,CAAC;AAC9B,MAAI,SAAS,UAAU;AACrB,eAAW,KACT,WAAW,QAAQ,QAAQ,IACvB,QAAQ,WACR,QAAQ,IAAI,GAAG,QAAQ,QAAQ,CACrC;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,6BAA6B;AAC3C,UAAM,IAAI,QAAQ,IAAI;AACtB,eAAW,KAAK,WAAW,CAAC,IAAI,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,EACvD;AACA,aAAW,KAAK,KAAK,YAAW,eAAe,CAAC;AAEhD,aAAW,KAAK,YAAY;AAC1B,QAAI,MAAM,WAAW,CAAC,GAAG;AACvB,YAAM,UAAU,MAAM,SAAS,GAAG,OAAO;AACzC,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AACA,UAAQ,MACN,qEACF;AACA,UAAQ,KAAK,CAAC;AAAA;AAGhB,SAAS,OAAO,CAAC,SAA6B;AAC5C,SAAO,QAAQ,QAAQ,QAAQ,IAAI,cAAc;AAAA;AAGnD,eAAe,UAAU,CAAC,SAAiB,SAAsB;AAC/D,MAAI,SAAS,SAAS;AACpB,YAAQ,IAAI,OAAO;AAAA,EACrB;AAAA;AAGF,SAAS,KAAK,CAAC,SAAwB;AAGrC,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAAA;AAGhB,SAAS,OAAO,CAAC,SAAiB;AAChC,MAAI,QAAQ,OAAO;AAAA;AAGrB,SAAS,kBAAkB,CAAC,OAAe;AACzC,MAAI,KAAK,KAAK;AAAA;AAGhB,SAAS,aAAa,CAAC,MAAc;AACnC,MAAI,QAAQ,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;AAAA;AAG3C,eAAe,SAAS,CAAC,MAAc;AACrC,MAAI;AACF,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,WAC9B,GAAP;AACA,QAAI,EAAE,SAAS;AAAU,YAAM;AAAA;AAAA;AAInC,eAAe,UAAU,CAAC,MAAgC;AACxD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,WAAO,QAAQ,WAAW;AAAA,WACnB,GAAP;AACA,QAAI,EAAE,SAAS;AAAU,aAAO;AAChC,UAAM;AAAA;AAAA;AAIV,eAAe,UAAU,CAAC,MAAgC;AACxD,MAAI;AACF,UAAM,KAAK,IAAI;AACf,WAAO;AAAA,WACA,GAAP;AACA,QAAI,EAAE,SAAS;AAAU,aAAO;AAChC,UAAM;AAAA;AAAA;AAIV,eAAe,oBAAoB,CACjC,SACgD;AAChD,QAAM,YAAY,IAAI;AACtB,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,WAAW,KAAK,WAAW,IAAI;AAErC,OAAM,MAAM,WAAW,QAAQ,GAAI;AACjC,UAAM,4BAA4B,gCAAgC;AAAA,EACpE;AAEA,QAAM,WAAW,KAAK,UAAU,YAAY;AAC5C,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,UAAM,SAAS,MAAM,OAAO;AAC5B,SAAK,QAAQ,SAAS;AACpB,YAAM,8CAA8C;AAAA,IACtD;AACA,WAAO,EAAE,UAAU,SAAS,OAAO,QAAQ;AAAA,WACpC,GAAP;AACA,UAAM,8BAA8B,EAAE,SAAS;AAAA;AAAA;AAInD,SAAS,cAAc,CAAC,UAA8B;AACpD,SAAO,OAAO,KAAK,SAAS,OAAO;AAAA;AAGrC,SAAS,eAAe,CACtB,YACA,UACA,WACU;AACV,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAU,IAAI;AACpB,QAAM,WAAW,IAAI;AACrB,QAAM,OAAiB,CAAC;AACxB,MAAI,QAAyB;AAE7B,WAAS,KAAK,CAAC,MAAc;AAC3B,QAAI,SAAS,IAAI,IAAI,GAAG;AACtB,YAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,cAAQ,KAAK,MAAM,GAAG,EAAE,OAAO,IAAI;AACnC;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,IAAI;AAAG;AACvB,YAAQ,IAAI,IAAI;AAChB,aAAS,IAAI,IAAI;AACjB,SAAK,KAAK,IAAI;AAEd,UAAM,MAAM,SAAS,QAAQ;AAC7B,QAAI,KAAK,WAAW;AAClB,iBAAW,OAAO,IAAI,WAAW;AAC/B,YAAI,SAAS,QAAQ;AAAM,gBAAM,GAAG;AAAA,MACtC;AAAA,IACF;AACA,SAAK,UAAU,IAAI,IAAI,GAAG;AACxB,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,SAAK,IAAI;AACT,aAAS,OAAO,IAAI;AAAA;AAGtB,QAAM,UAAU;AAChB,MAAI,UAAU,MAAM;AAClB,UAAM,wBAAyB,MAAmB,KAAK,MAAM,GAAG;AAAA,EAClE;AACA,SAAO;AAAA;AAGT,IAAM,iBAAiB;AAEvB,SAAS,mBAAmB,CAC1B,SACA,eACA,UACQ;AACR,QAAM,cAAc,OAAO,KAAK,SAAS,OAAO;AAChD,MAAI,MAAM;AACV,QAAM,QAAQ,cAAc,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE;AACvD,QAAM,SAAS,QAAQ,IAAI,MAAM,OAAO,KAAK,IAAI;AACjD,aAAW,WAAW,aAAa;AACjC,UAAM,MAAM,GAAG,iBAAiB;AAChC,UAAM,MAAM,SAAS;AAErB,UAAM,KAAK,IAAI,OACb,YAAY,IAAI,QAAQ,uBAAuB,MAAM,MACrD,GACF;AACA,UAAM,KAAK,IAAI,OACb,YAAY,IAAI,QAAQ,uBAAuB,MAAM,MACrD,GACF;AACA,UAAM,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,SAAS,MAAM;AAAA,EACpE;AACA,SAAO;AAAA;AAGT,IAAM,oBAAoB,CAAC,OAAO,QAAQ,OAAO,MAAM;AAEvD,SAAS,YAAY,CAAC,MAAuB;AAC3C,SAAO,kBAAkB,KAAK,CAAC,QAAQ,KAAK,SAAS,GAAG,CAAC;AAAA;AAG3D,eAAe,aAAa,CAC1B,UACA,YACA,SACA,SACA,cACmB;AACnB,QAAM,SAAS,SAAS,QAAQ;AAChC,OAAK,QAAQ;AACX,UAAM,IAAI,MAAM,UAAU,kCAAkC;AAAA,EAC9D;AAEA,aAAW,cAAc,uBAAuB,OAAO;AAEvD,QAAM,oBAAoB,KAAK,YAAW,QAAQ;AAClD,QAAM,gBAAgB,gBAAgB;AAEtC,QAAM,gBAA0B,CAAC;AACjC,QAAM,SAAS,OAAO,MAAM,IAAI,OAAO,SAAiB;AACtD,QAAI;AAEJ,QAAI,OAAO,cAAc,OAAO;AAC9B,iBAAW,KAAK,SAAS,OAAO,YAAY,KAAK;AAAA,IACnD,WAAW,cAAc;AACvB,iBAAW,KAAK,SAAS,cAAc,IAAI;AAAA,IAC7C,OAAO;AACL,iBAAW,KAAK,SAAS,YAAY,IAAI;AAAA;AAG3C,eAAW,aAAa,WAAW,OAAO;AAE1C,UAAM,UAAU,KAAK,mBAAmB,YAAY,IAAI;AACxD,SAAM,MAAM,WAAW,OAAO,GAAI;AAChC,YAAM,IAAI,MAAM,iCAAiC,SAAS;AAAA,IAC5D;AAEA,QAAI,UAAU,MAAM,SAAS,SAAS,OAAO;AAE7C,QAAI,aAAa,IAAI,GAAG;AACtB,gBAAU,oBAAoB,SAAS,eAAe,QAAQ;AAAA,IAChE;AAEA,UAAM,UAAU,QAAQ,QAAQ,CAAC;AACjC,UAAM,UAAU,UAAU,OAAO;AACjC,kBAAc,KAAK,QAAQ;AAAA,GAC5B;AAED,QAAM,QAAQ,IAAI,MAAM;AACxB,SAAO;AAAA;AAGT,eAAe,OAAO,CAAC,SAAqB;AAC1C,QAAM,WAAW,MAAM,aAAa,OAAO;AAC3C,QAAM,YAAY,IAAI;AACtB,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,WAAW,KAAK,WAAW,IAAI;AAErC,aAAW,2BAA2B,aAAa,OAAO;AAE1D,QAAM,UAAU,SAAS;AACzB,QAAM,gBAA0B,CAAC;AAEjC,QAAM,kBAAkB,MAAM,WAAW,QAAQ;AACjD,QAAM,gBAAgB,KAAK,UAAU,YAAY;AACjD,QAAM,kBAAkB,MAAM,WAAW,aAAa;AAEtD,QAAM,SAAS,YAAY;AACzB,SAAK,oBAAoB,iBAAiB;AACxC,YAAM,UAAU,QAAQ;AACxB,YAAM,gBAAgB,UAAU,OAAO;AACvC,oBAAc,KAAK,aAAa;AAAA,IAClC;AAAA;AAGF,MAAI,SAAS,SAAS;AACpB,UAAM,OAAO;AAAA,EACf,OAAO;AACL,UAAM,IAAI,YAAY;AACtB,MAAE,MAAM,4BAA4B;AACpC,QAAI;AACF,YAAM,OAAO;AAAA,aACN,GAAP;AACA,QAAE,KAAK,uBAAuB;AAC9B,YAAM,EAAE,OAAO;AAAA;AAEjB,MAAE,KAAK,4BAA4B;AAAA;AAGrC,UAAQ,+FAA+F;AAEvG,qBAAmB,gBAAgB;AACnC,aAAW,QAAQ,eAAe;AAChC,kBAAc,IAAI;AAAA,EACpB;AAEA,qBAAmB,QAAQ;AAC3B,QAAM,SAAS,MAAM,UAAU,UAAU,OAAO;AAChD,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA;AAOpC,eAAe,eAAe,CAAC,SAAiB,SAAiB;AAC/D,QAAM,UAAU,UAAU,EAAE,QAAQ,CAAC;AACrC,QAAM,UAAU,KAAK,SAAS,YAAY,GAAG,OAAO;AAAA;AAGtD,eAAe,mBAAmB,CAChC,UACA,UACsB;AACtB,QAAM,YAAY,IAAI;AACtB,aAAW,QAAQ,eAAe,QAAQ,GAAG;AAC3C,UAAM,SAAS,KAAK,UAAU,IAAI;AAClC,QAAK,MAAM,WAAW,MAAM,MAAQ,MAAM,WAAW,MAAM,GAAI;AAC7D,gBAAU,IAAI,IAAI;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AAAA;AAGT,eAAe,MAAM,CAAC,YAAoB,SAAqB;AAC7D,QAAM,WAAW,MAAM,aAAa,OAAO;AAC3C,OAAK,YAAY;AACf,UACE,8CAA8C,eAAe,QAAQ,EAAE,KAAK,IAAI,GAClF;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,QAAQ;AAEzC,OAAK,UAAU,SAAS,UAAU,GAAG;AACnC,UAAM,mBAAmB,YAAY;AAAA,EACvC;AAEA,UAAQ,aAAa,MAAM,qBAAqB,OAAO;AAEvD,QAAM,YAAY,MAAM,oBAAoB,UAAU,QAAQ;AAC9D,QAAM,QAAQ,gBAAgB,YAAY,UAAU,SAAS;AAE7D,MAAI;AACF,UAAM,gBAA0B,CAAC;AACjC,UAAM,kBAA0C,CAAC;AACjD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,MAAM,cAClB,UACA,MACA,UACA,OACF;AACA,oBAAc,KAAK,GAAG,KAAK;AAC3B,YAAM,MAAM,SAAS,QAAQ;AAC7B,UAAI,KAAK,cAAc;AACrB,eAAO,OAAO,iBAAiB,IAAI,YAAY;AAAA,MACjD;AAAA,IACF;AAGA,YAAQ,IACN,KAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAChB,CAAC,CACH;AACA,UAAM,SAAS,MAAM,UAAU,UAAU,OAAO;AAChD,YAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,WAC3B,GAAP;AACA,UAAM,EAAE,OAAO;AAAA;AAAA;AAqBnB,eAAe,eAAe,CAAC,UAAmC;AAChE,QAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA;AAG1D,eAAe,SAAS,CACtB,UACA,SACuB;AACvB,QAAM,YAAY,IAAI;AACtB,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,WAAW,KAAK,WAAW,IAAI;AAErC,MAAI;AACJ,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAqC,CAAC;AAE5C,QAAM,eAAe,eAAe,QAAQ,EAAE,KAAK;AACnD,QAAM,eAA6B,CAAC;AAEpC,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAM,WAAW,KAAK,UAAU,YAAY;AAC5C,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,YAAM,SAAS,MAAM,OAAO;AAC5B,UAAI,QAAQ,SAAS;AACnB,yBAAiB,OAAO;AAAA,MAC1B;AAAA,aACO,IAAP;AAAA;AAIF,eAAW,QAAQ,cAAc;AAC/B,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,YAAM,YACH,MAAM,WAAW,MAAM,MAAQ,MAAM,WAAW,MAAM;AACzD,YAAM,MAAM,SAAS,QAAQ;AAC7B,mBAAa,KAAK;AAAA,QAChB;AAAA,QACA,aAAa,KAAK;AAAA,QAClB;AAAA,QACA,YAAY,QAAQ,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH;AAGA,mBAAe,WAAW,CAAC,KAAa,SAAiB;AACvD,YAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,iBAAW,KAAK,YAAY;AAC1B,cAAM,WAAW,KAAK,KAAK,EAAE,IAAI;AACjC,cAAM,UAAU,SAAS,MAAM,QAAQ,SAAS,CAAC;AACjD,YAAI,EAAE,YAAY,GAAG;AACnB,gBAAM,YAAY,UAAU,OAAO;AAAA,QACrC,OAAO;AACL,gBAAM,OAAO,MAAM,gBAAgB,QAAQ;AAC3C,qBAAW,WAAW;AAAA;AAAA,MAE1B;AAAA;AAEF,UAAM,YAAY,UAAU,QAAQ;AAAA,EACtC;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,eAAW,QAAQ,cAAc;AAC/B,YAAM,MAAM,SAAS,QAAQ;AAC7B,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,mBAAa,KAAK;AAAA,QAChB;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,WAAW;AAAA,QACX,YAAY,QAAQ,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AAAA;AAKF,eAAe,SAAS,CAAC,SAA2B;AAClD,QAAM,WAAW,MAAM,aAAa,OAAO;AAC3C,QAAM,SAAS,MAAM,UAAU,UAAU,OAAO;AAChD,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA;AAGpC,IAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,QAAQ,QAAQ,eAAe,CAAC;AAEhC,QACG,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,gBAAgB,yCAAyC,EAChE,OAAO,iBAAiB,gBAAgB;AAE3C,QACG,QAAQ,MAAM,EACd,YAAY,yFAAyF,EACrG,OAAO,MAAM,QAAQ,QAAQ,KAAK,CAAe,CAAC;AAErD,QACG,QAAQ,cAAc,EACtB,YAAY,2BAA2B,EACvC,OAAO,CAAC,WAAmB,OAAO,QAAQ,QAAQ,KAAK,CAAe,CAAC;AAE1E,QACG,QAAQ,QAAQ,EAChB,YAAY,kDAAkD,EAC9D,OAAO,MAAM,UAAU,QAAQ,KAAK,CAAqB,CAAC;AAE7D,QAAQ,MAAM;",
8
- "debugId": "18CE5936F1B83A4764756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "42611CBFE26601C764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,30 +1,30 @@
1
1
  {
2
- "version": "1.2.2",
2
+ "version": "1.2.4",
3
3
  "modules": {
4
- "sql": {
4
+ "schema-validator": {
5
5
  "files": [
6
6
  "GUIDE.md",
7
7
  "README.md",
8
- "index.ts"
8
+ "index.ts",
9
+ "standard-schema.ts"
9
10
  ],
10
11
  "dependencies": {},
11
12
  "dependsOn": [
12
13
  "core"
13
14
  ],
14
- "description": "RavenJS SQL module providing SQL database integration. Use this module when you need to interact with a SQL database."
15
+ "description": "Validation helper based on Standard Schema. Use this module when you need to validate request data (body, query, params, headers) using Zod, Valibot, or ArkType, and want type-safe context in handlers."
15
16
  },
16
- "schema-validator": {
17
+ "sql": {
17
18
  "files": [
18
19
  "GUIDE.md",
19
20
  "README.md",
20
- "index.ts",
21
- "standard-schema.ts"
21
+ "index.ts"
22
22
  ],
23
23
  "dependencies": {},
24
24
  "dependsOn": [
25
25
  "core"
26
26
  ],
27
- "description": "Validation helper based on Standard Schema. Use this module when you need to validate request data (body, query, params, headers) using Zod, Valibot, or ArkType, and want type-safe context in handlers."
27
+ "description": "RavenJS SQL module providing SQL database integration. Use this module when you need to interact with a SQL database."
28
28
  },
29
29
  "core": {
30
30
  "files": [
@@ -7,8 +7,9 @@ To understand the architecture, concepts, API, and usage, read:
7
7
 
8
8
  # OPTIONAL READING
9
9
 
10
- | Document | Read when… |
11
- |----------|------------|
12
- | [PLUGIN.md](./PLUGIN.md) | You are creating a plugin — covers `definePlugin`, all three state patterns, and plugin-specific gotchas. |
13
- | [router.ts](./router.ts) | You need to understand or extend route matching (Radix tree, path params, wildcards). |
14
- | [standard-schema.ts](./standard-schema.ts) | You need to integrate validation (Zod, Valibot) or implement Standard Schema–compatible validation. |
10
+ | Document | Read when… |
11
+ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
12
+ | [PLUGIN.md](./PLUGIN.md) | You are creating a plugin — covers `definePlugin`, all three state patterns, and plugin-specific gotchas. |
13
+ | [router.ts](./router.ts) | You need to understand or extend route matching (Radix tree, path params, wildcards). |
14
+ | [standard-schema.ts](./standard-schema.ts) | You need to integrate validation (Zod, Valibot) or implement Standard Schema–compatible validation. |
15
+ | [Bun Full Stack Documentation](https://bun.com/docs/bundler/fullstack.md) | If you need to understand how to use Bun's full stack features |
@@ -3,6 +3,7 @@
3
3
  RavenJS Core is a lightweight, high-performance Web framework reference implementation for Bun.
4
4
 
5
5
  **Features**:
6
+
6
7
  - Logic layer: `app.handle` (FetchHandler)
7
8
  - Radix tree router (path parameters)
8
9
  - Dependency injection (DI) via AsyncLocalStorage (ScopedState)
@@ -70,6 +71,24 @@ app.get("/", () => new Response("Hello"));
70
71
  Bun.serve({ fetch: (req) => app.handle(req) });
71
72
  ```
72
73
 
74
+ Because Raven is a logic layer, you can combine it with [Bun's Fullstack Dev Server](https://bun.com/docs/bundler/fullstack.md) to serve HTML routes and bundled frontend assets alongside API routes:
75
+
76
+ ```typescript
77
+ import { Raven } from "@raven.js/core";
78
+ import homepage from "./index.html";
79
+
80
+ const app = new Raven();
81
+
82
+ app.get("/api/hello", () => Response.json({ message: "Hello" }));
83
+
84
+ Bun.serve({
85
+ routes: {
86
+ "/": homepage,
87
+ "/api/*": (req) => app.handle(req),
88
+ },
89
+ });
90
+ ```
91
+
73
92
  ## Context
74
93
 
75
94
  The per-request context object, exposing `request`, `params`, `query`, `url`, `method`, `headers`, and `body`.
@@ -190,13 +209,15 @@ const dbState = createAppState<DB>({ name: "db" });
190
209
  dbState.set(db);
191
210
 
192
211
  // ✓ Correct: called inside plugin load()
193
- await app.register(definePlugin({
194
- name: "db",
195
- states: [],
196
- load(app) {
197
- dbState.set(db);
198
- },
199
- }));
212
+ await app.register(
213
+ definePlugin({
214
+ name: "db",
215
+ states: [],
216
+ load(app) {
217
+ dbState.set(db);
218
+ },
219
+ }),
220
+ );
200
221
  ```
201
222
 
202
223
  ## 4. `BodyState` only parses JSON
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raven.js/cli",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "CLI tool for RavenJS framework",
5
5
  "type": "module",
6
6
  "scripts": {