@gnsx/genesys.agent.cli 1.0.9 → 1.0.10

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.
@@ -0,0 +1,64 @@
1
+ // src/utils/package.ts
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { fileURLToPath } from "url";
5
+ function getPackageJson() {
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ let currentDir = __dirname;
8
+ while (true) {
9
+ const pkgPath = join(currentDir, "package.json");
10
+ if (existsSync(pkgPath)) {
11
+ const content = readFileSync(pkgPath, "utf-8");
12
+ return JSON.parse(content);
13
+ }
14
+ const parentDir = dirname(currentDir);
15
+ if (parentDir === currentDir) {
16
+ throw new Error("Could not find package.json");
17
+ }
18
+ currentDir = parentDir;
19
+ }
20
+ }
21
+
22
+ // src/extensions/version-check.ts
23
+ var pkg = getPackageJson();
24
+ var PACKAGE_NAME = pkg.name;
25
+ var CURRENT_VERSION = pkg.version;
26
+ async function checkForNewVersion() {
27
+ if (process.env.PI_OFFLINE) {
28
+ return void 0;
29
+ }
30
+ try {
31
+ const encodedName = encodeURIComponent(PACKAGE_NAME);
32
+ const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {
33
+ signal: AbortSignal.timeout(1e4)
34
+ });
35
+ if (!response.ok) {
36
+ return void 0;
37
+ }
38
+ const data = await response.json();
39
+ const latestVersion = data.version;
40
+ if (latestVersion && latestVersion !== CURRENT_VERSION) {
41
+ return latestVersion;
42
+ }
43
+ return void 0;
44
+ } catch (err) {
45
+ return void 0;
46
+ }
47
+ }
48
+ var versionCheckExtension = (pi) => {
49
+ pi.on("session_start", async (_event, ctx) => {
50
+ checkForNewVersion().then((newVersion) => {
51
+ if (newVersion) {
52
+ ctx.ui.notify(
53
+ `Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,
54
+ "info"
55
+ );
56
+ }
57
+ });
58
+ });
59
+ };
60
+ var version_check_default = versionCheckExtension;
61
+ export {
62
+ version_check_default as default
63
+ };
64
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/package.ts","../../../src/extensions/version-check.ts"],"sourcesContent":["/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","/**\n * Extension that checks for updates to @gnsx/genesys.agent.cli\n * and shows a notification if a newer version is available.\n */\nimport { getPackageJson } from '../utils/package.js';\n\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from '@mariozechner/pi-coding-agent';\n\nconst pkg = getPackageJson();\nconst PACKAGE_NAME = pkg.name;\nconst CURRENT_VERSION = pkg.version;\n\nasync function checkForNewVersion(): Promise<string | undefined> {\n if (process.env.PI_OFFLINE) {\n return undefined;\n }\n\n try {\n const encodedName = encodeURIComponent(PACKAGE_NAME);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n if (!response.ok) {\n return undefined;\n }\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (latestVersion && latestVersion !== CURRENT_VERSION) {\n return latestVersion;\n }\n return undefined;\n } catch (err) {\n return undefined;\n }\n}\n\nconst versionCheckExtension: ExtensionFactory = (pi: ExtensionAPI) => {\n // Listen for session start to check version\n pi.on('session_start', async (_event, ctx: ExtensionContext) => {\n // Run version check asynchronously (don't block startup)\n checkForNewVersion().then((newVersion) => {\n if (newVersion) {\n ctx.ui.notify(\n `Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,\n 'info'\n );\n }\n });\n });\n};\n\nexport default versionCheckExtension;\n"],"mappings":";AAIA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAEvB,SAAS,iBAA2D;AACzE,QAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,MAAI,aAAa;AAEjB,SAAO,MAAM;AACX,UAAM,UAAU,KAAK,YAAY,cAAc;AAC/C,QAAI,WAAW,OAAO,GAAG;AACvB,YAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AAEA,UAAM,YAAY,QAAQ,UAAU;AAEpC,QAAI,cAAc,YAAY;AAC5B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,iBAAa;AAAA,EACf;AACF;;;AClBA,IAAM,MAAM,eAAe;AAC3B,IAAM,eAAe,IAAI;AACzB,IAAM,kBAAkB,IAAI;AAE5B,eAAe,qBAAkD;AAC/D,MAAI,QAAQ,IAAI,YAAY;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,cAAc,mBAAmB,YAAY;AACnD,UAAM,WAAW,MAAM,MAAM,8BAA8B,WAAW,WAAW;AAAA,MAC/E,QAAQ,YAAY,QAAQ,GAAK;AAAA,IACnC,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,gBAAgB,KAAK;AAE3B,QAAI,iBAAiB,kBAAkB,iBAAiB;AACtD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAA0C,CAAC,OAAqB;AAEpE,KAAG,GAAG,iBAAiB,OAAO,QAAQ,QAA0B;AAE9D,uBAAmB,EAAE,KAAK,CAAC,eAAe;AACxC,UAAI,YAAY;AACd,YAAI,GAAG;AAAA,UACL,sBAAsB,UAAU,eAAe,eAAe,uBAAuB,YAAY;AAAA,UACjG;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAO,wBAAQ;","names":[]}
@@ -222,6 +222,7 @@ var init_package = __esm({
222
222
 
223
223
  // src/cli.ts
224
224
  var cli_exports = {};
225
+ import { existsSync as existsSync2 } from "fs";
225
226
  import { readdir } from "fs/promises";
226
227
  import { dirname as dirname2, join as join2, resolve } from "path";
227
228
  import { fileURLToPath as fileURLToPath3 } from "url";
@@ -279,10 +280,13 @@ async function main(argv) {
279
280
  }
280
281
  const agentDir = getAgentDir();
281
282
  const settingsManager = SettingsManager.create(cwd, agentDir);
283
+ let extensionFiles = [];
282
284
  const extensionsDir = join2(__dirname, "extensions");
283
- const extensionFiles = await readdir(extensionsDir).then(
284
- (files) => files.filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts")).map((f) => join2(extensionsDir, f))
285
- );
285
+ if (existsSync2(extensionsDir)) {
286
+ extensionFiles = await readdir(extensionsDir).then(
287
+ (files) => files.filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts")).map((f) => join2(extensionsDir, f))
288
+ );
289
+ }
286
290
  const resourceLoader = new DefaultResourceLoader({
287
291
  cwd,
288
292
  agentDir,
@@ -340,7 +344,7 @@ var init_cli = __esm({
340
344
  });
341
345
 
342
346
  // src/launcher.ts
343
- import { existsSync as existsSync2 } from "fs";
347
+ import { existsSync as existsSync3 } from "fs";
344
348
  import { dirname as dirname3, join as join3 } from "path";
345
349
  import { fileURLToPath as fileURLToPath4 } from "url";
346
350
  var __filename2 = fileURLToPath4(import.meta.url);
@@ -348,7 +352,7 @@ var __dirname2 = dirname3(__filename2);
348
352
  function findPackageDir(startDir) {
349
353
  let dir = startDir;
350
354
  while (dir !== dirname3(dir)) {
351
- if (existsSync2(join3(dir, "package.json"))) {
355
+ if (existsSync3(join3(dir, "package.json"))) {
352
356
  return dir;
353
357
  }
354
358
  dir = dirname3(dir);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { readdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with our version-check extension\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Scan extensions folder for all .ts and .js files (excluding .d.ts)\n const extensionsDir = join(__dirname, 'extensions');\n const extensionFiles = await readdir(extensionsDir).then((files) =>\n files\n .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))\n .map((f) => join(extensionsDir, f)),\n );\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n additionalExtensionPaths: extensionFiles,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":"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","names":["fileURLToPath","__dirname","dirname","join","fileURLToPath","resolve","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
1
+ {"version":3,"sources":["../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with our version-check extension\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Scan extensions folder for all .ts and .js files (excluding .d.ts)\n let extensionFiles: string[] = [];\n const extensionsDir = join(__dirname, 'extensions');\n if (existsSync(extensionsDir)) {\n extensionFiles = await readdir(extensionsDir).then((files) =>\n files\n .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))\n .map((f) => join(extensionsDir, f)),\n );\n }\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n additionalExtensionPaths: extensionFiles,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":"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","names":["fileURLToPath","__dirname","existsSync","dirname","join","fileURLToPath","resolve","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
package/dist/src/cli.js CHANGED
@@ -6,6 +6,7 @@
6
6
  * All session persistence, model selection, tool management and compaction are
7
7
  * handled by the pi framework.
8
8
  */
9
+ import { existsSync } from 'node:fs';
9
10
  import { readdir } from 'node:fs/promises';
10
11
  import { dirname, join, resolve } from 'node:path';
11
12
  import { fileURLToPath } from 'node:url';
@@ -82,10 +83,13 @@ async function main(argv) {
82
83
  const agentDir = getAgentDir();
83
84
  const settingsManager = SettingsManager.create(cwd, agentDir);
84
85
  // Scan extensions folder for all .ts and .js files (excluding .d.ts)
86
+ let extensionFiles = [];
85
87
  const extensionsDir = join(__dirname, 'extensions');
86
- const extensionFiles = await readdir(extensionsDir).then((files) => files
87
- .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))
88
- .map((f) => join(extensionsDir, f)));
88
+ if (existsSync(extensionsDir)) {
89
+ extensionFiles = await readdir(extensionsDir).then((files) => files
90
+ .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))
91
+ .map((f) => join(extensionsDir, f)));
92
+ }
89
93
  const resourceLoader = new DefaultResourceLoader({
90
94
  cwd,
91
95
  agentDir,
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}