qavor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +93 -0
- package/dist/index.js +2883 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/util/exit-codes.ts","../src/util/logger.ts","../src/cli/commands/init.ts","../src/workspace/init.ts","../src/util/fs.ts","../src/git/git.ts","../src/manifest/loader.ts","../src/manifest/validator.ts","../src/schema/qavor.defs.schema.json","../src/schema/qavor.workspaces.schema.json","../src/schema/qavor.project.schema.json","../src/schema/qavor.repo.schema.json","../src/schema/qavor.service.schema.json","../src/schema/qavor.stateful.schema.json","../src/schema/qavor.profile.schema.json","../src/workspace/paths.ts","../src/cli/options.ts","../src/cli/commands/workspace.ts","../src/workspace/locate.ts","../src/cli/commands/validate.ts","../src/util/concurrency.ts","../src/cli/commands/git.ts","../src/workspace/repos.ts","../src/cli/repos.ts","../src/cli/commands/prepare.ts","../src/manifest/discovery.ts","../src/prepare/prepare.ts","../src/env/composer.ts","../src/env/dotenv.ts","../src/util/hooks.ts","../src/cli/commands/env.ts","../src/supervisor/native.ts","../src/supervisor/state.ts","../src/supervisor/logs.ts","../src/cli/commands/run.ts","../src/cli/commands/doctor.ts"],"sourcesContent":["import process from 'node:process';\nimport { Command } from 'commander';\nimport { ExitCode, QavorError } from './util/exit-codes.js';\nimport { configureLogger, getLogger } from './util/logger.js';\nimport { registerInit } from './cli/commands/init.js';\nimport { registerWorkspace } from './cli/commands/workspace.js';\nimport { registerValidate } from './cli/commands/validate.js';\nimport { registerGitCommands } from './cli/commands/git.js';\nimport { registerPrepare } from './cli/commands/prepare.js';\nimport { registerEnv } from './cli/commands/env.js';\nimport { registerRunCommands } from './cli/commands/run.js';\nimport { registerDoctor } from './cli/commands/doctor.js';\n\nconst PKG_VERSION = '0.1.0';\n\nfunction buildProgram(): Command {\n const program = new Command();\n program\n .name('qavor')\n .description('A CLI for managing a constellation of related repositories as one cohesive developer workspace.')\n .version(PKG_VERSION, '-V, --version')\n .option('--json', 'Emit machine-readable JSON output. One object per line on stdout.')\n .option('-v, --verbose', 'Enable debug-level logging on stderr.')\n .option('-c, --config <path>', 'Override the path to the workspace pointer file.')\n .option('-j, --jobs <n>', 'Maximum concurrency for fan-out operations.', (raw) => {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(`--jobs must be a positive integer (got '${raw}').`);\n }\n return raw;\n })\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n configureLogger({ json: Boolean(opts.json), verbose: Boolean(opts.verbose) });\n });\n registerInit(program);\n registerWorkspace(program);\n registerValidate(program);\n registerGitCommands(program);\n registerPrepare(program);\n registerEnv(program);\n registerRunCommands(program);\n registerDoctor(program);\n return program;\n}\n\nasync function main(argv: string[]): Promise<number> {\n const program = buildProgram();\n try {\n await program.parseAsync(argv, { from: 'node' });\n return ExitCode.Ok;\n } catch (err) {\n return handleError(err);\n }\n}\n\nfunction handleError(err: unknown): number {\n // commander surfaces help/version exits via thrown CommanderError; respect them.\n const e = err as { code?: string; exitCode?: number; message?: string };\n if (e && (e.code === 'commander.helpDisplayed' || e.code === 'commander.help')) return ExitCode.Ok;\n if (e && e.code === 'commander.version') return ExitCode.Ok;\n if (e && typeof e.code === 'string' && e.code.startsWith('commander.')) {\n process.stderr.write(`${e.message ?? 'command error'}\\n`);\n return ExitCode.UserError;\n }\n if (err instanceof QavorError) {\n process.stderr.write(`${err.message}\\n`);\n return err.exitCode;\n }\n const message = err instanceof Error ? err.stack ?? err.message : String(err);\n // Fall back to the logger so JSON mode produces structured output.\n try {\n const logger = getLogger();\n logger.error({ err: message }, 'unhandled error');\n } catch {\n process.stderr.write(`${message}\\n`);\n }\n return ExitCode.RuntimeError;\n}\n\nconst code = await main(process.argv);\nprocess.exit(code);\n","/**\n * Exit code contract for the qavor CLI. Documented in docs/exit-codes.md.\n *\n * 0 - OK\n * 1 - User error (bad arguments, command misuse)\n * 2 - Manifest error (validation, parse, cross-ref)\n * 3 - Runtime error (subprocess failure, IO failure, supervisor failure)\n * 10+ - Reserved for future use\n */\nexport const ExitCode = {\n Ok: 0,\n UserError: 1,\n ManifestError: 2,\n RuntimeError: 3,\n} as const;\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\nexport class QavorError extends Error {\n readonly exitCode: ExitCode;\n constructor(message: string, exitCode: ExitCode = ExitCode.RuntimeError) {\n super(message);\n this.name = 'QavorError';\n this.exitCode = exitCode;\n }\n}\n\nexport class UserError extends QavorError {\n constructor(message: string) {\n super(message, ExitCode.UserError);\n this.name = 'UserError';\n }\n}\n\nexport class ManifestError extends QavorError {\n constructor(message: string) {\n super(message, ExitCode.ManifestError);\n this.name = 'ManifestError';\n }\n}\n\nexport class RuntimeFailure extends QavorError {\n constructor(message: string) {\n super(message, ExitCode.RuntimeError);\n this.name = 'RuntimeFailure';\n }\n}\n","import pino, { type Logger as PinoLogger } from 'pino';\n\nexport type Logger = PinoLogger;\n\nexport interface LoggerOptions {\n json: boolean;\n verbose: boolean;\n}\n\nlet rootLogger: Logger | null = null;\n\nexport function configureLogger(opts: LoggerOptions): Logger {\n const level = opts.verbose ? 'debug' : 'info';\n // Logs always go to stderr so stdout stays clean for user output (tables in\n // human mode, NDJSON payloads in --json mode). Pretty-print only on a TTY.\n const stderrIsTty = Boolean(process.stderr.isTTY);\n if (opts.json || !stderrIsTty) {\n rootLogger = pino({ level }, pino.destination({ fd: 2, sync: true }));\n } else {\n rootLogger = pino({\n level,\n transport: {\n target: 'pino-pretty',\n options: {\n destination: 2,\n colorize: stderrIsTty,\n translateTime: false,\n ignore: 'pid,hostname,time',\n messageFormat: '{msg}',\n singleLine: false,\n sync: true,\n },\n },\n });\n }\n return rootLogger;\n}\n\nexport function getLogger(): Logger {\n if (!rootLogger) {\n rootLogger = pino({ level: 'info' });\n }\n return rootLogger;\n}\n\n/**\n * Plain stdout output for human-readable mode. Bypasses pino so tabular\n * output (`status`, `ps`, `env`) renders without log decorations.\n */\nexport function emit(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/**\n * JSON-mode output. Always one JSON object per line on stdout.\n */\nexport function emitJson(payload: unknown): void {\n process.stdout.write(JSON.stringify(payload) + '\\n');\n}\n","import path from 'node:path';\nimport type { Command } from 'commander';\nimport { getLogger, emit, emitJson } from '../../util/logger.js';\nimport { initWorkspace } from '../../workspace/init.js';\nimport { inheritRootOptions } from '../options.js';\n\nexport function registerInit(program: Command): void {\n program\n .command('init')\n .description('Bootstrap a workspace from a project repo (local path or git URL).')\n .argument('<source>', 'Local path to a project repo, or a git URL.')\n .option('--into <dir>', 'Workspace root directory. Defaults to the current directory.')\n .action(async (source: string, opts: { into?: string }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const initOpts: Parameters<typeof initWorkspace>[0] = { source, logger };\n if (opts.into) initOpts.into = opts.into;\n const result = await initWorkspace(initOpts);\n if (root.json) {\n emitJson({\n ok: true,\n workspace: result.paths.root,\n project_name: result.project.name,\n project_repo_path: result.projectRepoPath,\n cloned_project: result.cloned,\n repositories: result.project.repositories.length,\n });\n } else {\n emit(`Workspace initialized at ${result.paths.root}`);\n emit(` project: ${result.project.name}`);\n emit(` project repo: ${path.relative(result.paths.root, result.projectRepoPath)}`);\n emit(` repositories declared: ${result.project.repositories.length}`);\n emit(` next: qavor clone`);\n }\n });\n}\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { UserError, ManifestError } from '../util/exit-codes.js';\nimport { ensureDir, globalCacheDir, isDirectory, writeJsonFile } from '../util/fs.js';\nimport { gitClone, isGitRepo } from '../git/git.js';\nimport { loadManifestFile } from '../manifest/loader.js';\nimport { validateDocument } from '../manifest/validator.js';\nimport type { Logger } from '../util/logger.js';\nimport { workspacePaths, type WorkspacePaths } from './paths.js';\nimport type { ProjectManifest } from '../manifest/types/index.js';\n\nexport interface InitOptions {\n /** Project repo source: local path or git URL. */\n source: string;\n /** Workspace root override. Defaults to cwd. */\n into?: string;\n logger: Logger;\n}\n\nexport interface InitResult {\n paths: WorkspacePaths;\n /** Absolute path to the project repo on disk. */\n projectRepoPath: string;\n /** Parsed project manifest body. */\n project: ProjectManifest;\n /** Whether init had to clone the project repo. */\n cloned: boolean;\n}\n\nconst URL_RE = /^(?:git@[^:]+:|https?:\\/\\/|git:\\/\\/|ssh:\\/\\/|file:\\/\\/)/;\n\nfunction looksLikeGitUrl(s: string): boolean {\n return URL_RE.test(s);\n}\n\nfunction projectRepoNameFromUrl(url: string): string {\n // strip query/fragments\n const cleaned = url.replace(/[?#].*$/, '');\n const last = cleaned.split('/').pop() ?? cleaned.split(':').pop() ?? 'project';\n return last.replace(/\\.git$/, '');\n}\n\n/**\n * Idempotent. Implements `qavor init <project-repo-source> [--into <dir>]`\n * per ADR-004:\n * 1. Resolve the source as local path or URL.\n * 2. Ensure the workspace dir exists; default to cwd.\n * 3. Clone the project repo into <workspace>/<repo-name>.git/ if not\n * already on disk.\n * 4. Read its `kind: project` manifest.\n * 5. Write <workspace>/qavor.yaml with `kind: workspaces` pointing at it.\n * 6. Initialize `.qavor/` and `workspace.json`.\n */\nexport async function initWorkspace(opts: InitOptions): Promise<InitResult> {\n const workspaceRoot = path.resolve(opts.into ?? process.cwd());\n await ensureDir(workspaceRoot);\n const paths = workspacePaths(workspaceRoot);\n\n let projectRepoPath: string;\n let cloned = false;\n\n if (looksLikeGitUrl(opts.source)) {\n const repoName = projectRepoNameFromUrl(opts.source);\n const target = path.join(workspaceRoot, `${repoName}.git`);\n if (await isDirectory(target)) {\n if (!(await isGitRepo(target))) {\n throw new UserError(\n `Cannot reuse ${target}: directory exists but is not a git repo. Move it aside and re-run.`,\n );\n }\n opts.logger.info({ target }, 'reusing existing project repo clone');\n projectRepoPath = target;\n } else {\n // Use a global cache to speed up repeat init calls.\n const cacheDir = path.join(globalCacheDir(), 'projects', urlHash(opts.source));\n await ensureDir(path.dirname(cacheDir));\n opts.logger.info({ url: opts.source, target }, 'cloning project repo');\n await gitClone({ url: opts.source, dest: target });\n // Also populate the cache marker so future tooling can locate it.\n try {\n await ensureDir(cacheDir);\n await fs.writeFile(\n path.join(cacheDir, 'source.json'),\n JSON.stringify({ url: opts.source, cloned_to: target, at: new Date().toISOString() }, null, 2),\n );\n } catch {\n /* non-fatal */\n }\n projectRepoPath = target;\n cloned = true;\n }\n } else {\n const localPath = path.resolve(opts.source);\n if (!(await isDirectory(localPath))) {\n throw new UserError(`Project repo source does not exist or is not a directory: ${localPath}`);\n }\n projectRepoPath = localPath;\n }\n\n // Read the project manifest.\n const projectManifestFile = path.join(projectRepoPath, 'qavor.yaml');\n const docs = await loadManifestFile(projectManifestFile);\n const projectDoc = docs.find((d) => d.kind === 'project');\n if (!projectDoc) {\n throw new ManifestError(\n `Project repo at ${projectRepoPath} is missing a \\`kind: project\\` document in qavor.yaml.`,\n );\n }\n const result = validateDocument(projectDoc);\n if (!result.ok) {\n const msg = result.issues\n .map((i) => ` ${i.file}:${i.line}:${i.column} ${i.path}: ${i.message}`)\n .join('\\n');\n throw new ManifestError(`Invalid project manifest:\\n${msg}`);\n }\n const project = projectDoc.data as unknown as ProjectManifest;\n\n // Initialize workspace state directory.\n await ensureDir(paths.stateRoot);\n await ensureDir(paths.stateDir);\n await ensureDir(paths.logsDir);\n await ensureDir(paths.composeDir);\n await ensureDir(paths.cacheDir);\n await fs.writeFile(\n paths.stateGitignore,\n [\n '# qavor state directory — all files are generated. Do not commit.',\n '*',\n '!.gitignore',\n '',\n ].join('\\n'),\n );\n\n // Write the workspaces pointer (idempotent).\n const relProjectPath = './' + path.relative(workspaceRoot, projectRepoPath).split(path.sep).join('/');\n const workspacesYaml = renderWorkspacesYaml(relProjectPath);\n await fs.writeFile(paths.workspacesFile, workspacesYaml, 'utf8');\n\n // Workspace meta.\n const manifestHash = createHash('sha256')\n .update(await fs.readFile(projectManifestFile))\n .digest('hex');\n await writeJsonFile(paths.workspaceMetaFile, {\n project_name: project.name,\n project_repo_path: projectRepoPath,\n manifest_hash: manifestHash,\n initialized_at: new Date().toISOString(),\n });\n\n return { paths, projectRepoPath, project, cloned };\n}\n\nfunction urlHash(url: string): string {\n return createHash('sha256').update(url).digest('hex').slice(0, 16);\n}\n\nfunction renderWorkspacesYaml(relProjectPath: string): string {\n return [\n '# Generated by `qavor init`. Points at the project repo whose',\n '# `kind: project` manifest enumerates the rest of the workspace.',\n 'kind: workspaces',\n `root_project_path: ${relProjectPath}`,\n '',\n ].join('\\n');\n}\n","import { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function pathExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isDirectory(target: string): Promise<boolean> {\n try {\n const s = await fs.stat(target);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function isFile(target: string): Promise<boolean> {\n try {\n const s = await fs.stat(target);\n return s.isFile();\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(target: string): Promise<void> {\n await fs.mkdir(target, { recursive: true });\n}\n\nexport async function readJsonFile<T = unknown>(target: string): Promise<T> {\n const raw = await fs.readFile(target, 'utf8');\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(target: string, value: unknown): Promise<void> {\n await ensureDir(path.dirname(target));\n await fs.writeFile(target, JSON.stringify(value, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Stream a file through SHA-256. Returns the hex digest. Returns null if the\n * file does not exist (so callers can include \"missing\" as a hash component).\n */\nexport async function sha256File(target: string): Promise<string | null> {\n try {\n const hash = createHash('sha256');\n const stream = createReadStream(target);\n for await (const chunk of stream) hash.update(chunk as Buffer);\n return hash.digest('hex');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\n/**\n * Resolve `~` and `$XDG_CACHE_HOME` against the user's environment for\n * locating qavor's global cache directory.\n */\nexport function globalCacheDir(env: NodeJS.ProcessEnv = process.env): string {\n const xdg = env.XDG_CACHE_HOME;\n if (xdg && xdg.length > 0) return path.join(xdg, 'qavor');\n const home = env.HOME ?? env.USERPROFILE ?? '/tmp';\n return path.join(home, '.cache', 'qavor');\n}\n","import { execa, type ExecaError, type ResultPromise } from 'execa';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport simpleGit, { type SimpleGit } from 'simple-git';\nimport { RuntimeFailure } from '../util/exit-codes.js';\nimport { isDirectory } from '../util/fs.js';\n\nexport interface GitRunOptions {\n cwd: string;\n signal?: AbortSignal;\n /** Subprocess env merged on top of process.env. */\n env?: Record<string, string>;\n}\n\n/**\n * Run a `git` subcommand asynchronously via execa. Returns stdout text on\n * success. Throws RuntimeFailure with the underlying command + stderr tail\n * on non-zero exit.\n */\nexport async function runGit(args: string[], opts: GitRunOptions): Promise<string> {\n let child: ResultPromise;\n try {\n child = execa('git', args, {\n cwd: opts.cwd,\n env: opts.env ? { ...process.env, ...opts.env } : process.env,\n ...(opts.signal ? { cancelSignal: opts.signal } : {}),\n stdout: 'pipe',\n stderr: 'pipe',\n });\n const res = await child;\n return typeof res.stdout === 'string' ? res.stdout : '';\n } catch (err) {\n const ee = err as ExecaError;\n const stderr = typeof ee.stderr === 'string' ? ee.stderr : '';\n const stdout = typeof ee.stdout === 'string' ? ee.stdout : '';\n const code = ee.exitCode ?? -1;\n const tail = stderr.trim() || stdout.trim() || ee.shortMessage || ee.message;\n throw new RuntimeFailure(`git ${args.join(' ')} (exit ${code}) in ${opts.cwd}\\n ${tail}`);\n }\n}\n\n/** True when `dir` is a git working tree (contains .git or is bare). */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n if (!(await isDirectory(dir))) return false;\n try {\n await fs.access(path.join(dir, '.git'));\n return true;\n } catch {\n // Maybe bare or worktree; fall back to running git\n try {\n const out = await runGit(['rev-parse', '--is-inside-work-tree'], { cwd: dir });\n return out.trim() === 'true';\n } catch {\n return false;\n }\n }\n}\n\nexport interface RepoStatus {\n branch: string | null;\n ahead: number;\n behind: number;\n dirtyCount: number;\n /** Short last commit oid (7 chars), or null if no commits yet. */\n lastCommit: string | null;\n lastCommitSubject: string | null;\n}\n\nexport async function readRepoStatus(dir: string): Promise<RepoStatus> {\n const git: SimpleGit = simpleGit({ baseDir: dir });\n let branch: string | null = null;\n try {\n const summary = await git.branch();\n branch = summary.current || null;\n } catch {\n branch = null;\n }\n let ahead = 0;\n let behind = 0;\n try {\n const counts = await runGit(['rev-list', '--left-right', '--count', '@{u}...HEAD'], { cwd: dir });\n const [b, a] = counts.trim().split(/\\s+/).map((n) => Number.parseInt(n, 10));\n behind = Number.isFinite(b) ? (b ?? 0) : 0;\n ahead = Number.isFinite(a) ? (a ?? 0) : 0;\n } catch {\n /* no upstream */\n }\n let dirtyCount = 0;\n try {\n const status = await git.status();\n dirtyCount = status.files.length;\n } catch {\n /* ignore */\n }\n let lastCommit: string | null = null;\n let lastCommitSubject: string | null = null;\n try {\n const log = await git.log({ maxCount: 1 });\n if (log.latest) {\n lastCommit = log.latest.hash.slice(0, 7);\n lastCommitSubject = log.latest.message;\n }\n } catch {\n /* ignore */\n }\n return { branch, ahead, behind, dirtyCount, lastCommit, lastCommitSubject };\n}\n\nexport interface CloneOptions {\n url: string;\n /** Destination directory. */\n dest: string;\n branch?: string | undefined;\n tag?: string | undefined;\n commit?: string | undefined;\n shallow?: boolean | undefined;\n submodules?: boolean | undefined;\n signal?: AbortSignal | undefined;\n}\n\nexport async function gitClone(opts: CloneOptions): Promise<void> {\n const args: string[] = ['clone'];\n if (opts.branch && !opts.commit) args.push('--branch', opts.branch);\n else if (opts.tag && !opts.commit) args.push('--branch', opts.tag);\n if (opts.shallow) args.push('--depth', '1');\n if (opts.submodules) args.push('--recurse-submodules');\n args.push('--', opts.url, opts.dest);\n await fs.mkdir(path.dirname(opts.dest), { recursive: true });\n const runOpts: GitRunOptions = { cwd: path.dirname(opts.dest) };\n if (opts.signal) runOpts.signal = opts.signal;\n await runGit(args, runOpts);\n if (opts.commit) {\n const checkoutOpts: GitRunOptions = { cwd: opts.dest };\n if (opts.signal) checkoutOpts.signal = opts.signal;\n await runGit(['checkout', opts.commit], checkoutOpts);\n }\n}\n\nexport async function gitFetch(dir: string, signal?: AbortSignal): Promise<void> {\n const opts: GitRunOptions = { cwd: dir };\n if (signal) opts.signal = signal;\n await runGit(['fetch', '--prune'], opts);\n}\n\nexport async function gitPullFastForward(dir: string, signal?: AbortSignal): Promise<void> {\n const opts: GitRunOptions = { cwd: dir };\n if (signal) opts.signal = signal;\n await runGit(['pull', '--ff-only'], opts);\n}\n\nexport async function gitCommit(\n dir: string,\n message: string,\n opts: { allowEmpty?: boolean; signal?: AbortSignal } = {},\n): Promise<{ committed: boolean }> {\n const status = await runGit(['status', '--porcelain'], { cwd: dir });\n if (status.trim().length === 0 && !opts.allowEmpty) {\n return { committed: false };\n }\n const addOpts: GitRunOptions = { cwd: dir };\n if (opts.signal) addOpts.signal = opts.signal;\n await runGit(['add', '-A'], addOpts);\n const args = ['commit', '-m', message];\n if (opts.allowEmpty) args.push('--allow-empty');\n const commitOpts: GitRunOptions = { cwd: dir };\n if (opts.signal) commitOpts.signal = opts.signal;\n await runGit(args, commitOpts);\n return { committed: true };\n}\n\nexport async function gitPush(dir: string, signal?: AbortSignal): Promise<void> {\n const opts: GitRunOptions = { cwd: dir };\n if (signal) opts.signal = signal;\n await runGit(['push'], opts);\n}\n\n/**\n * Compose a clone URL from project-level `git` config + repo name. Honors:\n * - explicit `url` (passthrough),\n * - `git.root_url` + `git.repo_prefix` + name,\n * - the conventional suffix `.git` on the URL.\n */\nexport interface UrlDeriveInput {\n rootUrl?: string | undefined;\n repoPrefix?: string | undefined;\n name: string;\n explicitUrl?: string | undefined;\n}\n\nexport function deriveCloneUrl(input: UrlDeriveInput): string {\n if (input.explicitUrl) return input.explicitUrl;\n if (!input.rootUrl) {\n throw new RuntimeFailure(\n `Cannot derive clone URL for '${input.name}': project manifest has no git.root_url and no explicit url is set.`,\n );\n }\n const prefix = input.repoPrefix ?? '';\n const base = input.rootUrl.endsWith('/') ? input.rootUrl.slice(0, -1) : input.rootUrl;\n const fullName = `${prefix}${input.name}`;\n return `${base}/${fullName}.git`;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { parseAllDocuments, type Document, type Node, type LineCounter } from 'yaml';\nimport { ManifestError } from '../util/exit-codes.js';\nimport type { ManifestKind, QavorManifest } from './types/index.js';\n\nexport interface SourcePosition {\n /** Absolute file path of the manifest. */\n file: string;\n /** 1-based line. */\n line: number;\n /** 1-based column. */\n column: number;\n}\n\nexport interface LoadedDocument {\n /** Absolute manifest file path. */\n file: string;\n /** 0-based document index inside a multi-doc YAML file. */\n docIndex: number;\n /** Parsed top-level kind (raw). May be undefined if the doc lacks `kind:`. */\n kind?: ManifestKind | string;\n /** Plain-JS document body. */\n data: Record<string, unknown>;\n /** Position helper bound to this document. */\n position: PositionResolver;\n}\n\n/**\n * Maps `/json/pointer/path` strings inside a loaded doc back to a file\n * position. Multi-doc YAML files are supported.\n */\nexport type PositionResolver = (jsonPath: string) => SourcePosition;\n\ninterface LoadOptions {\n /** Throw ManifestError on YAML parse errors. Default true. */\n throwOnParseError?: boolean;\n}\n\n/**\n * Read and parse a YAML manifest file. The file may contain multiple\n * `---`-separated documents; each becomes a LoadedDocument with its own\n * source-position resolver.\n */\nexport async function loadManifestFile(\n filePath: string,\n opts: LoadOptions = {},\n): Promise<LoadedDocument[]> {\n const absFile = path.resolve(filePath);\n let source: string;\n try {\n source = await fs.readFile(absFile, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new ManifestError(`Manifest file not found: ${absFile}`);\n }\n throw err;\n }\n\n const docs = parseAllDocuments(source, {\n keepSourceTokens: true,\n });\n\n // lineCounter for one document only (the YAML lib uses one per parse call,\n // but parseAllDocuments shares an internal counter; expose via .options).\n const out: LoadedDocument[] = [];\n let idx = 0;\n for (const doc of docs) {\n if (doc.errors.length && opts.throwOnParseError !== false) {\n const e = doc.errors[0]!;\n const pos = errorPosition(absFile, source, e);\n throw new ManifestError(\n `${pos.file}:${pos.line}:${pos.column}: YAML parse error: ${e.message}`,\n );\n }\n const data = (doc.toJS({ maxAliasCount: -1 }) ?? {}) as Record<string, unknown>;\n const kind = typeof data.kind === 'string' ? (data.kind as ManifestKind | string) : undefined;\n const position = makePositionResolver(absFile, source, doc);\n out.push({ file: absFile, docIndex: idx, kind, data, position });\n idx++;\n }\n return out;\n}\n\ninterface YamlError {\n pos?: [number, number];\n message: string;\n}\n\nfunction errorPosition(file: string, source: string, e: YamlError): SourcePosition {\n if (Array.isArray(e.pos) && typeof e.pos[0] === 'number') {\n const { line, col } = offsetToLineCol(source, e.pos[0]);\n return { file, line, column: col };\n }\n return { file, line: 1, column: 1 };\n}\n\nfunction offsetToLineCol(source: string, offset: number): { line: number; col: number } {\n let line = 1;\n let col = 1;\n for (let i = 0; i < offset && i < source.length; i++) {\n if (source[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\n/**\n * Build a resolver from JSON pointer paths to source positions for one doc.\n * The yaml library exposes node ranges via `getIn([...], true)`; we use\n * those ranges and convert offset → line/col with a one-time scan.\n */\nfunction makePositionResolver(\n file: string,\n source: string,\n doc: Document,\n): PositionResolver {\n return (jsonPath: string): SourcePosition => {\n const keys = parseJsonPointer(jsonPath);\n let node: Node | null | undefined;\n if (keys.length === 0) {\n node = doc.contents as Node | null;\n } else {\n node = doc.getIn(keys, true) as Node | null | undefined;\n if (!node) {\n // fall back to parents on the way up\n for (let i = keys.length - 1; i >= 0; i--) {\n const partial = keys.slice(0, i);\n const candidate = doc.getIn(partial, true) as Node | null | undefined;\n if (candidate) {\n node = candidate;\n break;\n }\n }\n }\n }\n const range = (node as Node | undefined)?.range;\n if (range && typeof range[0] === 'number') {\n const { line, col } = offsetToLineCol(source, range[0]);\n return { file, line, column: col };\n }\n return { file, line: 1, column: 1 };\n };\n}\n\n/**\n * Parse a JSON Pointer (RFC 6901) or Ajv-style instancePath into a key\n * array. Supports both `/repositories/0/name` and `.repositories[0].name`.\n */\nexport function parseJsonPointer(pointer: string): (string | number)[] {\n if (!pointer) return [];\n // Ajv emits instancePath like \"/repositories/0/name\"; strip a leading slash.\n const trimmed = pointer.startsWith('/') ? pointer.slice(1) : pointer;\n if (trimmed.length === 0) return [];\n return trimmed.split('/').map((segment) => {\n const decoded = segment.replace(/~1/g, '/').replace(/~0/g, '~');\n const asNumber = Number(decoded);\n return decoded !== '' && Number.isInteger(asNumber) && String(asNumber) === decoded\n ? asNumber\n : decoded;\n });\n}\n\n// re-export for tests\nexport type { LineCounter };\n","import Ajv2020, { type ErrorObject, type ValidateFunction } from 'ajv/dist/2020.js';\nimport addFormats from 'ajv-formats';\nimport defsSchema from '../schema/qavor.defs.schema.json' with { type: 'json' };\nimport workspacesSchema from '../schema/qavor.workspaces.schema.json' with { type: 'json' };\nimport projectSchema from '../schema/qavor.project.schema.json' with { type: 'json' };\nimport repoSchema from '../schema/qavor.repo.schema.json' with { type: 'json' };\nimport serviceSchema from '../schema/qavor.service.schema.json' with { type: 'json' };\nimport statefulSchema from '../schema/qavor.stateful.schema.json' with { type: 'json' };\nimport profileSchema from '../schema/qavor.profile.schema.json' with { type: 'json' };\nimport type { LoadedDocument } from './loader.js';\nimport type { ManifestKind } from './types/index.js';\n\nexport interface ValidationIssue {\n /** Absolute file. */\n file: string;\n line: number;\n column: number;\n /** kind from the manifest, or \"unknown\" if missing/invalid. */\n kind: string;\n /** JSON pointer-style path within the doc. */\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n issues: ValidationIssue[];\n}\n\nconst KIND_SCHEMA_IDS: Record<ManifestKind, string> = {\n workspaces: (workspacesSchema as { $id: string }).$id,\n project: (projectSchema as { $id: string }).$id,\n repo: (repoSchema as { $id: string }).$id,\n service: (serviceSchema as { $id: string }).$id,\n stateful: (statefulSchema as { $id: string }).$id,\n profile: (profileSchema as { $id: string }).$id,\n};\n\nconst ALL_KINDS: ManifestKind[] = [\n 'workspaces',\n 'project',\n 'repo',\n 'service',\n 'stateful',\n 'profile',\n];\n\nlet ajvSingleton: Ajv2020 | null = null;\nconst validatorCache = new Map<ManifestKind, ValidateFunction>();\n\nfunction getAjv(): Ajv2020 {\n if (ajvSingleton) return ajvSingleton;\n const ajv = new Ajv2020({\n allErrors: true,\n strict: false,\n allowUnionTypes: true,\n });\n addFormats(ajv);\n // Register shared defs first so per-kind schemas can resolve $refs.\n ajv.addSchema(defsSchema as object);\n ajv.addSchema(workspacesSchema as object);\n ajv.addSchema(projectSchema as object);\n ajv.addSchema(repoSchema as object);\n ajv.addSchema(serviceSchema as object);\n ajv.addSchema(statefulSchema as object);\n ajv.addSchema(profileSchema as object);\n ajvSingleton = ajv;\n return ajv;\n}\n\nfunction getValidator(kind: ManifestKind): ValidateFunction {\n const cached = validatorCache.get(kind);\n if (cached) return cached;\n const ajv = getAjv();\n const id = KIND_SCHEMA_IDS[kind];\n const fn = ajv.getSchema(id);\n if (!fn) throw new Error(`Internal: schema not registered for kind=${kind}`);\n validatorCache.set(kind, fn);\n return fn;\n}\n\nexport function isKnownKind(value: unknown): value is ManifestKind {\n return typeof value === 'string' && (ALL_KINDS as string[]).includes(value);\n}\n\n/**\n * Validate one loaded document against its kind-specific schema.\n */\nexport function validateDocument(doc: LoadedDocument): ValidationResult {\n const issues: ValidationIssue[] = [];\n if (!doc.kind) {\n const pos = doc.position('');\n issues.push({\n file: pos.file,\n line: pos.line,\n column: pos.column,\n kind: 'unknown',\n path: '',\n message: 'Missing top-level `kind:` field.',\n });\n return { ok: false, issues };\n }\n if (!isKnownKind(doc.kind)) {\n const pos = doc.position('/kind');\n issues.push({\n file: pos.file,\n line: pos.line,\n column: pos.column,\n kind: String(doc.kind),\n path: '/kind',\n message: `Unknown kind: ${doc.kind}. Expected one of: ${ALL_KINDS.join(', ')}`,\n });\n return { ok: false, issues };\n }\n const validator = getValidator(doc.kind);\n const valid = validator(doc.data);\n if (valid) return { ok: true, issues: [] };\n for (const err of validator.errors ?? []) {\n issues.push(formatAjvError(doc, err));\n }\n return { ok: false, issues };\n}\n\nfunction formatAjvError(doc: LoadedDocument, err: ErrorObject): ValidationIssue {\n const instancePath = err.instancePath ?? '';\n const pos = doc.position(instancePath);\n const where = instancePath || '<root>';\n let message = err.message ?? 'invalid';\n if (err.keyword === 'additionalProperties' && err.params && typeof (err.params as { additionalProperty?: string }).additionalProperty === 'string') {\n const extra = (err.params as { additionalProperty: string }).additionalProperty;\n message = `Unexpected property '${extra}'`;\n } else if (err.keyword === 'required' && err.params && typeof (err.params as { missingProperty?: string }).missingProperty === 'string') {\n const missing = (err.params as { missingProperty: string }).missingProperty;\n message = `Missing required property '${missing}'`;\n } else if (err.keyword === 'enum' && err.params && Array.isArray((err.params as { allowedValues?: unknown[] }).allowedValues)) {\n const allowed = (err.params as { allowedValues: unknown[] }).allowedValues;\n message = `${message}: ${allowed.map((v) => JSON.stringify(v)).join(', ')}`;\n } else if (err.keyword === 'pattern' && err.params && typeof (err.params as { pattern?: string }).pattern === 'string') {\n message = `Value does not match pattern /${(err.params as { pattern: string }).pattern}/`;\n }\n return {\n file: pos.file,\n line: pos.line,\n column: pos.column,\n kind: String(doc.kind ?? 'unknown'),\n path: where,\n message,\n };\n}\n\nexport function formatIssue(i: ValidationIssue): string {\n return `${i.file}:${i.line}:${i.column} [${i.kind}] ${i.path}: ${i.message}`;\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.defs.schema.json\",\n \"title\": \"qavor shared definitions\",\n \"description\": \"Shared $defs referenced by every kind-specific qavor manifest schema. Has no top-level shape of its own; consume via $ref to /$defs/<name>.\",\n \"type\": \"object\",\n \"$defs\": {\n \"name\": {\n \"type\": \"string\",\n \"pattern\": \"^[a-z0-9][a-z0-9._-]{0,62}$\",\n \"description\": \"Lowercase identifier. Letters, digits, dot, dash, underscore. 1-63 chars. Used as service/stateful/profile/repo/group identifiers.\"\n },\n \"envKey\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Z_][A-Z0-9_]*$\",\n \"description\": \"Conventional UPPER_SNAKE_CASE environment variable name.\"\n },\n \"envScalar\": {\n \"description\": \"Scalar value usable on the right-hand side of an env entry. Strings support ${VAR} and ${secret:NAME} interpolation.\",\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" },\n { \"type\": \"boolean\" }\n ]\n },\n \"envSpec\": {\n \"description\": \"Long-form env entry. Use when you need typing, validation, default vs override, secret marking, or documentation.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"value\": { \"$ref\": \"#/$defs/envScalar\" },\n \"default\": { \"$ref\": \"#/$defs/envScalar\" },\n \"required\": { \"type\": \"boolean\", \"default\": false },\n \"type\": { \"type\": \"string\", \"enum\": [\"string\", \"int\", \"number\", \"bool\", \"url\", \"duration\"] },\n \"pattern\": { \"type\": \"string\", \"format\": \"regex\" },\n \"secret\": { \"type\": \"boolean\", \"default\": false },\n \"description\": { \"type\": \"string\" }\n }\n },\n \"envMap\": {\n \"description\": \"Map of env names to scalar values or long-form envSpec entries.\",\n \"type\": \"object\",\n \"patternProperties\": {\n \"^[A-Z_][A-Z0-9_]*$\": {\n \"oneOf\": [\n { \"$ref\": \"#/$defs/envScalar\" },\n { \"$ref\": \"#/$defs/envSpec\" }\n ]\n }\n },\n \"additionalProperties\": false\n },\n \"envBlock\": {\n \"description\": \"Layered env block. `common` always applies; `native` or `docker` is layered on top depending on the active run mode. See the proposal section on Manifest Resolution Order for the full precedence chain.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"common\": { \"$ref\": \"#/$defs/envMap\" },\n \"native\": { \"$ref\": \"#/$defs/envMap\" },\n \"docker\": { \"$ref\": \"#/$defs/envMap\" }\n }\n },\n \"statefulEnvBlock\": {\n \"description\": \"Env block for a stateful service. Adds `publish`: env vars exposed to dependents at start time.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"common\": { \"$ref\": \"#/$defs/envMap\" },\n \"native\": { \"$ref\": \"#/$defs/envMap\" },\n \"docker\": { \"$ref\": \"#/$defs/envMap\" },\n \"publish\": { \"$ref\": \"#/$defs/envMap\" }\n }\n },\n \"runtimeStep\": {\n \"description\": \"Single shell step in a runtime block (check_installed, install, prepare, run).\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"cmd\"],\n \"properties\": {\n \"cmd\": { \"type\": \"string\", \"description\": \"Shell command. Multiline strings are treated as a script.\" },\n \"cwd\": { \"type\": \"string\", \"description\": \"Working directory relative to the manifest file.\" },\n \"env\": { \"$ref\": \"#/$defs/envMap\" },\n \"shell\":{ \"type\": \"string\", \"description\": \"Override shell. Defaults to `/bin/sh -c` (POSIX) or `cmd /C` on Windows.\" }\n }\n },\n \"runtimeBackend\": {\n \"description\": \"Runtime backend definition. Each of `check_installed`, `install`, `prepare`, `run` is optional but ordered: install runs only when check_installed fails; prepare runs before run.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"enabled\": { \"type\": \"boolean\", \"default\": false },\n \"check_installed\": { \"$ref\": \"#/$defs/runtimeStep\" },\n \"install\": { \"$ref\": \"#/$defs/runtimeStep\" },\n \"prepare\": { \"$ref\": \"#/$defs/runtimeStep\" },\n \"run\": { \"$ref\": \"#/$defs/runtimeStep\" }\n }\n },\n \"runtimeBlock\": {\n \"description\": \"Available runtime backends. A service or stateful manifest may declare any subset; the active backend is chosen by the resolved `mode`.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"native\": { \"$ref\": \"#/$defs/runtimeBackend\" },\n \"docker\": { \"$ref\": \"#/$defs/runtimeBackend\" },\n \"docker-compose\": { \"$ref\": \"#/$defs/runtimeBackend\" }\n }\n },\n \"mode\": {\n \"description\": \"Run mode. `docker-compose` is only valid for stateful manifests at v0.\",\n \"type\": \"string\",\n \"enum\": [\"native\", \"docker\", \"docker-compose\"]\n },\n \"profileRef\": {\n \"description\": \"Reference to a profile by name. Profiles are merged in declaration order; later entries win.\",\n \"$ref\": \"#/$defs/name\"\n },\n \"requirement\": {\n \"description\": \"A single dependency edge. Exactly one of `service`, `stateful`, or `group` must be set.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"service\": { \"type\": \"string\", \"description\": \"Service reference. `<service>` for same-workspace, `<repo>:<service>` permitted.\" },\n \"stateful\": { \"$ref\": \"#/$defs/name\" },\n \"group\": { \"$ref\": \"#/$defs/name\" },\n \"optional\": { \"type\": \"boolean\", \"default\": false },\n \"condition\": {\n \"type\": \"string\",\n \"description\": \"Optional gating expression. Examples: `mode == 'docker'`, `profile == 'dev'`, `os == 'darwin'`.\"\n },\n \"waitFor\": {\n \"type\": \"string\",\n \"enum\": [\"start\", \"ready\"],\n \"default\": \"ready\",\n \"description\": \"Whether to wait for process-up or for the readiness probe to pass before starting dependents.\"\n }\n },\n \"oneOf\": [\n { \"required\": [\"service\"] },\n { \"required\": [\"stateful\"] },\n { \"required\": [\"group\"] }\n ]\n },\n \"hookCommands\": {\n \"description\": \"One or more shell commands or paths to executable scripts, run in the manifest's directory.\",\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"array\", \"items\": { \"type\": \"string\" }, \"minItems\": 1 }\n ]\n },\n \"hooks\": {\n \"description\": \"Lifecycle hooks. Each hook list runs in the manifest's directory at the corresponding lifecycle event.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"pre_clone\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"post_clone\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"pre_prepare\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"post_prepare\":{ \"$ref\": \"#/$defs/hookCommands\" },\n \"pre_run\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"post_run\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"pre_stop\": { \"$ref\": \"#/$defs/hookCommands\" },\n \"post_stop\": { \"$ref\": \"#/$defs/hookCommands\" }\n }\n },\n \"schemaVersion\": {\n \"description\": \"Manifest schema version. Defaults to 1 if omitted.\",\n \"type\": \"integer\",\n \"enum\": [1]\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.workspaces.schema.json\",\n \"title\": \"qavor workspaces manifest\",\n \"description\": \"Workspace pointer file. Lives at the root of the workspace directory as `qavor.yaml` and is created automatically by `qavor init`. Its only job is to point at the project repo whose `kind: project` manifest enumerates the rest of the workspace.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"root_project_path\"],\n \"properties\": {\n \"kind\": { \"const\": \"workspaces\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"root_project_path\": {\n \"type\": \"string\",\n \"description\": \"Workspace-relative path to the directory containing the project repo's `qavor.yaml` (kind: project).\"\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.project.schema.json\",\n \"title\": \"qavor project manifest\",\n \"description\": \"Project-level manifest. Lives at the root of the project repo as `qavor.yaml`. Defines workspace identity and enumerates the repos that make up the workspace.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"name\", \"repositories\"],\n \"properties\": {\n \"kind\": { \"const\": \"project\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"name\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\",\n \"description\": \"Human-readable workspace name. Used as the compose project namespace and the on-disk workspace identifier.\"\n },\n \"description\": { \"type\": \"string\" },\n \"git\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"root_url\": {\n \"type\": \"string\",\n \"description\": \"Base git URL for repos in this project. Combined with `repo_prefix` and a repo `name` to derive the clone URL when no explicit `url` is given.\"\n },\n \"repo_prefix\": {\n \"type\": \"string\",\n \"description\": \"Optional prefix prepended to repo names when deriving clone URLs.\"\n },\n \"default_branch\": {\n \"type\": \"string\",\n \"default\": \"main\",\n \"description\": \"Default branch used when a repo entry does not pin its own.\"\n },\n \"remote\": {\n \"type\": \"string\",\n \"enum\": [\"ssh\", \"https\"],\n \"description\": \"Hint for clone URL form when `root_url` is a host instead of a full URL.\"\n },\n \"shallow\": { \"type\": \"boolean\", \"default\": false },\n \"submodules\": { \"type\": \"boolean\", \"default\": false }\n }\n },\n \"groups\": {\n \"description\": \"Named groups of repo names. A repo may appear in multiple groups. Repos can also self-declare additional group memberships in their own `kind: repo` or service/stateful manifests.\",\n \"type\": \"object\",\n \"patternProperties\": {\n \"^[a-z0-9][a-z0-9._-]{0,62}$\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"uniqueItems\": true,\n \"minItems\": 1\n }\n },\n \"additionalProperties\": false\n },\n \"repositories\": {\n \"description\": \"Repos that compose the workspace. Each entry is either a bare name (URL derived from `git.root_url` + `git.repo_prefix` + name) or an object with explicit fields.\",\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"oneOf\": [\n { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n { \"$ref\": \"#/$defs/repoEntry\" }\n ]\n }\n }\n },\n \"$defs\": {\n \"repoEntry\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"name\"],\n \"properties\": {\n \"name\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"url\": {\n \"type\": \"string\",\n \"description\": \"Explicit git URL. Overrides URL derivation from `git.root_url` + `git.repo_prefix`.\"\n },\n \"branch\": { \"type\": \"string\" },\n \"tag\": { \"type\": \"string\" },\n \"commit\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{7,40}$\"\n },\n \"path\": {\n \"type\": \"string\",\n \"description\": \"Workspace-relative clone path. Defaults to `./<name>` (or `./<name>.git` to match the conventional layout).\"\n },\n \"groups\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"uniqueItems\": true,\n \"description\": \"Inline group memberships in addition to the top-level `groups` map.\"\n },\n \"shallow\": { \"type\": \"boolean\" },\n \"submodules\": { \"type\": \"boolean\" },\n \"optional\": {\n \"type\": \"boolean\",\n \"default\": false,\n \"description\": \"Skip rather than fail if cloning is not authorized.\"\n }\n },\n \"allOf\": [\n {\n \"description\": \"At most one of branch, tag, or commit may be set.\",\n \"not\": {\n \"anyOf\": [\n { \"required\": [\"branch\", \"tag\"] },\n { \"required\": [\"branch\", \"commit\"] },\n { \"required\": [\"tag\", \"commit\"] }\n ]\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.repo.schema.json\",\n \"title\": \"qavor repo manifest\",\n \"description\": \"Per-repo metadata. Lives at the root of an individual repo as `qavor.yaml` (or as one document of a multi-document `qavor.yaml`). Carries information that is not specific to a single service: identity, group membership, and lifecycle hooks that fire around qavor verbs at the repo level.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"name\"],\n \"properties\": {\n \"kind\": { \"const\": \"repo\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"name\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\",\n \"description\": \"Repository identifier. Must match the `name` used in the project manifest's `repositories` list.\"\n },\n \"description\": { \"type\": \"string\" },\n \"groups\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"uniqueItems\": true,\n \"description\": \"Additional group memberships, layered on top of any groups assigned by the project manifest.\"\n },\n \"hooks\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/hooks\" }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.service.schema.json\",\n \"title\": \"qavor service manifest\",\n \"description\": \"Runnable application. Lives at the root of a single-service repo as `qavor.yaml`, or under a sub-directory of a multi-service repo (e.g. `service-foo/qavor.yaml`). When this manifest is at the root of a repo, its `groups` also define repo-level group membership.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"name\"],\n \"properties\": {\n \"kind\": { \"const\": \"service\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"name\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\",\n \"description\": \"Service identifier. Must be unique within the workspace; cross-repo references use this name.\"\n },\n \"description\": { \"type\": \"string\" },\n \"groups\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"uniqueItems\": true,\n \"description\": \"Additional group memberships. When this manifest is at the root of a repo, these also define repo group membership.\"\n },\n \"profiles\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/profileRef\" },\n \"uniqueItems\": true,\n \"description\": \"Profiles applied to this service in declaration order. Profile values are layered first; this manifest's own `runtime` and `env` are merged on top.\"\n },\n \"runtime\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/runtimeBlock\",\n \"description\": \"Available runtime backends. Services typically declare `native` and/or `docker`. `docker-compose` is reserved for stateful manifests at v0.\"\n },\n \"mode\": {\n \"description\": \"Default run mode for this service. Overridable per invocation via `--mode`. Must match a backend whose `enabled: true` is set on this service or one of its profiles.\",\n \"type\": \"string\",\n \"enum\": [\"native\", \"docker\"]\n },\n \"require\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/requirement\" },\n \"description\": \"Dependencies that must be running before this service starts.\"\n },\n \"env\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/envBlock\" },\n \"hooks\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/hooks\" }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.stateful.schema.json\",\n \"title\": \"qavor stateful service manifest\",\n \"description\": \"Externally provided stateful service (postgres, kafka, redis, ...). Lives at the root of a stateful-dep repo as `qavor.yaml`, or under a sub-directory of a deps repo (e.g. `postgresql/qavor.yaml`). At v0 stateful services run via `docker-compose` and qavor owns the generated compose project (per ADR-005).\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"name\"],\n \"properties\": {\n \"kind\": { \"const\": \"stateful\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"name\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\",\n \"description\": \"Stateful service identifier. Must be unique within the workspace.\"\n },\n \"description\": { \"type\": \"string\" },\n \"groups\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\" },\n \"uniqueItems\": true,\n \"description\": \"Additional group memberships. When this manifest is at the root of a repo, these also define repo group membership.\"\n },\n \"profiles\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/profileRef\" },\n \"uniqueItems\": true\n },\n \"runtime\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/runtimeBlock\",\n \"description\": \"Available runtime backends. v0 stateful services delegate to `docker-compose`; `native` and `docker` are reserved for future use.\"\n },\n \"mode\": {\n \"description\": \"Default run mode. v0 stateful services should use `docker-compose`.\",\n \"type\": \"string\",\n \"enum\": [\"docker-compose\", \"native\", \"docker\"],\n \"default\": \"docker-compose\"\n },\n \"require\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/requirement\" }\n },\n \"env\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/statefulEnvBlock\",\n \"description\": \"Layered env block. `publish` is the explicit contract exposed to dependents at start time; values are interpolated against the resolved env of this stateful service.\"\n },\n \"hooks\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/hooks\" }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://qavor.dev/schemas/qavor.profile.schema.json\",\n \"title\": \"qavor profile manifest\",\n \"description\": \"Reusable runtime + env bundle. Referenced by services and stateful manifests via the `profiles:` list. Profiles can themselves reference other profiles; resolution flattens the chain in declaration order with later entries winning. A profile's runtime/env layer below the referencing manifest's own runtime/env.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"kind\", \"name\"],\n \"properties\": {\n \"kind\": { \"const\": \"profile\" },\n \"schemaVersion\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/schemaVersion\" },\n \"name\": {\n \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/name\",\n \"description\": \"Profile identifier. Referenced from `profiles:` lists and from CLI flags.\"\n },\n \"description\": { \"type\": \"string\" },\n \"profiles\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/profileRef\" },\n \"uniqueItems\": true,\n \"description\": \"Other profiles this one extends. Resolved in declaration order before this profile's own values are applied.\"\n },\n \"runtime\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/runtimeBlock\" },\n \"mode\": {\n \"type\": \"string\",\n \"enum\": [\"native\", \"docker\", \"docker-compose\"]\n },\n \"env\": { \"$ref\": \"https://qavor.dev/schemas/qavor.defs.schema.json#/$defs/envBlock\" }\n }\n}\n","import path from 'node:path';\n\nexport interface WorkspacePaths {\n /** Absolute path to the workspace root (contains the kind: workspaces file). */\n root: string;\n /** Absolute path of the workspace pointer file. */\n workspacesFile: string;\n /** .qavor/ directory under the workspace root. */\n stateRoot: string;\n /** .qavor/state */\n stateDir: string;\n /** .qavor/logs */\n logsDir: string;\n /** .qavor/compose */\n composeDir: string;\n /** .qavor/cache */\n cacheDir: string;\n /** .qavor/workspace.json */\n workspaceMetaFile: string;\n /** .qavor/.gitignore */\n stateGitignore: string;\n}\n\nexport function workspacePaths(root: string): WorkspacePaths {\n const abs = path.resolve(root);\n const stateRoot = path.join(abs, '.qavor');\n return {\n root: abs,\n workspacesFile: path.join(abs, 'qavor.yaml'),\n stateRoot,\n stateDir: path.join(stateRoot, 'state'),\n logsDir: path.join(stateRoot, 'logs'),\n composeDir: path.join(stateRoot, 'compose'),\n cacheDir: path.join(stateRoot, 'cache'),\n workspaceMetaFile: path.join(stateRoot, 'workspace.json'),\n stateGitignore: path.join(stateRoot, '.gitignore'),\n };\n}\n","import type { Command } from 'commander';\n\n/**\n * Shared shape of root-level CLI options resolved at every command.\n */\nexport interface RootOptions {\n json: boolean;\n verbose: boolean;\n jobs: number | undefined;\n /** Path override for the workspace pointer file. */\n config: string | undefined;\n}\n\nexport function rootOptions(cmd: Command): RootOptions {\n const opts = cmd.opts();\n return {\n json: Boolean(opts.json),\n verbose: Boolean(opts.verbose),\n jobs: typeof opts.jobs === 'string' ? Number.parseInt(opts.jobs, 10) : undefined,\n config: typeof opts.config === 'string' ? opts.config : undefined,\n };\n}\n\n/**\n * Walk up to root program to extract effective root options. Subcommands\n * receive their own options object via commander; we ascend to the program\n * to pick up `--json`, `--verbose`, `--jobs`.\n */\nexport function inheritRootOptions(cmd: Command): RootOptions {\n let current: Command | null = cmd;\n while (current && current.parent) current = current.parent;\n if (!current) return { json: false, verbose: false, jobs: undefined, config: undefined };\n return rootOptions(current);\n}\n","import type { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { resolveWorkspace, readProjectManifest } from '../../workspace/locate.js';\nimport { emit, emitJson } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { readJsonFile } from '../../util/fs.js';\n\nexport function registerWorkspace(program: Command): void {\n const ws = program.command('workspace').description('Workspace operations.');\n ws.command('info')\n .description('Show information about the workspace at or above the cwd.')\n .action(async (_opts: unknown, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const resolved = await resolveWorkspace();\n const project = await readProjectManifest(resolved.projectManifestFile);\n let meta: Record<string, unknown> = {};\n try {\n meta = await readJsonFile(resolved.paths.workspaceMetaFile);\n } catch {\n /* missing meta is fine */\n }\n const info = {\n workspace_root: resolved.paths.root,\n workspaces_file: resolved.paths.workspacesFile,\n project_repo_path: resolved.projectRepoPath,\n project_manifest_file: resolved.projectManifestFile,\n project_name: typeof project.data.name === 'string' ? project.data.name : null,\n state_dir: resolved.paths.stateRoot,\n meta,\n };\n if (root.json) {\n emitJson(info);\n return;\n }\n emit(`Workspace root: ${info.workspace_root}`);\n emit(`Workspaces manifest: ${path.relative(info.workspace_root, info.workspaces_file)}`);\n emit(`Project repo path: ${path.relative(info.workspace_root, info.project_repo_path)}`);\n emit(`Project manifest: ${path.relative(info.workspace_root, info.project_manifest_file)}`);\n emit(`Project name: ${info.project_name ?? '<unknown>'}`);\n emit(`State directory: ${path.relative(info.workspace_root, info.state_dir)}`);\n if (Object.keys(meta).length > 0) {\n emit('Workspace meta:');\n for (const [k, v] of Object.entries(meta)) emit(` ${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`);\n }\n // Touch fs so tests using stat the meta file exit cleanly.\n try {\n await fs.access(resolved.paths.workspaceMetaFile);\n } catch {\n /* ignore */\n }\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { isFile } from '../util/fs.js';\nimport { workspacePaths, type WorkspacePaths } from './paths.js';\nimport { loadManifestFile } from '../manifest/loader.js';\nimport { UserError } from '../util/exit-codes.js';\n\nexport interface ResolvedWorkspace {\n paths: WorkspacePaths;\n /** Absolute path to the project repo containing the kind: project manifest. */\n projectRepoPath: string;\n /** Path to project manifest file (absolute). */\n projectManifestFile: string;\n}\n\n/**\n * Walk up from `start` looking for a qavor.yaml whose top-level doc is\n * `kind: workspaces`. Returns null if nothing is found before the filesystem\n * root.\n */\nexport async function findWorkspaceRoot(start: string): Promise<string | null> {\n let cur = path.resolve(start);\n // Walk up\n // Add a hard cap to avoid pathological symlink loops.\n for (let i = 0; i < 64; i++) {\n const candidate = path.join(cur, 'qavor.yaml');\n if (await isFile(candidate)) {\n try {\n const docs = await loadManifestFile(candidate, { throwOnParseError: false });\n if (docs.some((d) => d.kind === 'workspaces')) return cur;\n } catch {\n // not a workspaces manifest; keep walking up\n }\n }\n const parent = path.dirname(cur);\n if (parent === cur) return null;\n cur = parent;\n }\n return null;\n}\n\n/**\n * Resolve and load the workspace pointer for the given starting directory.\n * Throws UserError when no workspace is found.\n */\nexport async function resolveWorkspace(start: string = process.cwd()): Promise<ResolvedWorkspace> {\n const root = await findWorkspaceRoot(start);\n if (!root) {\n throw new UserError(\n `No qavor workspace found searching upward from ${start}. Run \\`qavor init <project-repo-source>\\` first.`,\n );\n }\n const paths = workspacePaths(root);\n const docs = await loadManifestFile(paths.workspacesFile);\n const workspaceDoc = docs.find((d) => d.kind === 'workspaces');\n if (!workspaceDoc) {\n throw new UserError(`Workspace pointer at ${paths.workspacesFile} has no \\`kind: workspaces\\` document.`);\n }\n const rootProjectPath = (workspaceDoc.data as { root_project_path?: unknown }).root_project_path;\n if (typeof rootProjectPath !== 'string' || rootProjectPath.length === 0) {\n throw new UserError(\n `Workspace pointer at ${paths.workspacesFile} is missing \\`root_project_path\\`.`,\n );\n }\n const projectRepoPath = path.isAbsolute(rootProjectPath)\n ? rootProjectPath\n : path.resolve(paths.root, rootProjectPath);\n const projectManifestFile = path.join(projectRepoPath, 'qavor.yaml');\n return { paths, projectRepoPath, projectManifestFile };\n}\n\nexport async function readProjectManifest(projectManifestFile: string): Promise<{\n data: Record<string, unknown>;\n}> {\n const docs = await loadManifestFile(projectManifestFile);\n const project = docs.find((d) => d.kind === 'project');\n if (!project) {\n throw new UserError(`No \\`kind: project\\` document found in ${projectManifestFile}.`);\n }\n return { data: project.data };\n}\n\n/** Ensure a directory + file are present. Useful in startup paths. */\nexport async function ensureWorkspaceDirs(paths: WorkspacePaths): Promise<void> {\n await fs.mkdir(paths.stateRoot, { recursive: true });\n await fs.mkdir(paths.stateDir, { recursive: true });\n await fs.mkdir(paths.logsDir, { recursive: true });\n await fs.mkdir(paths.composeDir, { recursive: true });\n await fs.mkdir(paths.cacheDir, { recursive: true });\n}\n","import type { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport pMap from 'p-map';\nimport { isDirectory, isFile } from '../../util/fs.js';\nimport { loadManifestFile } from '../../manifest/loader.js';\nimport { validateDocument, formatIssue, type ValidationIssue } from '../../manifest/validator.js';\nimport { emit, emitJson, getLogger } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { ManifestError, UserError } from '../../util/exit-codes.js';\nimport { resolveJobs } from '../../util/concurrency.js';\n\nexport function registerValidate(program: Command): void {\n program\n .command('validate')\n .description('Validate one or more qavor manifest files. Targets a file or a directory.')\n .argument('<path>', 'Path to a qavor.yaml file, a directory containing one, or a directory of multiple manifests.')\n .action(async (target: string, _opts: unknown, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const abs = path.resolve(target);\n const files: string[] = [];\n if (await isFile(abs)) {\n files.push(abs);\n } else if (await isDirectory(abs)) {\n const direct = path.join(abs, 'qavor.yaml');\n if (await isFile(direct)) files.push(direct);\n // Also scan one level deep into qavor/ if present.\n try {\n const entries = await fs.readdir(abs, { withFileTypes: true });\n for (const e of entries) {\n if (e.isDirectory()) {\n const child = path.join(abs, e.name, 'qavor.yaml');\n if (await isFile(child)) files.push(child);\n }\n if (e.isFile() && e.name === 'qavor.yaml') {\n // already added if direct\n }\n }\n } catch {\n /* ignore */\n }\n } else {\n throw new UserError(`Path not found: ${abs}`);\n }\n if (files.length === 0) throw new UserError(`No qavor.yaml files found under ${abs}.`);\n\n const jobs = resolveJobs(root.jobs);\n const issues: ValidationIssue[] = [];\n await pMap(\n files,\n async (file) => {\n try {\n const docs = await loadManifestFile(file);\n for (const d of docs) {\n const r = validateDocument(d);\n if (!r.ok) issues.push(...r.issues);\n }\n } catch (err) {\n issues.push({\n file,\n line: 1,\n column: 1,\n kind: 'unknown',\n path: '',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n },\n { concurrency: jobs },\n );\n\n if (root.json) {\n emitJson({ ok: issues.length === 0, files: files.length, issues });\n } else {\n if (issues.length === 0) {\n emit(`OK — ${files.length} file(s) validated.`);\n } else {\n emit(`FAILED — ${issues.length} issue(s) across ${files.length} file(s):`);\n for (const i of issues) emit(` ${formatIssue(i)}`);\n }\n }\n if (issues.length > 0) {\n logger.debug({ count: issues.length }, 'validation failed');\n throw new ManifestError(`Validation failed with ${issues.length} issue(s).`);\n }\n });\n}\n","import os from 'node:os';\nimport pLimit from 'p-limit';\n\n/**\n * Resolve the effective concurrency for a fan-out operation. Defaults to\n * `os.availableParallelism()` (Node 19+); falls back to `os.cpus().length`.\n * Callers may override globally via `--jobs N`.\n */\nexport function resolveJobs(override?: number): number {\n if (typeof override === 'number' && Number.isFinite(override) && override >= 1) {\n return Math.floor(override);\n }\n const avail = typeof os.availableParallelism === 'function'\n ? os.availableParallelism()\n : os.cpus().length;\n return Math.max(1, avail);\n}\n\nexport function makeLimiter(jobs: number): <T>(fn: () => Promise<T>) => Promise<T> {\n return pLimit(jobs);\n}\n","import type { Command } from 'commander';\nimport path from 'node:path';\nimport pMap from 'p-map';\nimport { resolveWorkspace } from '../../workspace/locate.js';\nimport { readProjectManifest } from '../../workspace/locate.js';\nimport { resolveRepos, type ResolvedRepo } from '../../workspace/repos.js';\nimport { selectRepos, reposPresent } from '../repos.js';\nimport {\n gitClone,\n gitFetch,\n gitPullFastForward,\n gitCommit,\n gitPush,\n isGitRepo,\n readRepoStatus,\n} from '../../git/git.js';\nimport { emit, emitJson, getLogger } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { resolveJobs } from '../../util/concurrency.js';\nimport { UserError, RuntimeFailure } from '../../util/exit-codes.js';\nimport type { ProjectManifest } from '../../manifest/types/index.js';\n\nasync function loadProjectRepos(): Promise<{ workspaceRoot: string; repos: ResolvedRepo[] }> {\n const ws = await resolveWorkspace();\n const project = await readProjectManifest(ws.projectManifestFile);\n const repos = resolveRepos({\n workspaceRoot: ws.paths.root,\n project: project.data as unknown as ProjectManifest,\n projectRepoPath: ws.projectRepoPath,\n });\n return { workspaceRoot: ws.paths.root, repos };\n}\n\nfunction repoOption(c: Command): Command {\n return c.option('--repo <name...>', 'Operate on a subset of repos by name.');\n}\n\nexport function registerGitCommands(program: Command): void {\n repoOption(\n program\n .command('clone')\n .description('Clone every repo enumerated in the project manifest.'),\n ).action(async (opts: { repo?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const { workspaceRoot, repos } = await loadProjectRepos();\n const selected = selectRepos(repos, opts.repo);\n const jobs = resolveJobs(root.jobs);\n\n const results: { repo: string; status: 'cloned' | 'present' | 'skipped' | 'failed'; message?: string }[] = [];\n await pMap(\n selected,\n async (r) => {\n if (r.isProjectRepo) {\n results.push({ repo: r.name, status: 'present', message: 'project repo (already cloned)' });\n return;\n }\n if (await isGitRepo(r.dir)) {\n results.push({ repo: r.name, status: 'present' });\n return;\n }\n try {\n logger.info({ repo: r.name, url: r.url, dir: r.dir }, 'clone: starting');\n await gitClone({\n url: r.url,\n dest: r.dir,\n branch: r.branch,\n tag: r.tag,\n commit: r.commit,\n shallow: r.shallow,\n submodules: r.submodules,\n });\n results.push({ repo: r.name, status: 'cloned' });\n } catch (err) {\n if (r.optional) {\n results.push({ repo: r.name, status: 'skipped', message: 'optional; clone failed' });\n } else {\n throw new RuntimeFailure(\n `Clone failed for ${r.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n },\n { concurrency: jobs },\n );\n\n if (root.json) {\n emitJson({ workspace: workspaceRoot, results });\n return;\n }\n for (const r of results) {\n emit(`${r.status.padEnd(8)} ${r.repo}${r.message ? ' — ' + r.message : ''}`);\n }\n });\n\n repoOption(\n program\n .command('sync')\n .description('Run `git fetch && git pull --ff-only` across selected repos.'),\n ).action(async (opts: { repo?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const { repos } = await loadProjectRepos();\n const selected = await reposPresent(selectRepos(repos, opts.repo));\n const jobs = resolveJobs(root.jobs);\n const results: { repo: string; ok: boolean; error?: string }[] = [];\n await pMap(\n selected,\n async (r) => {\n try {\n await gitFetch(r.dir);\n await gitPullFastForward(r.dir);\n results.push({ repo: r.name, ok: true });\n } catch (err) {\n results.push({ repo: r.name, ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n { concurrency: jobs },\n );\n if (root.json) {\n emitJson({ results });\n return;\n }\n for (const r of results) emit(`${r.ok ? 'ok ' : 'fail'} ${r.repo}${r.error ? ' — ' + r.error : ''}`);\n if (results.some((r) => !r.ok)) throw new RuntimeFailure('Some repos failed to sync.');\n });\n\n repoOption(\n program\n .command('status')\n .description('Aggregated repo status across selected repos.'),\n ).action(async (opts: { repo?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const { workspaceRoot, repos } = await loadProjectRepos();\n const selected = await reposPresent(selectRepos(repos, opts.repo));\n const jobs = resolveJobs(root.jobs);\n type Row = {\n repo: string;\n branch: string | null;\n ahead: number;\n behind: number;\n dirty: number;\n last_commit: string | null;\n last_commit_subject: string | null;\n };\n const rows = await pMap(\n selected,\n async (r): Promise<Row> => {\n const s = await readRepoStatus(r.dir);\n return {\n repo: r.name,\n branch: s.branch,\n ahead: s.ahead,\n behind: s.behind,\n dirty: s.dirtyCount,\n last_commit: s.lastCommit,\n last_commit_subject: s.lastCommitSubject,\n };\n },\n { concurrency: jobs },\n );\n if (root.json) {\n emitJson({ workspace: workspaceRoot, repos: rows });\n return;\n }\n // simple table\n const headers = ['REPO', 'BRANCH', 'AHEAD', 'BEHIND', 'DIRTY', 'COMMIT', 'SUBJECT'];\n const data = rows.map((r) => [\n r.repo,\n r.branch ?? '-',\n String(r.ahead),\n String(r.behind),\n String(r.dirty),\n r.last_commit ?? '-',\n (r.last_commit_subject ?? '').split('\\n')[0]?.slice(0, 60) ?? '',\n ]);\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...data.map((row) => (row[i] ?? '').length)),\n );\n const fmt = (row: string[]): string => row.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' ');\n emit(fmt(headers));\n for (const row of data) emit(fmt(row));\n });\n\n repoOption(\n program\n .command('commit')\n .description('Commit pending changes across selected repos.')\n .requiredOption('-m, --message <msg>', 'Commit message.')\n .option('--allow-empty', 'Allow empty commits.'),\n ).action(\n async (opts: { repo?: string[]; message: string; allowEmpty?: boolean }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n if (!opts.message || opts.message.trim().length === 0) {\n throw new UserError(`Commit message must not be empty.`);\n }\n const { repos } = await loadProjectRepos();\n const selected = await reposPresent(selectRepos(repos, opts.repo));\n const jobs = resolveJobs(root.jobs);\n const results: { repo: string; committed: boolean; error?: string }[] = [];\n await pMap(\n selected,\n async (r) => {\n try {\n const res = await gitCommit(r.dir, opts.message, { allowEmpty: Boolean(opts.allowEmpty) });\n results.push({ repo: r.name, committed: res.committed });\n } catch (err) {\n results.push({ repo: r.name, committed: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n { concurrency: jobs },\n );\n if (root.json) {\n emitJson({ results });\n return;\n }\n for (const r of results) {\n const verb = r.committed ? 'committed' : r.error ? 'failed' : 'skipped';\n emit(`${verb.padEnd(10)} ${r.repo}${r.error ? ' — ' + r.error : ''}`);\n }\n if (results.some((r) => r.error)) throw new RuntimeFailure('Some commits failed.');\n },\n );\n\n repoOption(\n program\n .command('push')\n .description('git push the current branch across selected repos.'),\n ).action(async (opts: { repo?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const { repos } = await loadProjectRepos();\n const selected = await reposPresent(selectRepos(repos, opts.repo));\n const jobs = resolveJobs(root.jobs);\n const results: { repo: string; ok: boolean; error?: string }[] = [];\n await pMap(\n selected,\n async (r) => {\n try {\n await gitPush(r.dir);\n results.push({ repo: r.name, ok: true });\n } catch (err) {\n results.push({ repo: r.name, ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n { concurrency: jobs },\n );\n if (root.json) {\n emitJson({ results });\n return;\n }\n for (const r of results) emit(`${r.ok ? 'ok ' : 'fail'} ${r.repo}${r.error ? ' — ' + r.error : ''}`);\n if (results.some((r) => !r.ok)) throw new RuntimeFailure('Some pushes failed.');\n });\n\n // ensure `path` import used\n void path;\n}\n","import path from 'node:path';\nimport type { ProjectManifest, ProjectRepoEntry } from '../manifest/types/index.js';\nimport { deriveCloneUrl } from '../git/git.js';\nimport { ManifestError } from '../util/exit-codes.js';\n\nexport interface ResolvedRepo {\n name: string;\n url: string;\n dir: string;\n branch: string | undefined;\n tag: string | undefined;\n commit: string | undefined;\n shallow: boolean | undefined;\n submodules: boolean | undefined;\n optional: boolean;\n /** True if this repo is the project repo itself. */\n isProjectRepo: boolean;\n}\n\ninterface ResolveOpts {\n /** Absolute workspace root. */\n workspaceRoot: string;\n /** The project manifest body. */\n project: ProjectManifest;\n /** Absolute path to the project repo directory. */\n projectRepoPath: string;\n}\n\n/**\n * Resolve every repo entry in a project manifest to a concrete clone target.\n * Skips the project repo (caller already has it).\n */\nexport function resolveRepos(opts: ResolveOpts): ResolvedRepo[] {\n const list = opts.project.repositories;\n const repos: ResolvedRepo[] = [];\n const seen = new Set<string>();\n for (const entry of list) {\n const normalized = typeof entry === 'string' ? { name: entry } as ProjectRepoEntry : entry;\n const name = normalized.name;\n if (!name) throw new ManifestError(`Project repository entry is missing a name.`);\n if (seen.has(name)) {\n throw new ManifestError(`Duplicate repository name in project manifest: '${name}'.`);\n }\n seen.add(name);\n\n const dir = normalized.path\n ? path.isAbsolute(normalized.path)\n ? normalized.path\n : path.resolve(opts.workspaceRoot, normalized.path)\n : path.join(opts.workspaceRoot, `${name}.git`);\n\n const url = deriveCloneUrl({\n explicitUrl: normalized.url,\n rootUrl: opts.project.git?.root_url,\n repoPrefix: opts.project.git?.repo_prefix,\n name,\n });\n\n repos.push({\n name,\n url,\n dir,\n branch: normalized.branch ?? opts.project.git?.default_branch,\n tag: normalized.tag,\n commit: normalized.commit,\n shallow: normalized.shallow ?? opts.project.git?.shallow,\n submodules: normalized.submodules ?? opts.project.git?.submodules,\n optional: Boolean(normalized.optional),\n isProjectRepo: path.resolve(dir) === path.resolve(opts.projectRepoPath),\n });\n }\n return repos;\n}\n","import { isDirectory } from '../util/fs.js';\nimport type { ResolvedRepo } from '../workspace/repos.js';\n\n/**\n * Filter resolved repos by the `--repo` CLI selector. Empty selector means\n * \"all repos\". Throws when a name is given that isn't in the project.\n */\nexport function selectRepos(all: ResolvedRepo[], selector?: string[]): ResolvedRepo[] {\n if (!selector || selector.length === 0) return all;\n const set = new Set(selector);\n const out: ResolvedRepo[] = [];\n for (const r of all) {\n if (set.has(r.name)) {\n out.push(r);\n set.delete(r.name);\n }\n }\n if (set.size > 0) {\n throw new Error(\n `Unknown repo${set.size > 1 ? 's' : ''}: ${[...set].join(', ')}`,\n );\n }\n return out;\n}\n\nexport async function reposPresent(repos: ResolvedRepo[]): Promise<ResolvedRepo[]> {\n const out: ResolvedRepo[] = [];\n for (const r of repos) {\n if (await isDirectory(r.dir)) out.push(r);\n }\n return out;\n}\n","import type { Command } from 'commander';\nimport pMap from 'p-map';\nimport { resolveWorkspace, readProjectManifest } from '../../workspace/locate.js';\nimport { resolveRepos } from '../../workspace/repos.js';\nimport { buildWorkspaceRegistry } from '../../manifest/discovery.js';\nimport { emit, emitJson, getLogger } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { resolveJobs } from '../../util/concurrency.js';\nimport { prepareService } from '../../prepare/prepare.js';\nimport { selectRepos } from '../repos.js';\nimport { parseCliEnv } from '../../env/composer.js';\nimport type {\n LoadedDocument,\n} from '../../manifest/loader.js';\nimport { loadManifestFile } from '../../manifest/loader.js';\nimport type { ProjectManifest, ServiceManifest } from '../../manifest/types/index.js';\nimport { UserError } from '../../util/exit-codes.js';\n\nexport function registerPrepare(program: Command): void {\n program\n .command('prepare')\n .description('Run `runtime.native.prepare` for every selected service (lockfile-aware skip).')\n .option('--repo <name...>', 'Limit to services in the given repo(s).')\n .option('--service <name...>', 'Limit to specific service names.')\n .option('--force', 'Re-run prepare even when the lockfile hash matches the cache.')\n .option('--env <kv...>', 'Override env values, KEY=VAL.')\n .action(\n async (\n opts: { repo?: string[]; service?: string[]; force?: boolean; env?: string[] },\n cmd: Command,\n ) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const ws = await resolveWorkspace();\n const projectDoc = await readProjectManifest(ws.projectManifestFile);\n const allRepos = resolveRepos({\n workspaceRoot: ws.paths.root,\n project: projectDoc.data as unknown as ProjectManifest,\n projectRepoPath: ws.projectRepoPath,\n });\n const selectedRepos = selectRepos(allRepos, opts.repo);\n const repoMap = new Map(selectedRepos.map((r) => [r.name, r.dir]));\n if (!opts.repo) repoMap.set('__project__', ws.projectRepoPath);\n\n const registry = await buildWorkspaceRegistry({\n workspaceRoot: ws.paths.root,\n repos: repoMap,\n concurrency: resolveJobs(root.jobs),\n });\n\n for (const issue of registry.issues) {\n logger.warn(\n { file: issue.file, line: issue.line, message: issue.message },\n 'manifest issue',\n );\n }\n\n let services = registry.entries.filter((e) => e.kind === 'service');\n if (opts.service && opts.service.length > 0) {\n const set = new Set(opts.service);\n services = services.filter((s) => set.has(s.name));\n const missing = [...set].filter((n) => !services.some((s) => s.name === n));\n if (missing.length > 0) {\n throw new UserError(`Unknown service(s): ${missing.join(', ')}`);\n }\n }\n\n const cliEnv = opts.env ? parseCliEnv(opts.env) : undefined;\n const jobs = resolveJobs(root.jobs);\n\n const results = await pMap(\n services,\n async (entry) => {\n const docs = await loadManifestFile(entry.file);\n const serviceDoc = docs[entry.docIndex] as LoadedDocument;\n const service = entry.data as unknown as ServiceManifest;\n const prepareOpts: Parameters<typeof prepareService>[0] = {\n paths: ws.paths,\n serviceDoc,\n service,\n force: Boolean(opts.force),\n logger,\n };\n if (cliEnv) prepareOpts.cliEnv = cliEnv;\n return prepareService(prepareOpts);\n },\n { concurrency: jobs },\n );\n\n if (root.json) {\n emitJson({ results });\n return;\n }\n for (const r of results) {\n emit(`${r.status.padEnd(15)} ${r.serviceName}`);\n }\n },\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport pMap from 'p-map';\nimport { isDirectory } from '../util/fs.js';\nimport { loadManifestFile, type LoadedDocument } from './loader.js';\nimport { isKnownKind, validateDocument, type ValidationIssue } from './validator.js';\nimport type { ManifestKind } from './types/index.js';\n\nconst MAX_DEPTH = 4;\nconst SKIP_DIRS = new Set([\n '.git',\n '.qavor',\n 'node_modules',\n '.venv',\n 'venv',\n '__pycache__',\n 'dist',\n 'build',\n 'target',\n '.next',\n '.svelte-kit',\n '.cache',\n]);\n\n/**\n * Discover manifest files under a repo root. Conventions:\n *\n * - Root `qavor.yaml` (single or multi-document).\n * - Every `qavor.yaml` under a `qavor/` directory at the repo root.\n * - Every `<sub-dir>/qavor.yaml` under the repo root, to depth MAX_DEPTH.\n *\n * Returns absolute file paths.\n */\nexport async function discoverManifestFiles(repoRoot: string): Promise<string[]> {\n const abs = path.resolve(repoRoot);\n const found = new Set<string>();\n if (!(await isDirectory(abs))) return [];\n\n // Root file\n const rootFile = path.join(abs, 'qavor.yaml');\n try {\n await fs.access(rootFile);\n found.add(rootFile);\n } catch {\n /* missing root manifest is fine */\n }\n\n // qavor/ directory at root\n const qavorDir = path.join(abs, 'qavor');\n if (await isDirectory(qavorDir)) {\n for await (const f of walk(qavorDir, qavorDir, 0)) found.add(f);\n }\n\n // Sub-directory manifests, depth-limited\n for await (const f of walk(abs, abs, 0)) {\n found.add(f);\n }\n\n return [...found].sort();\n}\n\nasync function* walk(\n rootBase: string,\n current: string,\n depth: number,\n): AsyncGenerator<string, void, void> {\n if (depth > MAX_DEPTH) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n // Don't recurse into the rootBase's own `qavor/` dir twice.\n if (depth === 0 && entry.name === 'qavor') continue;\n yield* walk(rootBase, full, depth + 1);\n } else if (entry.isFile() && entry.name === 'qavor.yaml') {\n // Skip the root-of-rootBase file; caller handles it.\n if (depth === 0 && current === rootBase) continue;\n yield full;\n }\n }\n}\n\nexport interface RegistryEntry {\n kind: ManifestKind;\n /** Discovered name from the manifest, when present. */\n name: string;\n file: string;\n docIndex: number;\n /** Directory containing the manifest, used to resolve relative paths. */\n dir: string;\n /** Optional repo name this manifest belongs to. */\n repo?: string;\n data: LoadedDocument['data'];\n position: LoadedDocument['position'];\n}\n\nexport interface WorkspaceRegistry {\n /** Workspace-scoped name → entry, validated unique. */\n byName: Map<string, RegistryEntry>;\n /** All loaded manifest entries (in discovery order). */\n entries: RegistryEntry[];\n issues: ValidationIssue[];\n}\n\nexport interface DiscoveryOptions {\n /** Workspace root. */\n workspaceRoot: string;\n /** Map of repo name → absolute repo path on disk. */\n repos: Map<string, string>;\n /** Concurrency. Default Infinity (bounded by callers). */\n concurrency?: number;\n /** When true, manifests with unknown kinds raise issues; otherwise warned. */\n strictUnknownKind?: boolean;\n}\n\n/**\n * Walk every cloned repo, load + validate manifests, and assemble the\n * workspace registry. Cross-references (e.g. project repo names → cloned\n * repos) are checked at the caller layer; here we only enforce unique names\n * inside the union of manifests.\n */\nexport async function buildWorkspaceRegistry(\n opts: DiscoveryOptions,\n): Promise<WorkspaceRegistry> {\n const issues: ValidationIssue[] = [];\n const all: RegistryEntry[] = [];\n\n const reposList: { name: string; dir: string }[] = [];\n for (const [name, dir] of opts.repos) reposList.push({ name, dir });\n\n await pMap(\n reposList,\n async ({ name: repoName, dir }) => {\n const files = await discoverManifestFiles(dir);\n for (const file of files) {\n let docs: LoadedDocument[];\n try {\n docs = await loadManifestFile(file);\n } catch (err) {\n issues.push({\n file,\n line: 1,\n column: 1,\n kind: 'unknown',\n path: '',\n message: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n for (const doc of docs) {\n if (!isKnownKind(doc.kind)) {\n const pos = doc.position('/kind');\n issues.push({\n file: pos.file,\n line: pos.line,\n column: pos.column,\n kind: String(doc.kind ?? 'unknown'),\n path: '/kind',\n message: `Unknown or missing kind in this document`,\n });\n continue;\n }\n const result = validateDocument(doc);\n if (!result.ok) {\n issues.push(...result.issues);\n continue;\n }\n const data = doc.data as { name?: string };\n all.push({\n kind: doc.kind,\n name: typeof data.name === 'string' ? data.name : '',\n file: doc.file,\n docIndex: doc.docIndex,\n dir: path.dirname(doc.file),\n repo: repoName,\n data: doc.data,\n position: doc.position,\n });\n }\n }\n },\n { concurrency: opts.concurrency ?? 8 },\n );\n\n // Validate workspace-wide uniqueness of names within (service/stateful/profile/repo).\n const byName = new Map<string, RegistryEntry>();\n for (const entry of all) {\n if (!entry.name) continue;\n if (entry.kind === 'workspaces' || entry.kind === 'project') continue;\n const key = entry.name;\n const existing = byName.get(key);\n if (existing && existing.kind === entry.kind) {\n const pos = entry.position('/name');\n issues.push({\n file: pos.file,\n line: pos.line,\n column: pos.column,\n kind: entry.kind,\n path: '/name',\n message: `Duplicate ${entry.kind} name '${entry.name}'. Already declared at ${existing.file}.`,\n });\n continue;\n }\n if (!existing) byName.set(key, entry);\n }\n\n return { byName, entries: all, issues };\n}\n","import { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { execa, type Options as ExecaOptions } from 'execa';\nimport { RuntimeFailure, ManifestError } from '../util/exit-codes.js';\nimport { ensureDir, readJsonFile, writeJsonFile, pathExists } from '../util/fs.js';\nimport { composeServiceEnv, toEnvObject, assertNoIssues } from '../env/composer.js';\nimport type { LoadedDocument } from '../manifest/loader.js';\nimport type { ServiceManifest } from '../manifest/types/index.js';\nimport type { WorkspacePaths } from '../workspace/paths.js';\nimport type { Logger } from '../util/logger.js';\nimport { runHooks } from '../util/hooks.js';\n\nconst DEFAULT_LOCK_PATTERNS = [\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'uv.lock',\n 'poetry.lock',\n 'requirements.txt',\n 'Pipfile.lock',\n 'go.sum',\n 'Cargo.lock',\n];\n\nexport interface PrepareInput {\n paths: WorkspacePaths;\n serviceDoc: LoadedDocument;\n service: ServiceManifest;\n force: boolean;\n logger: Logger;\n signal?: AbortSignal;\n cliEnv?: Record<string, string>;\n}\n\nexport interface PrepareResult {\n serviceName: string;\n /** \"ok\" — prepared successfully. \"skip\" — lockfile-hash cache hit. */\n status: 'ok' | 'skipped' | 'no-prepare-cmd';\n cacheFile: string;\n hash: string | null;\n}\n\n/**\n * Run the service's `runtime.native.prepare.cmd` if present.\n * Lockfile-aware skip: hashes the configured lockfile inputs (default\n * heuristics) plus the prepare command itself; skip on cache hit unless\n * --force is set.\n */\nexport async function prepareService(input: PrepareInput): Promise<PrepareResult> {\n const cmd = input.service.runtime?.native?.prepare?.cmd;\n if (!cmd) {\n return {\n serviceName: input.service.name,\n status: 'no-prepare-cmd',\n cacheFile: '',\n hash: null,\n };\n }\n\n const manifestDir = path.dirname(input.serviceDoc.file);\n const cacheFile = path.join(input.paths.cacheDir, 'prepare', `${input.service.name}.json`);\n const hash = await computePrepareHash(manifestDir, cmd);\n\n if (!input.force) {\n const prev = await readPrev(cacheFile);\n if (prev && prev.hash === hash) {\n input.logger.info({ service: input.service.name }, 'prepare: lockfile hash unchanged; skipping');\n return { serviceName: input.service.name, status: 'skipped', cacheFile, hash };\n }\n }\n\n const envRes = await composeServiceEnv({\n mode: 'native',\n serviceDoc: input.serviceDoc,\n service: input.service,\n workspaceRoot: input.paths.root,\n ...(input.cliEnv ? { cliEnv: input.cliEnv } : {}),\n });\n assertNoIssues(envRes);\n const env = toEnvObject(envRes);\n\n await runHooks({\n hooks: input.service.hooks,\n event: 'pre_prepare',\n cwd: manifestDir,\n env,\n logger: input.logger,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n\n await ensureDir(path.join(input.paths.logsDir, input.service.name));\n const logFile = path.join(input.paths.logsDir, input.service.name, 'prepare.log');\n input.logger.info({ service: input.service.name, cmd }, 'prepare: starting');\n\n const cwd = input.service.runtime?.native?.prepare?.cwd\n ? path.resolve(manifestDir, input.service.runtime.native.prepare.cwd)\n : manifestDir;\n\n const fileHandle = await fs.open(logFile, 'a');\n const shell = input.service.runtime?.native?.prepare?.shell ?? '/bin/sh';\n try {\n const opts: ExecaOptions = {\n cwd,\n env: { ...process.env, ...env },\n stdio: ['ignore', fileHandle.fd, fileHandle.fd] as ExecaOptions['stdio'],\n ...(input.signal ? { cancelSignal: input.signal } : {}),\n reject: false,\n };\n const res = await execa(shell, ['-c', cmd], opts);\n if (res.exitCode !== 0) {\n throw new RuntimeFailure(\n `prepare failed for ${input.service.name} (exit ${res.exitCode}). See ${logFile}.`,\n );\n }\n } catch (err) {\n if (err instanceof RuntimeFailure) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new RuntimeFailure(\n `prepare failed for ${input.service.name}: ${message}. See ${logFile}.`,\n );\n } finally {\n await fileHandle.close();\n }\n\n await runHooks({\n hooks: input.service.hooks,\n event: 'post_prepare',\n cwd: manifestDir,\n env,\n logger: input.logger,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n\n await writeJsonFile(cacheFile, {\n service: input.service.name,\n hash,\n at: new Date().toISOString(),\n cmd,\n });\n return { serviceName: input.service.name, status: 'ok', cacheFile, hash };\n}\n\nasync function readPrev(file: string): Promise<{ hash: string } | null> {\n if (!(await pathExists(file))) return null;\n try {\n return await readJsonFile<{ hash: string }>(file);\n } catch {\n return null;\n }\n}\n\nasync function computePrepareHash(manifestDir: string, cmd: string): Promise<string> {\n const hash = createHash('sha256');\n hash.update('cmd:' + cmd + '\\n');\n for (const candidate of DEFAULT_LOCK_PATTERNS) {\n const file = path.join(manifestDir, candidate);\n const stat = await safeStat(file);\n if (!stat) {\n hash.update(`missing:${candidate}\\n`);\n continue;\n }\n hash.update(`file:${candidate}\\nsize:${stat.size}\\nmtime:${stat.mtimeMs}\\n`);\n const fileHash = await hashFile(file);\n hash.update(`sha:${fileHash}\\n`);\n }\n return hash.digest('hex');\n}\n\nasync function safeStat(file: string): Promise<import('node:fs').Stats | null> {\n try {\n return await fs.stat(file);\n } catch {\n return null;\n }\n}\n\nasync function hashFile(file: string): Promise<string> {\n const hash = createHash('sha256');\n const stream = createReadStream(file);\n for await (const chunk of stream) hash.update(chunk as Buffer);\n return hash.digest('hex');\n}\n\nexport class PrepareMissingManifestError extends ManifestError {}\n","import path from 'node:path';\nimport { ManifestError, UserError } from '../util/exit-codes.js';\nimport type { EnvBlock, EnvMap, EnvSpec, ServiceManifest } from '../manifest/types/index.js';\nimport type { LoadedDocument } from '../manifest/loader.js';\nimport { loadDotenvFile } from './dotenv.js';\n\nexport type RunMode = 'native' | 'docker';\n\nexport interface ResolvedValue {\n /** Final resolved string value (post-interpolation, post-defaults). */\n value: string;\n /** Provenance trail, most-recent-wins is the last entry. */\n provenance: Provenance[];\n /** True when the originating envSpec marks this var as secret. */\n secret: boolean;\n /** True when the originating envSpec marks this var as required. */\n required: boolean;\n}\n\nexport interface Provenance {\n file: string;\n line: number;\n /** Human-readable layer label. */\n layer: string;\n /** Pre-interpolation raw value. */\n raw: string;\n}\n\nexport interface ResolvedEnv {\n /** Ordered map (Map preserves insertion order for first-seen keys). */\n values: Map<string, ResolvedValue>;\n /** Validation issues raised during resolution. Empty when ok. */\n issues: ManifestComposeIssue[];\n}\n\nexport interface ManifestComposeIssue {\n file: string;\n line: number;\n message: string;\n}\n\nexport interface ServiceCompositionInput {\n /** Active run mode for the service. */\n mode: RunMode;\n /** The service's loaded doc (used for positions). */\n serviceDoc: LoadedDocument;\n /** The service manifest body (typed). */\n service: ServiceManifest;\n /** Absolute path to the workspace root. */\n workspaceRoot: string;\n /** CLI --env KEY=VAL entries. */\n cliEnv?: Record<string, string>;\n}\n\n/**\n * Compose env for a service per the MVP precedence (later wins):\n *\n * 1. Service own env.common\n * 2. Service own env.<mode>\n * 3. <manifestDir>/.env\n * 4. <manifestDir>/.env.<mode>\n * 5. <workspaceRoot>/.env\n * 6. CLI --env KEY=VAL\n *\n * Returns a ResolvedEnv with full provenance per key. Required env without\n * a value raises an issue (caller decides what to do).\n */\nexport async function composeServiceEnv(input: ServiceCompositionInput): Promise<ResolvedEnv> {\n const issues: ManifestComposeIssue[] = [];\n const layers: LayerEntry[] = [];\n\n const manifestDir = path.dirname(input.serviceDoc.file);\n const env = input.service.env;\n const positionFor = input.serviceDoc.position;\n\n if (env?.common) {\n pushEnvMap(layers, env.common, 'service.env.common', input.serviceDoc.file, positionFor, '/env/common');\n }\n if (input.mode === 'native' && env?.native) {\n pushEnvMap(layers, env.native, 'service.env.native', input.serviceDoc.file, positionFor, '/env/native');\n } else if (input.mode === 'docker' && env?.docker) {\n pushEnvMap(layers, env.docker, 'service.env.docker', input.serviceDoc.file, positionFor, '/env/docker');\n }\n // .env next to manifest\n const baseDotenv = await loadDotenvFile(path.join(manifestDir, '.env'));\n for (const e of baseDotenv) {\n layers.push({\n key: e.key,\n raw: e.value,\n layer: 'service.env',\n file: e.file,\n line: e.line,\n spec: null,\n });\n }\n // .env.<mode> next to manifest\n const modeDotenvFile = path.join(manifestDir, input.mode === 'native' ? '.env.native' : '.env.docker');\n const modeDotenv = await loadDotenvFile(modeDotenvFile);\n for (const e of modeDotenv) {\n layers.push({\n key: e.key,\n raw: e.value,\n layer: `service.env.${input.mode}`,\n file: e.file,\n line: e.line,\n spec: null,\n });\n }\n // Workspace .env\n const wsEnv = await loadDotenvFile(path.join(input.workspaceRoot, '.env'));\n for (const e of wsEnv) {\n layers.push({\n key: e.key,\n raw: e.value,\n layer: 'workspace.env',\n file: e.file,\n line: e.line,\n spec: null,\n });\n }\n // CLI overrides\n if (input.cliEnv) {\n for (const [k, v] of Object.entries(input.cliEnv)) {\n layers.push({\n key: k,\n raw: v,\n layer: 'cli.--env',\n file: '<cli>',\n line: 0,\n spec: null,\n });\n }\n }\n\n return interpolateLayers(layers, issues);\n}\n\ninterface LayerEntry {\n key: string;\n raw: string;\n layer: string;\n file: string;\n line: number;\n spec: EnvSpec | null;\n}\n\nfunction pushEnvMap(\n layers: LayerEntry[],\n map: EnvMap,\n layerLabel: string,\n file: string,\n positionFor: LoadedDocument['position'],\n basePath: string,\n): void {\n for (const [key, val] of Object.entries(map)) {\n const valuePath = `${basePath}/${key}`;\n const pos = positionFor(valuePath);\n if (isEnvSpec(val)) {\n const spec = val as EnvSpec;\n const concrete =\n typeof spec.value !== 'undefined'\n ? spec.value\n : typeof spec.default !== 'undefined'\n ? spec.default\n : undefined;\n if (typeof concrete === 'undefined') {\n // Required envSpec with no value/default contributes a placeholder layer so\n // the resolver can flag the missing required at the end.\n layers.push({\n key,\n raw: '',\n layer: layerLabel,\n file,\n line: pos.line,\n spec,\n });\n continue;\n }\n layers.push({\n key,\n raw: String(concrete),\n layer: layerLabel,\n file,\n line: pos.line,\n spec,\n });\n } else {\n layers.push({\n key,\n raw: String(val),\n layer: layerLabel,\n file,\n line: pos.line,\n spec: null,\n });\n }\n }\n}\n\nfunction isEnvSpec(v: unknown): v is EnvSpec {\n return Boolean(\n v && typeof v === 'object' && !Array.isArray(v) && (\n 'value' in (v as object) ||\n 'default' in (v as object) ||\n 'required' in (v as object) ||\n 'secret' in (v as object) ||\n 'type' in (v as object) ||\n 'pattern' in (v as object) ||\n 'description' in (v as object)\n ),\n );\n}\n\nconst INTERP_RE = /\\$\\{([^}]+)\\}/g;\nconst SECRET_PREFIX = 'secret:';\n\nfunction interpolateLayers(layers: LayerEntry[], issues: ManifestComposeIssue[]): ResolvedEnv {\n // Resolve layer-by-layer, later wins. We interpolate against the\n // running map plus process.env for `${VAR}` references.\n const values = new Map<string, ResolvedValue>();\n for (const entry of layers) {\n const isRequiredPlaceholder =\n !entry.raw &&\n entry.spec?.required === true &&\n typeof entry.spec?.value === 'undefined' &&\n typeof entry.spec?.default === 'undefined';\n if (isRequiredPlaceholder) {\n // Track the required flag on the key without writing a non-empty value.\n const prior = values.get(entry.key);\n const provenance = prior ? prior.provenance.slice() : [];\n provenance.push({ file: entry.file, line: entry.line, layer: entry.layer, raw: '' });\n values.set(entry.key, {\n value: prior?.value ?? '',\n provenance,\n secret: Boolean(entry.spec?.secret) || (prior?.secret ?? false),\n required: true,\n });\n continue;\n }\n const { value, missing, secrets } = interpolate(entry.raw, values, process.env);\n if (secrets.length > 0) {\n // v0 fails closed on ${secret:...}; ADR-reserved syntax.\n issues.push({\n file: entry.file,\n line: entry.line,\n message: `\\${secret:${secrets[0]}} interpolation is reserved for v1. Configure as plain env until then.`,\n });\n continue;\n }\n if (missing.length > 0) {\n issues.push({\n file: entry.file,\n line: entry.line,\n message: `Unresolved interpolation in ${entry.key}: \\${${missing[0]}}`,\n });\n continue;\n }\n const prior = values.get(entry.key);\n const provenance = prior ? prior.provenance.slice() : [];\n provenance.push({ file: entry.file, line: entry.line, layer: entry.layer, raw: entry.raw });\n values.set(entry.key, {\n value,\n provenance,\n secret: Boolean(entry.spec?.secret) || (prior?.secret ?? false),\n required: Boolean(entry.spec?.required) || (prior?.required ?? false),\n });\n }\n // Surface missing-required errors after the full chain.\n for (const [key, val] of values) {\n if (val.required && (val.value === '' || typeof val.value === 'undefined')) {\n const last = val.provenance[val.provenance.length - 1];\n issues.push({\n file: last?.file ?? '<unknown>',\n line: last?.line ?? 0,\n message: `Required env ${key} has no value.`,\n });\n }\n }\n return { values, issues };\n}\n\nfunction interpolate(\n raw: string,\n resolved: Map<string, ResolvedValue>,\n procEnv: NodeJS.ProcessEnv,\n): { value: string; missing: string[]; secrets: string[] } {\n if (!raw) return { value: raw, missing: [], secrets: [] };\n const missing: string[] = [];\n const secrets: string[] = [];\n const value = raw.replace(INTERP_RE, (_m, expr: string) => {\n const trimmed = expr.trim();\n if (trimmed.startsWith(SECRET_PREFIX)) {\n secrets.push(trimmed.slice(SECRET_PREFIX.length));\n return '';\n }\n const fromResolved = resolved.get(trimmed);\n if (fromResolved) return fromResolved.value;\n const fromProc = procEnv[trimmed];\n if (typeof fromProc === 'string') return fromProc;\n missing.push(trimmed);\n return '';\n });\n return { value, missing, secrets };\n}\n\n/**\n * Parse `KEY=VAL` strings from --env into a record. Quote stripping is the\n * caller's responsibility (commander gives us the raw string).\n */\nexport function parseCliEnv(items: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const item of items) {\n const eq = item.indexOf('=');\n if (eq <= 0) throw new UserError(`Invalid --env value '${item}'. Expected KEY=VALUE.`);\n const key = item.slice(0, eq);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new UserError(`Invalid env key '${key}' in --env. Use UPPER_SNAKE_CASE.`);\n }\n out[key] = item.slice(eq + 1);\n }\n return out;\n}\n\n/**\n * Convenience: take a ResolvedEnv and produce a plain string→string object\n * suitable for execa's `env` option. Secrets remain in plaintext (the child\n * process needs them); only the printable representations elsewhere should\n * redact.\n */\nexport function toEnvObject(resolved: ResolvedEnv): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of resolved.values) out[k] = v.value;\n return out;\n}\n\n/**\n * Throw if there are any unrecoverable issues so callers can fail fast.\n */\nexport function assertNoIssues(resolved: ResolvedEnv): void {\n if (resolved.issues.length === 0) return;\n const lines = resolved.issues.map((i) => `${i.file}:${i.line}: ${i.message}`);\n throw new ManifestError(`Environment composition failed:\\n ${lines.join('\\n ')}`);\n}\n","import fs from 'node:fs/promises';\nimport { pathExists } from '../util/fs.js';\n\n/**\n * Parse a .env file with one KEY=VALUE per line. Returns ordered entries so\n * callers can build provenance line-by-line. Minimal subset of the dotenv\n * format: comments via `#`, optional `export ` prefix, double or single\n * quoted values, and continuation via line-by-line append (no multi-line).\n *\n * We intentionally do not interpolate here — qavor's env composer owns\n * interpolation across the full chain.\n */\nexport interface DotenvEntry {\n key: string;\n value: string;\n file: string;\n line: number;\n}\n\nexport async function loadDotenvFile(file: string): Promise<DotenvEntry[]> {\n if (!(await pathExists(file))) return [];\n const raw = await fs.readFile(file, 'utf8');\n const lines = raw.split(/\\r?\\n/);\n const out: DotenvEntry[] = [];\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i] ?? '';\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n const stripped = line.startsWith('export ') ? line.slice('export '.length).trimStart() : line;\n const eq = stripped.indexOf('=');\n if (eq <= 0) continue;\n const key = stripped.slice(0, eq).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue;\n let value = stripped.slice(eq + 1);\n // strip optional inline comment when value is unquoted\n if (!value.startsWith('\"') && !value.startsWith(\"'\")) {\n const hash = value.indexOf(' #');\n if (hash >= 0) value = value.slice(0, hash);\n value = value.trim();\n } else {\n const quote = value[0]!;\n const closing = value.lastIndexOf(quote);\n if (closing > 0) value = value.slice(1, closing);\n }\n out.push({ key, value, file, line: i + 1 });\n }\n return out;\n}\n","import { execa } from 'execa';\nimport { RuntimeFailure } from './exit-codes.js';\nimport type { Logger } from './logger.js';\nimport type { Hooks, HookCommands } from '../manifest/types/index.js';\n\nconst HOOK_EVENTS = [\n 'pre_clone',\n 'post_clone',\n 'pre_prepare',\n 'post_prepare',\n 'pre_run',\n 'post_run',\n 'pre_stop',\n 'post_stop',\n] as const;\nexport type HookEvent = (typeof HOOK_EVENTS)[number];\n\nexport interface RunHooksOptions {\n hooks: Hooks | undefined;\n event: HookEvent;\n cwd: string;\n env?: Record<string, string>;\n signal?: AbortSignal;\n logger: Logger;\n}\n\nfunction toList(cmds: HookCommands | undefined): string[] {\n if (!cmds) return [];\n return Array.isArray(cmds) ? [...cmds] : [cmds];\n}\n\nexport async function runHooks(opts: RunHooksOptions): Promise<void> {\n const cmds = toList(opts.hooks?.[opts.event]);\n if (cmds.length === 0) return;\n for (const cmd of cmds) {\n opts.logger.info({ event: opts.event, cmd }, 'hook: running');\n try {\n await execa('/bin/sh', ['-c', cmd], {\n cwd: opts.cwd,\n env: opts.env ? { ...process.env, ...opts.env } : process.env,\n stdout: 'inherit',\n stderr: 'inherit',\n ...(opts.signal ? { cancelSignal: opts.signal } : {}),\n });\n } catch (err) {\n throw new RuntimeFailure(\n `Hook ${opts.event} failed (${cmd}): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n","import type { Command } from 'commander';\nimport { resolveWorkspace, readProjectManifest } from '../../workspace/locate.js';\nimport { resolveRepos } from '../../workspace/repos.js';\nimport { buildWorkspaceRegistry } from '../../manifest/discovery.js';\nimport { emit, emitJson } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { composeServiceEnv, parseCliEnv } from '../../env/composer.js';\nimport { loadManifestFile, type LoadedDocument } from '../../manifest/loader.js';\nimport type { ProjectManifest, ServiceManifest } from '../../manifest/types/index.js';\nimport { UserError } from '../../util/exit-codes.js';\nimport { resolveJobs } from '../../util/concurrency.js';\n\nexport function registerEnv(program: Command): void {\n program\n .command('env')\n .description('Print the fully-resolved environment for a service, with provenance per key.')\n .argument('<service>', 'Service name.')\n .option('--mode <mode>', 'native | docker (default: native).', 'native')\n .option('--env <kv...>', 'Layer KEY=VAL on top of the composed env.')\n .action(async (service: string, opts: { mode: string; env?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const mode = opts.mode === 'docker' ? 'docker' : 'native';\n if (opts.mode !== 'native' && opts.mode !== 'docker') {\n throw new UserError(`--mode must be 'native' or 'docker'.`);\n }\n const ws = await resolveWorkspace();\n const projectDoc = await readProjectManifest(ws.projectManifestFile);\n const repos = resolveRepos({\n workspaceRoot: ws.paths.root,\n project: projectDoc.data as unknown as ProjectManifest,\n projectRepoPath: ws.projectRepoPath,\n });\n const repoMap = new Map(repos.map((r) => [r.name, r.dir]));\n repoMap.set('__project__', ws.projectRepoPath);\n const registry = await buildWorkspaceRegistry({\n workspaceRoot: ws.paths.root,\n repos: repoMap,\n concurrency: resolveJobs(root.jobs),\n });\n const entry = registry.entries.find((e) => e.kind === 'service' && e.name === service);\n if (!entry) throw new UserError(`Service '${service}' not found in workspace.`);\n\n const docs = await loadManifestFile(entry.file);\n const serviceDoc = docs[entry.docIndex] as LoadedDocument;\n const cliEnv = opts.env ? parseCliEnv(opts.env) : undefined;\n const composeOpts: Parameters<typeof composeServiceEnv>[0] = {\n mode,\n serviceDoc,\n service: entry.data as unknown as ServiceManifest,\n workspaceRoot: ws.paths.root,\n };\n if (cliEnv) composeOpts.cliEnv = cliEnv;\n const resolved = await composeServiceEnv(composeOpts);\n\n if (root.json) {\n emitJson({\n service,\n mode,\n issues: resolved.issues,\n env: [...resolved.values].map(([k, v]) => ({\n key: k,\n value: v.secret ? '<redacted>' : v.value,\n secret: v.secret,\n required: v.required,\n provenance: v.provenance.map((p) => ({\n file: p.file,\n line: p.line,\n layer: p.layer,\n raw: v.secret ? '<redacted>' : p.raw,\n })),\n })),\n });\n return;\n }\n\n if (resolved.issues.length > 0) {\n emit('Issues:');\n for (const i of resolved.issues) emit(` ${i.file}:${i.line}: ${i.message}`);\n emit('');\n }\n emit(`Resolved environment for ${service} (mode=${mode}):`);\n for (const [k, v] of resolved.values) {\n const printed = v.secret ? '<redacted>' : v.value;\n emit(` ${k} = ${printed}`);\n for (const p of v.provenance) {\n const rawPrinted = v.secret ? '<redacted>' : p.raw;\n emit(` via ${p.layer} (${p.file}:${p.line}) = ${rawPrinted}`);\n }\n }\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { execa, type ResultPromise, type Options as ExecaOptions } from 'execa';\nimport { ensureDir } from '../util/fs.js';\nimport { RuntimeFailure, UserError } from '../util/exit-codes.js';\nimport { runHooks } from '../util/hooks.js';\nimport { composeServiceEnv, toEnvObject, assertNoIssues } from '../env/composer.js';\nimport type { Logger } from '../util/logger.js';\nimport type { LoadedDocument } from '../manifest/loader.js';\nimport type { ServiceManifest } from '../manifest/types/index.js';\nimport type { WorkspacePaths } from '../workspace/paths.js';\nimport {\n clearState,\n isPidAlive,\n listSupervisorStates,\n readState,\n writeState,\n type SupervisorState,\n} from './state.js';\n\nexport interface StartOptions {\n paths: WorkspacePaths;\n serviceDoc: LoadedDocument;\n service: ServiceManifest;\n logger: Logger;\n cliEnv?: Record<string, string>;\n}\n\nexport interface StartResult {\n pid: number;\n pgid: number;\n logFile: string;\n}\n\nconst LOG_FILE_NAME = 'service.log';\nconst LOG_MAX_BYTES = 5 * 1024 * 1024;\nconst LOG_BACKLOG = 5;\n\nexport async function startNativeService(opts: StartOptions): Promise<StartResult> {\n const cmd = opts.service.runtime?.native?.run?.cmd;\n if (!cmd) {\n throw new UserError(\n `Service '${opts.service.name}' has no runtime.native.run.cmd. Cannot start in native mode.`,\n );\n }\n if (opts.service.runtime?.native?.enabled === false) {\n throw new UserError(\n `Service '${opts.service.name}' has runtime.native.enabled: false. Cannot start in native mode.`,\n );\n }\n\n const existing = await readState(opts.paths, opts.service.name);\n if (existing && existing.status === 'running' && isPidAlive(existing.pid)) {\n throw new UserError(`Service '${opts.service.name}' is already running (pid ${existing.pid}).`);\n }\n\n const manifestDir = path.dirname(opts.serviceDoc.file);\n const cwd = opts.service.runtime?.native?.run?.cwd\n ? path.resolve(manifestDir, opts.service.runtime.native.run.cwd)\n : manifestDir;\n\n const envRes = await composeServiceEnv({\n mode: 'native',\n serviceDoc: opts.serviceDoc,\n service: opts.service,\n workspaceRoot: opts.paths.root,\n ...(opts.cliEnv ? { cliEnv: opts.cliEnv } : {}),\n });\n assertNoIssues(envRes);\n const env = toEnvObject(envRes);\n\n const serviceLogDir = path.join(opts.paths.logsDir, opts.service.name);\n await ensureDir(serviceLogDir);\n await rotateLog(serviceLogDir);\n const logFile = path.join(serviceLogDir, LOG_FILE_NAME);\n const fh = await fs.open(logFile, 'a');\n\n // pre_run hook\n await runHooks({\n hooks: opts.service.hooks,\n event: 'pre_run',\n cwd: manifestDir,\n env,\n logger: opts.logger,\n });\n\n let child: ResultPromise;\n const shell = opts.service.runtime?.native?.run?.shell ?? '/bin/sh';\n try {\n const spawnOpts: ExecaOptions = {\n cwd,\n env: { ...process.env, ...env },\n detached: true,\n stdio: ['ignore', fh.fd, fh.fd] as ExecaOptions['stdio'],\n reject: false,\n };\n child = execa(shell, ['-c', cmd], spawnOpts);\n } catch (err) {\n await fh.close().catch(() => undefined);\n throw new RuntimeFailure(\n `Failed to spawn ${opts.service.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const pid = child.pid ?? 0;\n if (!pid) {\n await fh.close().catch(() => undefined);\n throw new RuntimeFailure(`Failed to spawn ${opts.service.name}: no pid assigned.`);\n }\n\n // detach so the child survives this CLI process exiting.\n child.unref();\n\n // Close our copy of the log fd — the child holds its own.\n await fh.close().catch(() => undefined);\n\n // Record state.\n const state: SupervisorState = {\n service: opts.service.name,\n pid,\n pgid: pid,\n startedAt: new Date().toISOString(),\n cmd,\n cwd,\n logFile,\n status: 'running',\n updatedAt: new Date().toISOString(),\n };\n await writeState(opts.paths, state);\n\n opts.logger.info({ service: opts.service.name, pid, logFile }, 'up: started');\n return { pid, pgid: pid, logFile };\n}\n\nexport interface StopOptions {\n paths: WorkspacePaths;\n service: string;\n manifestDir?: string;\n hooks?: ServiceManifest['hooks'];\n graceMs?: number;\n logger: Logger;\n}\n\nconst DEFAULT_GRACE_MS = 10_000;\n\nexport async function stopNativeService(opts: StopOptions): Promise<{ stopped: boolean }> {\n const state = await readState(opts.paths, opts.service);\n if (!state) {\n opts.logger.info({ service: opts.service }, 'down: no state file; nothing to do');\n return { stopped: false };\n }\n if (!isPidAlive(state.pid)) {\n opts.logger.info({ service: opts.service, pid: state.pid }, 'down: process already gone; clearing state');\n await clearState(opts.paths, opts.service);\n return { stopped: true };\n }\n\n if (opts.manifestDir && opts.hooks) {\n await runHooks({\n hooks: opts.hooks,\n event: 'pre_stop',\n cwd: opts.manifestDir,\n logger: opts.logger,\n });\n }\n\n const grace = opts.graceMs ?? DEFAULT_GRACE_MS;\n try {\n process.kill(-state.pid, 'SIGTERM');\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e.code !== 'ESRCH') throw err;\n }\n const stoppedGracefully = await waitForExit(state.pid, grace);\n if (!stoppedGracefully) {\n opts.logger.warn({ service: opts.service, pid: state.pid }, 'down: grace exceeded; SIGKILL');\n try {\n process.kill(-state.pid, 'SIGKILL');\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e.code !== 'ESRCH') throw err;\n }\n await waitForExit(state.pid, 5000);\n }\n\n if (opts.manifestDir && opts.hooks) {\n await runHooks({\n hooks: opts.hooks,\n event: 'post_stop',\n cwd: opts.manifestDir,\n logger: opts.logger,\n });\n }\n\n await clearState(opts.paths, opts.service);\n return { stopped: true };\n}\n\nasync function waitForExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) return true;\n await sleep(100);\n }\n return false;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nasync function rotateLog(dir: string): Promise<void> {\n const main = path.join(dir, LOG_FILE_NAME);\n let st: import('node:fs').Stats | null = null;\n try {\n st = await fs.stat(main);\n } catch {\n return;\n }\n if (st.size < LOG_MAX_BYTES) return;\n // Rotate .log -> .log.1 -> .log.2 ...\n for (let i = LOG_BACKLOG - 1; i >= 1; i--) {\n const src = path.join(dir, `${LOG_FILE_NAME}.${i}`);\n const dst = path.join(dir, `${LOG_FILE_NAME}.${i + 1}`);\n try {\n await fs.rename(src, dst);\n } catch {\n /* missing */\n }\n }\n try {\n await fs.rename(main, path.join(dir, `${LOG_FILE_NAME}.1`));\n } catch {\n /* might be gone */\n }\n}\n\nexport interface ListedService {\n service: string;\n status: 'running' | 'stopped' | 'crashed';\n pid: number | null;\n startedAt: string | null;\n uptimeSec: number | null;\n logFile: string | null;\n}\n\n/**\n * Cheap parallel liveness check. Used by `qavor ps`.\n */\nexport async function listServicesState(paths: WorkspacePaths): Promise<ListedService[]> {\n const states = await listSupervisorStates(paths);\n const out: ListedService[] = [];\n for (const s of states) {\n const alive = isPidAlive(s.pid);\n const status: ListedService['status'] = alive ? 'running' : s.status === 'running' ? 'crashed' : 'stopped';\n const started = new Date(s.startedAt);\n const uptimeSec = alive ? Math.floor((Date.now() - started.getTime()) / 1000) : null;\n out.push({\n service: s.service,\n status,\n pid: alive ? s.pid : null,\n startedAt: s.startedAt,\n uptimeSec,\n logFile: s.logFile,\n });\n }\n return out;\n}\n\n/**\n * If a state file reports `running` but the PID has died, mark it crashed\n * so subsequent `ps` calls report it. Returns the updated state, if any.\n */\nexport async function reconcileCrashedState(\n paths: WorkspacePaths,\n service: string,\n): Promise<SupervisorState | null> {\n const state = await readState(paths, service);\n if (!state) return null;\n if (state.status === 'running' && !isPidAlive(state.pid)) {\n state.status = 'crashed';\n state.updatedAt = new Date().toISOString();\n await writeState(paths, state);\n return state;\n }\n return state;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { pathExists, readJsonFile, writeJsonFile } from '../util/fs.js';\nimport type { WorkspacePaths } from '../workspace/paths.js';\n\nexport type SupervisorStatus = 'running' | 'stopped' | 'crashed' | 'unknown';\n\nexport interface SupervisorState {\n service: string;\n pid: number;\n pgid: number;\n startedAt: string;\n cmd: string;\n cwd: string;\n logFile: string;\n status: SupervisorStatus;\n /** Last known exit code, if the process has been observed exiting. */\n exitCode?: number;\n /** Last update timestamp. */\n updatedAt: string;\n}\n\nexport function stateFile(paths: WorkspacePaths, service: string): string {\n return path.join(paths.stateDir, `${service}.json`);\n}\n\nexport async function readState(paths: WorkspacePaths, service: string): Promise<SupervisorState | null> {\n const file = stateFile(paths, service);\n if (!(await pathExists(file))) return null;\n try {\n return await readJsonFile<SupervisorState>(file);\n } catch {\n return null;\n }\n}\n\nexport async function writeState(paths: WorkspacePaths, state: SupervisorState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await writeJsonFile(stateFile(paths, state.service), state);\n}\n\nexport async function clearState(paths: WorkspacePaths, service: string): Promise<void> {\n const file = stateFile(paths, service);\n try {\n await fs.unlink(file);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\n/**\n * Synchronously check whether a tracked PID is still alive. We do not use\n * fs.existsSync — this is a signal-0 probe which is allowed on the hot path\n * because there's no file IO involved.\n */\nexport function isPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e.code === 'EPERM') return true;\n return false;\n }\n}\n\nexport async function listSupervisorStates(paths: WorkspacePaths): Promise<SupervisorState[]> {\n const out: SupervisorState[] = [];\n if (!(await pathExists(paths.stateDir))) return out;\n const entries = await fs.readdir(paths.stateDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.json')) continue;\n try {\n const state = await readJsonFile<SupervisorState>(path.join(paths.stateDir, entry.name));\n out.push(state);\n } catch {\n /* corrupt state files are ignored */\n }\n }\n return out;\n}\n","import fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport path from 'node:path';\nimport { pathExists } from '../util/fs.js';\n\nexport interface TailOptions {\n /** Path to the log file. */\n file: string;\n /** Stream to write decoded UTF-8 chunks to. */\n out: NodeJS.WritableStream;\n /** When true, keep watching for appended bytes. */\n follow: boolean;\n /** AbortSignal to terminate follow loop. */\n signal?: AbortSignal;\n /** Number of bytes from the tail to read initially (default 16KB). */\n initialBytes?: number;\n}\n\n/**\n * Print the tail of a log file. Optionally follows new appends using\n * `fs.watch` (event-driven) plus a stat-based polling fallback.\n */\nexport async function tailFile(opts: TailOptions): Promise<void> {\n if (!(await pathExists(opts.file))) {\n if (!opts.follow) return;\n // Wait for the file to appear when following.\n await waitForFile(opts.file, opts.signal);\n }\n let offset = await initialOffset(opts.file, opts.initialBytes ?? 16 * 1024);\n await streamFrom(opts.file, offset, opts.out);\n if (!opts.follow) return;\n\n let stat = await fs.stat(opts.file);\n offset = stat.size;\n\n const watcher = fs.watch(opts.file, { persistent: true });\n const abort = opts.signal ?? new AbortController().signal;\n\n const pollTimer = setInterval(async () => {\n try {\n const cur = await fs.stat(opts.file);\n if (cur.size < offset) {\n offset = 0; // rotated\n }\n if (cur.size > offset) {\n await streamFrom(opts.file, offset, opts.out);\n offset = cur.size;\n }\n } catch {\n /* ignore */\n }\n }, 500);\n\n try {\n for await (const _event of watcher) {\n if (abort.aborted) break;\n const cur = await fs.stat(opts.file).catch(() => null);\n if (!cur) continue;\n if (cur.size < offset) {\n offset = 0;\n }\n if (cur.size > offset) {\n await streamFrom(opts.file, offset, opts.out);\n offset = cur.size;\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ABORT_ERR') return;\n throw err;\n } finally {\n clearInterval(pollTimer);\n }\n}\n\nasync function initialOffset(file: string, fromEndBytes: number): Promise<number> {\n const st = await fs.stat(file);\n return Math.max(0, st.size - fromEndBytes);\n}\n\nasync function streamFrom(file: string, start: number, out: NodeJS.WritableStream): Promise<void> {\n return new Promise((resolve, reject) => {\n const rs = createReadStream(file, { start, encoding: 'utf8' });\n rs.on('data', (chunk) => out.write(chunk as string));\n rs.on('end', () => resolve());\n rs.on('error', (err) => reject(err));\n });\n}\n\nasync function waitForFile(file: string, signal?: AbortSignal): Promise<void> {\n const dir = path.dirname(file);\n await fs.mkdir(dir, { recursive: true });\n for (;;) {\n if (signal?.aborted) return;\n if (await pathExists(file)) return;\n await new Promise((r) => setTimeout(r, 250));\n }\n}\n","import type { Command } from 'commander';\nimport { resolveWorkspace, readProjectManifest } from '../../workspace/locate.js';\nimport { resolveRepos } from '../../workspace/repos.js';\nimport { buildWorkspaceRegistry } from '../../manifest/discovery.js';\nimport { emit, emitJson, getLogger } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { parseCliEnv } from '../../env/composer.js';\nimport {\n startNativeService,\n stopNativeService,\n listServicesState,\n} from '../../supervisor/native.js';\nimport { loadManifestFile, type LoadedDocument } from '../../manifest/loader.js';\nimport type { ProjectManifest, ServiceManifest } from '../../manifest/types/index.js';\nimport { UserError } from '../../util/exit-codes.js';\nimport { resolveJobs } from '../../util/concurrency.js';\nimport { tailFile } from '../../supervisor/logs.js';\nimport path from 'node:path';\n\nasync function findService(name: string, jobs: number): Promise<{\n serviceDoc: LoadedDocument;\n service: ServiceManifest;\n paths: ReturnType<typeof import('../../workspace/paths.js').workspacePaths>;\n manifestDir: string;\n}> {\n const ws = await resolveWorkspace();\n const projectDoc = await readProjectManifest(ws.projectManifestFile);\n const repos = resolveRepos({\n workspaceRoot: ws.paths.root,\n project: projectDoc.data as unknown as ProjectManifest,\n projectRepoPath: ws.projectRepoPath,\n });\n const repoMap = new Map(repos.map((r) => [r.name, r.dir]));\n repoMap.set('__project__', ws.projectRepoPath);\n const registry = await buildWorkspaceRegistry({\n workspaceRoot: ws.paths.root,\n repos: repoMap,\n concurrency: jobs,\n });\n const entry = registry.entries.find((e) => e.kind === 'service' && e.name === name);\n if (!entry) throw new UserError(`Service '${name}' not found in workspace.`);\n const docs = await loadManifestFile(entry.file);\n const serviceDoc = docs[entry.docIndex] as LoadedDocument;\n return {\n serviceDoc,\n service: entry.data as unknown as ServiceManifest,\n paths: ws.paths,\n manifestDir: path.dirname(entry.file),\n };\n}\n\nexport function registerRunCommands(program: Command): void {\n program\n .command('up')\n .description('Start a single service in native mode.')\n .argument('<service>')\n .option('--mode <mode>', 'native | docker (default native; docker is v1).', 'native')\n .option('--env <kv...>', 'KEY=VAL overrides.')\n .action(async (name: string, opts: { mode: string; env?: string[] }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n if (opts.mode === 'docker') {\n throw new UserError(`--mode docker is deferred to v1.`);\n }\n const cliEnv = opts.env ? parseCliEnv(opts.env) : undefined;\n const jobs = resolveJobs(root.jobs);\n const ctx = await findService(name, jobs);\n const startOpts: Parameters<typeof startNativeService>[0] = {\n paths: ctx.paths,\n serviceDoc: ctx.serviceDoc,\n service: ctx.service,\n logger,\n };\n if (cliEnv) startOpts.cliEnv = cliEnv;\n const result = await startNativeService(startOpts);\n if (root.json) {\n emitJson({ service: name, pid: result.pid, logFile: result.logFile });\n } else {\n emit(`Started ${name} pid=${result.pid}`);\n emit(` log file: ${result.logFile}`);\n emit(` tail with: qavor logs ${name} -f`);\n }\n });\n\n program\n .command('down')\n .description('Stop a single running service gracefully.')\n .argument('<service>')\n .option('--grace <ms>', 'Grace period for SIGTERM before SIGKILL (default 10000).', '10000')\n .action(async (name: string, opts: { grace: string }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const jobs = resolveJobs(root.jobs);\n const ctx = await findService(name, jobs);\n const graceMs = Number.parseInt(opts.grace, 10);\n const res = await stopNativeService({\n paths: ctx.paths,\n service: name,\n manifestDir: ctx.manifestDir,\n ...(ctx.service.hooks ? { hooks: ctx.service.hooks } : {}),\n graceMs: Number.isFinite(graceMs) ? graceMs : 10_000,\n logger,\n });\n if (root.json) {\n emitJson({ service: name, stopped: res.stopped });\n } else {\n emit(`${res.stopped ? 'Stopped' : 'No-op'} ${name}`);\n }\n });\n\n program\n .command('logs')\n .description('Print or tail a service log file.')\n .argument('<service>')\n .option('-f, --follow', 'Follow the log file as new lines append.')\n .option('--bytes <n>', 'Initial bytes from the tail to print (default 16384).', '16384')\n .action(async (name: string, opts: { follow?: boolean; bytes: string }, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const jobs = resolveJobs(root.jobs);\n const ctx = await findService(name, jobs);\n const logFile = path.join(ctx.paths.logsDir, name, 'service.log');\n const ac = new AbortController();\n process.on('SIGINT', () => ac.abort());\n process.on('SIGTERM', () => ac.abort());\n await tailFile({\n file: logFile,\n out: process.stdout,\n follow: Boolean(opts.follow),\n signal: ac.signal,\n initialBytes: Number.parseInt(opts.bytes, 10) || 16 * 1024,\n });\n void root;\n });\n\n program\n .command('ps')\n .description('List services tracked by the supervisor.')\n .action(async (_opts: unknown, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const ws = await resolveWorkspace();\n const list = await listServicesState(ws.paths);\n if (root.json) {\n emitJson({ services: list });\n return;\n }\n if (list.length === 0) {\n emit('(no services tracked)');\n return;\n }\n const headers = ['SERVICE', 'STATUS', 'PID', 'UPTIME', 'LOG'];\n const data = list.map((s) => [\n s.service,\n s.status,\n s.pid !== null ? String(s.pid) : '-',\n s.uptimeSec !== null ? `${s.uptimeSec}s` : '-',\n s.logFile ?? '-',\n ]);\n const widths = headers.map((h, i) => Math.max(h.length, ...data.map((row) => (row[i] ?? '').length)));\n const fmt = (row: string[]): string => row.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' ');\n emit(fmt(headers));\n for (const row of data) emit(fmt(row));\n });\n}\n","import type { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { execa } from 'execa';\nimport { resolveWorkspace, readProjectManifest } from '../../workspace/locate.js';\nimport { resolveRepos } from '../../workspace/repos.js';\nimport { buildWorkspaceRegistry } from '../../manifest/discovery.js';\nimport { emit, emitJson, getLogger } from '../../util/logger.js';\nimport { inheritRootOptions } from '../options.js';\nimport { resolveJobs } from '../../util/concurrency.js';\nimport { ensureDir, globalCacheDir } from '../../util/fs.js';\nimport { loadManifestFile, type LoadedDocument } from '../../manifest/loader.js';\nimport type { ProjectManifest, ServiceManifest } from '../../manifest/types/index.js';\nimport { RuntimeFailure } from '../../util/exit-codes.js';\n\ninterface Check {\n name: string;\n status: 'ok' | 'warn' | 'fail';\n message?: string;\n hint?: string;\n}\n\nasync function runShell(cmd: string, cwd: string): Promise<{ ok: boolean; exitCode: number }> {\n try {\n const res = await execa('/bin/sh', ['-c', cmd], { cwd, reject: false });\n return { ok: res.exitCode === 0, exitCode: res.exitCode ?? -1 };\n } catch {\n return { ok: false, exitCode: -1 };\n }\n}\n\nexport function registerDoctor(program: Command): void {\n program\n .command('doctor')\n .description('Verify toolchain prerequisites, workspace paths, and per-service check_installed steps.')\n .action(async (_opts: unknown, cmd: Command) => {\n const root = inheritRootOptions(cmd);\n const logger = getLogger();\n const checks: Check[] = [];\n\n // git version\n try {\n const res = await execa('git', ['--version']);\n const version = res.stdout.trim().replace(/^git version /, '');\n const [maj, min] = version.split('.').map((s) => Number.parseInt(s, 10));\n if (Number.isFinite(maj) && Number.isFinite(min) && ((maj ?? 0) > 2 || ((maj ?? 0) === 2 && (min ?? 0) >= 30))) {\n checks.push({ name: 'git ≥ 2.30', status: 'ok', message: version });\n } else {\n checks.push({ name: 'git ≥ 2.30', status: 'warn', message: `found ${version}` });\n }\n } catch {\n checks.push({ name: 'git ≥ 2.30', status: 'fail', message: 'git not found', hint: 'Install git.' });\n }\n\n // docker (warn only at v0)\n try {\n await execa('docker', ['--version']);\n checks.push({ name: 'docker (optional v0)', status: 'ok' });\n } catch {\n checks.push({ name: 'docker (optional v0)', status: 'warn', message: 'docker not detected' });\n }\n\n // Workspace + state dirs writable\n try {\n const ws = await resolveWorkspace();\n await ensureDir(ws.paths.stateRoot);\n const probe = path.join(ws.paths.stateRoot, '.doctor-write-check');\n await fs.writeFile(probe, '');\n await fs.unlink(probe);\n checks.push({ name: 'workspace .qavor/ writable', status: 'ok', message: ws.paths.stateRoot });\n } catch (err) {\n checks.push({\n name: 'workspace .qavor/ writable',\n status: 'fail',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Global cache writable\n const cache = globalCacheDir();\n try {\n await ensureDir(cache);\n const probe = path.join(cache, '.doctor-write-check');\n await fs.writeFile(probe, '');\n await fs.unlink(probe);\n checks.push({ name: 'global cache writable', status: 'ok', message: cache });\n } catch (err) {\n checks.push({\n name: 'global cache writable',\n status: 'fail',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Per-service check_installed.cmd\n try {\n const ws = await resolveWorkspace();\n const project = await readProjectManifest(ws.projectManifestFile);\n const repos = resolveRepos({\n workspaceRoot: ws.paths.root,\n project: project.data as unknown as ProjectManifest,\n projectRepoPath: ws.projectRepoPath,\n });\n const repoMap = new Map(repos.map((r) => [r.name, r.dir]));\n repoMap.set('__project__', ws.projectRepoPath);\n const registry = await buildWorkspaceRegistry({\n workspaceRoot: ws.paths.root,\n repos: repoMap,\n concurrency: resolveJobs(root.jobs),\n });\n for (const entry of registry.entries) {\n if (entry.kind !== 'service') continue;\n const svc = entry.data as unknown as ServiceManifest;\n const checkCmd = svc.runtime?.native?.check_installed?.cmd;\n if (!checkCmd) {\n checks.push({\n name: `service ${entry.name}: check_installed`,\n status: 'warn',\n message: 'no runtime.native.check_installed.cmd',\n });\n continue;\n }\n const docs = await loadManifestFile(entry.file);\n const serviceDoc = docs[entry.docIndex] as LoadedDocument;\n const cwd = svc.runtime?.native?.check_installed?.cwd\n ? path.resolve(path.dirname(serviceDoc.file), svc.runtime.native.check_installed.cwd)\n : path.dirname(serviceDoc.file);\n const res = await runShell(checkCmd, cwd);\n if (res.ok) {\n checks.push({ name: `service ${entry.name}: check_installed`, status: 'ok' });\n } else {\n const installHint = svc.runtime?.native?.install?.cmd;\n const failCheck: Check = {\n name: `service ${entry.name}: check_installed`,\n status: 'fail',\n message: `exit ${res.exitCode}`,\n };\n if (installHint) failCheck.hint = `Hint: \\`${installHint}\\``;\n checks.push(failCheck);\n }\n }\n } catch (err) {\n // doctor still emits other checks even if not in a workspace\n logger.debug({ err: err instanceof Error ? err.message : String(err) }, 'doctor: workspace probe failed');\n }\n\n if (root.json) {\n emitJson({ checks, ok: checks.every((c) => c.status !== 'fail') });\n } else {\n for (const c of checks) {\n const sym = c.status === 'ok' ? '✓' : c.status === 'warn' ? '!' : '✗';\n let line = `${sym} ${c.status.toUpperCase().padEnd(5)} ${c.name}`;\n if (c.message) line += ` — ${c.message}`;\n emit(line);\n if (c.hint) emit(` ${c.hint}`);\n }\n }\n if (checks.some((c) => c.status === 'fail')) {\n throw new RuntimeFailure('doctor: one or more checks failed.');\n }\n });\n}\n"],"mappings":"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","names":["process","path","createHash","fs","path","fs","path","code","fs","path","fs","path","path","fs","path","path","fs","createHash","path","path","fs","fs","path","path","path","fs","path","fs","path","fs","path","pMap","path","path","pMap","path","pMap","fs","path","pMap","path","fs","pMap","createHash","createReadStream","fs","path","execa","path","fs","fs","raw","path","prior","provenance","execa","execa","path","fs","execa","createHash","createReadStream","pMap","fs","path","execa","fs","path","path","fs","path","fs","execa","main","fs","createReadStream","path","fs","createReadStream","path","path","path","fs","execa","execa","path","fs","process"]}
|