@g-abhishek/gitx 0.1.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +374 -3
- package/dist/ai/claudeAi.d.ts +35 -0
- package/dist/ai/claudeAi.d.ts.map +1 -0
- package/dist/ai/claudeAi.js +396 -0
- package/dist/ai/claudeAi.js.map +1 -0
- package/dist/ai/claudeCliAi.d.ts +27 -0
- package/dist/ai/claudeCliAi.d.ts.map +1 -0
- package/dist/ai/claudeCliAi.js +312 -0
- package/dist/ai/claudeCliAi.js.map +1 -0
- package/dist/ai/localClaudeAi.d.ts +2 -0
- package/dist/ai/localClaudeAi.d.ts.map +1 -0
- package/dist/ai/localClaudeAi.js +4 -0
- package/dist/ai/localClaudeAi.js.map +1 -0
- package/dist/ai/mockAi.d.ts +8 -1
- package/dist/ai/mockAi.d.ts.map +1 -1
- package/dist/ai/mockAi.js +57 -0
- package/dist/ai/mockAi.js.map +1 -1
- package/dist/ai/openAiAi.d.ts +33 -0
- package/dist/ai/openAiAi.d.ts.map +1 -0
- package/dist/ai/openAiAi.js +388 -0
- package/dist/ai/openAiAi.js.map +1 -0
- package/dist/ai/reviewHelpers.d.ts +66 -0
- package/dist/ai/reviewHelpers.d.ts.map +1 -0
- package/dist/ai/reviewHelpers.js +559 -0
- package/dist/ai/reviewHelpers.js.map +1 -0
- package/dist/ai/types.d.ts +247 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/cli/commands/ask.d.ts +27 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +230 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +16 -0
- package/dist/cli/commands/commit.d.ts.map +1 -0
- package/dist/cli/commands/commit.js +163 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/config.d.ts +4 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +666 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/implement.d.ts.map +1 -1
- package/dist/cli/commands/implement.js +149 -28
- package/dist/cli/commands/implement.js.map +1 -1
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +7 -54
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/port.d.ts +32 -0
- package/dist/cli/commands/port.d.ts.map +1 -0
- package/dist/cli/commands/port.js +554 -0
- package/dist/cli/commands/port.js.map +1 -0
- package/dist/cli/commands/pr/close.d.ts +15 -0
- package/dist/cli/commands/pr/close.d.ts.map +1 -0
- package/dist/cli/commands/pr/close.js +71 -0
- package/dist/cli/commands/pr/close.js.map +1 -0
- package/dist/cli/commands/pr/create.d.ts +17 -0
- package/dist/cli/commands/pr/create.d.ts.map +1 -1
- package/dist/cli/commands/pr/create.js +209 -5
- package/dist/cli/commands/pr/create.js.map +1 -1
- package/dist/cli/commands/pr/fixComments.d.ts.map +1 -1
- package/dist/cli/commands/pr/fixComments.js +77 -5
- package/dist/cli/commands/pr/fixComments.js.map +1 -1
- package/dist/cli/commands/pr/index.d.ts.map +1 -1
- package/dist/cli/commands/pr/index.js +4 -0
- package/dist/cli/commands/pr/index.js.map +1 -1
- package/dist/cli/commands/pr/list.d.ts.map +1 -1
- package/dist/cli/commands/pr/list.js +26 -3
- package/dist/cli/commands/pr/list.js.map +1 -1
- package/dist/cli/commands/pr/merge.d.ts +23 -0
- package/dist/cli/commands/pr/merge.d.ts.map +1 -0
- package/dist/cli/commands/pr/merge.js +191 -0
- package/dist/cli/commands/pr/merge.js.map +1 -0
- package/dist/cli/commands/pr/review.d.ts.map +1 -1
- package/dist/cli/commands/pr/review.js +123 -5
- package/dist/cli/commands/pr/review.js.map +1 -1
- package/dist/cli/commands/push.d.ts +16 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +166 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +24 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +414 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +34 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config.d.ts +20 -3
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +103 -24
- package/dist/config/config.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +70 -9
- package/dist/config/schema.js.map +1 -1
- package/dist/core/context.d.ts +13 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +2 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/gitx.d.ts +47 -0
- package/dist/core/gitx.d.ts.map +1 -1
- package/dist/core/gitx.js +204 -9
- package/dist/core/gitx.js.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/azure.d.ts +26 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +256 -0
- package/dist/providers/azure.js.map +1 -0
- package/dist/providers/base.d.ts +104 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +5 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/factory.d.ts +8 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +25 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/github.d.ts +19 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +291 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/gitlab.d.ts +19 -0
- package/dist/providers/gitlab.d.ts.map +1 -0
- package/dist/providers/gitlab.js +186 -0
- package/dist/providers/gitlab.js.map +1 -0
- package/dist/types/config.d.ts +53 -9
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/utils/azureAuth.d.ts +51 -0
- package/dist/utils/azureAuth.d.ts.map +1 -0
- package/dist/utils/azureAuth.js +172 -0
- package/dist/utils/azureAuth.js.map +1 -0
- package/dist/utils/git.d.ts +22 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +63 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/gitOps.d.ts +118 -0
- package/dist/utils/gitOps.d.ts.map +1 -0
- package/dist/utils/gitOps.js +380 -0
- package/dist/utils/gitOps.js.map +1 -0
- package/dist/utils/lockFile.d.ts +13 -0
- package/dist/utils/lockFile.d.ts.map +1 -0
- package/dist/utils/lockFile.js +54 -0
- package/dist/utils/lockFile.js.map +1 -0
- package/dist/utils/retry.d.ts +10 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +31 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/workflows/implement.d.ts +41 -0
- package/dist/workflows/implement.d.ts.map +1 -0
- package/dist/workflows/implement.js +219 -0
- package/dist/workflows/implement.js.map +1 -0
- package/dist/workflows/pr.d.ts +41 -0
- package/dist/workflows/pr.d.ts.map +1 -0
- package/dist/workflows/pr.js +285 -0
- package/dist/workflows/pr.js.map +1 -0
- package/dist/workflows/prAddress.d.ts +55 -0
- package/dist/workflows/prAddress.d.ts.map +1 -0
- package/dist/workflows/prAddress.js +349 -0
- package/dist/workflows/prAddress.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * gitx sync\n *\n * Bring the current branch up to date with its base branch so a PR can be\n * merged cleanly. Uses rebase by default (keeps a linear history).\n *\n * Flow:\n * 1. Detect base branch (same logic as `gitx pr create`)\n * 2. git fetch origin\n * 3. git rebase origin/<base> (or --merge: git merge origin/<base>)\n * 4a. No conflicts → git push --force-with-lease → \"ready to merge\"\n * 4b. Conflicts → list conflicting files, instruct user how to resolve,\n * then run `gitx sync --continue` to finish\n *\n * Usage:\n * gitx sync # rebase onto auto-detected base\n * gitx sync --base main # rebase onto a specific base\n * gitx sync --strategy merge # merge base into branch instead of rebase\n * gitx sync --continue # after manually resolving conflicts\n * gitx sync --abort # abort an in-progress rebase/merge\n */\n\nimport type { Command } from \"commander\";\nimport ora from \"ora\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { confirm, select } from \"@inquirer/prompts\";\nimport { logger } from \"../../logger/logger.js\";\nimport { getCurrentBranch, detectBaseBranch } from \"../../utils/gitOps.js\";\nimport { isInsideGitRepo } from \"../../utils/git.js\";\nimport { GitxError } from \"../../utils/errors.js\";\nimport { Gitx } from \"../../core/gitx.js\";\nimport { createProvider } from \"../../providers/factory.js\";\nimport { runAddressWorkflow, filterUnresolvedInlineComments } from \"../../workflows/prAddress.js\";\n\nconst execFileAsync = promisify(execFile);\n\nasync function git(\n args: string[],\n cwd: string\n): Promise<{ stdout: string; stderr: string }> {\n try {\n const result = await execFileAsync(\"git\", args, { cwd });\n return { stdout: result.stdout.trim(), stderr: \"\" };\n } catch (err: unknown) {\n const e = err as { stdout?: string; stderr?: string; message?: string };\n return {\n stdout: e.stdout?.trim() ?? \"\",\n stderr: (e.stderr ?? e.message ?? String(err)).trim(),\n };\n }\n}\n\n/** Returns list of files that currently have conflict markers. */\nasync function getConflictingFiles(cwd: string): Promise<string[]> {\n const { stdout } = await git(\n [\"diff\", \"--name-only\", \"--diff-filter=U\"],\n cwd\n );\n return stdout.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n}\n\n/** Check whether a rebase or merge is currently in progress. */\nasync function getInProgressOperation(\n cwd: string\n): Promise<\"rebase\" | \"merge\" | null> {\n const { stdout: gitDir } = await git([\"rev-parse\", \"--git-dir\"], cwd);\n const base = gitDir || \".git\";\n\n const { stdout: rebaseDir } = await git(\n [\"rev-parse\", \"--git-path\", \"rebase-merge\"],\n cwd\n );\n const { stdout: rebaseApply } = await git(\n [\"rev-parse\", \"--git-path\", \"rebase-apply\"],\n cwd\n );\n const { stdout: mergeHead } = await git(\n [\"rev-parse\", \"--git-path\", \"MERGE_HEAD\"],\n cwd\n );\n\n // Check if the paths actually exist on disk\n const { existsSync } = await import(\"node:fs\");\n if (existsSync(rebaseDir) || existsSync(rebaseApply)) return \"rebase\";\n if (existsSync(mergeHead) || existsSync(`${base}/MERGE_HEAD`)) return \"merge\";\n return null;\n}\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command(\"sync\")\n .description(\"🔄 Sync current branch with its base branch (merge by default, or --strategy rebase)\")\n .option(\"--base <branch>\", \"Base branch to sync with (auto-detected if omitted)\")\n .option(\n \"--strategy <strategy>\",\n \"Sync strategy: merge (default) | rebase\",\n \"merge\"\n )\n .option(\"--continue\", \"Continue after manually resolving conflicts\")\n .option(\"--abort\", \"Abort an in-progress rebase or merge\")\n .action(async (opts: {\n base?: string;\n strategy: string;\n continue?: boolean;\n abort?: boolean;\n }) => {\n const cwd = process.cwd();\n\n if (!(await isInsideGitRepo(cwd))) {\n throw new GitxError(\"Not inside a git repository. cd into your project folder first.\", { exitCode: 2 });\n }\n\n const strategy = opts.strategy === \"rebase\" ? \"rebase\" : \"merge\";\n\n // ── Handle --abort ─────────────────────────────────────────────────────\n if (opts.abort) {\n const op = await getInProgressOperation(cwd);\n if (!op) {\n logger.info(\"No rebase or merge in progress.\");\n return;\n }\n const abortSpinner = ora(`Aborting ${op}…`).start();\n const { stderr } = await git([op, \"--abort\"], cwd);\n if (stderr) {\n abortSpinner.fail(`Abort failed: ${stderr}`);\n process.exitCode = 1;\n return;\n }\n abortSpinner.succeed(`${op.charAt(0).toUpperCase() + op.slice(1)} aborted. Branch restored to its previous state.`);\n return;\n }\n\n // ── Handle --continue ──────────────────────────────────────────────────\n if (opts.continue) {\n const op = await getInProgressOperation(cwd);\n if (!op) {\n logger.info(\"No rebase or merge in progress — nothing to continue.\");\n return;\n }\n\n // Check if all conflicts are resolved\n const conflicts = await getConflictingFiles(cwd);\n if (conflicts.length > 0) {\n logger.error(`\\n❌ There are still unresolved conflicts:\\n`);\n for (const f of conflicts) logger.info(` • ${f}`);\n logger.info(`\\n Fix the conflicts above, then:\\n`);\n logger.info(` git add <file> # mark each file as resolved`);\n logger.info(` gitx sync --continue # resume\\n`);\n process.exitCode = 1;\n return;\n }\n\n // Stage all resolved files and continue\n await git([\"add\", \"-A\"], cwd);\n const continueSpinner = ora(`Continuing ${op}…`).start();\n\n const env = { ...process.env, GIT_EDITOR: \"true\" }; // skip editor for commit msg\n const { stderr } = await execFileAsync(\n \"git\",\n [op, \"--continue\"],\n { cwd, env }\n ).then(\n (r) => ({ stdout: r.stdout, stderr: \"\" }),\n (e: { stderr?: string; message?: string }) => ({\n stdout: \"\",\n stderr: (e.stderr ?? e.message ?? \"\").trim(),\n })\n );\n\n if (stderr && !stderr.includes(\"Successfully\")) {\n continueSpinner.fail(`Could not continue ${op}: ${stderr}`);\n process.exitCode = 1;\n return;\n }\n continueSpinner.succeed(`${op.charAt(0).toUpperCase() + op.slice(1)} completed ✓`);\n\n // Rebase rewrites history; merge does not\n await pushAfterSync(cwd, op === \"rebase\");\n return;\n }\n\n // ── Normal sync flow ───────────────────────────────────────────────────\n const head = await getCurrentBranch(cwd);\n\n // Resolve base\n let base: string;\n if (opts.base) {\n base = opts.base;\n logger.info(`📌 Base branch (provided): ${base}`);\n } else {\n const detectSpinner = ora(\"Detecting base branch…\").start();\n base = await detectBaseBranch(cwd);\n detectSpinner.succeed(`Base branch: ${base}`);\n }\n\n if (head === base) {\n logger.info(`✨ Already on the base branch \"${base}\" — nothing to sync.`);\n return;\n }\n\n // ── Check for unresolved PR review comments BEFORE syncing ────────────\n // If the current branch has an open PR with unresolved inline comments,\n // offer to resolve them now. Fixes are committed onto the branch; the\n // sync then rebases/merges and pushes everything together.\n await checkAndOfferAddressComments(cwd, head);\n\n logger.info(`\\n🔄 Syncing ${head} onto origin/${base}\\n`);\n\n // Fetch latest\n const fetchSpinner = ora(\"Fetching latest from origin…\").start();\n const { stderr: fetchErr } = await git([\"fetch\", \"origin\"], cwd);\n if (fetchErr && !fetchErr.includes(\"->\")) {\n fetchSpinner.fail(`Fetch failed: ${fetchErr}`);\n process.exitCode = 1;\n return;\n }\n fetchSpinner.succeed(\"Fetched latest.\");\n\n // Check if we're already up to date\n const { stdout: behindCount } = await git(\n [\"rev-list\", \"--count\", `HEAD..origin/${base}`],\n cwd\n );\n if (behindCount === \"0\") {\n logger.success(`✅ \"${head}\" is already up to date with origin/${base}. Ready to merge!`);\n return;\n }\n\n // Run rebase or merge\n const syncSpinner = ora(\n strategy === \"rebase\"\n ? `Rebasing ${head} onto origin/${base}…`\n : `Merging origin/${base} into ${head}…`\n ).start();\n\n const syncArgs =\n strategy === \"rebase\"\n ? [\"rebase\", `origin/${base}`]\n : [\"merge\", `origin/${base}`, \"--no-edit\"];\n\n const { stderr: syncErr } = await git(syncArgs, cwd);\n\n // Detect conflict — try AI resolution first\n const conflicts = await getConflictingFiles(cwd);\n if (conflicts.length > 0) {\n syncSpinner.fail(`Conflicts detected in ${conflicts.length} file(s) — attempting AI resolution…`);\n\n // Try to load an AI client\n let gitx: Gitx | null = null;\n try {\n gitx = await Gitx.fromCwd(cwd);\n } catch {\n // No AI available; fall through to manual instructions\n }\n\n if (gitx && await Gitx.isAiAvailable(gitx.config)) {\n const resolved: string[] = [];\n const needsManual: string[] = [];\n\n for (const filePath of conflicts) {\n const absPath = resolvePath(cwd, filePath);\n let content: string;\n try {\n content = await readFile(absPath, \"utf8\");\n } catch {\n needsManual.push(filePath);\n continue;\n }\n\n // Skip binary files (no conflict markers)\n if (!content.includes(\"<<<<<<<\")) {\n needsManual.push(filePath);\n continue;\n }\n\n const resolveSpinner = ora(` 🤖 AI resolving: ${filePath}`).start();\n try {\n const result = await gitx.ai.resolveConflict(filePath, content);\n\n if (result.confidence === \"high\") {\n await writeFile(absPath, result.resolved, \"utf8\");\n resolveSpinner.succeed(` ✅ Auto-resolved: ${filePath} — ${result.explanation}`);\n resolved.push(filePath);\n } else {\n resolveSpinner.warn(` ⚠️ Low confidence: ${filePath} — ${result.explanation}`);\n logger.info(`\\n AI proposed resolution (low confidence). Preview:\\n`);\n // Show first 40 lines of the resolved content as a preview\n const preview = result.resolved.split(\"\\n\").slice(0, 40).join(\"\\n\");\n logger.info(preview);\n if (result.resolved.split(\"\\n\").length > 40) {\n logger.info(` … (${result.resolved.split(\"\\n\").length - 40} more lines)`);\n }\n logger.info(\"\");\n\n let apply = false;\n try {\n apply = await confirm({\n message: `Apply AI resolution for ${filePath}?`,\n default: true,\n });\n } catch {\n apply = false;\n }\n\n if (apply) {\n await writeFile(absPath, result.resolved, \"utf8\");\n logger.success(` ✅ Applied: ${filePath}`);\n resolved.push(filePath);\n } else {\n logger.info(` ⏭️ Skipped: ${filePath} — resolve manually`);\n needsManual.push(filePath);\n }\n }\n } catch {\n resolveSpinner.fail(` ❌ AI resolution failed for: ${filePath}`);\n needsManual.push(filePath);\n }\n }\n\n if (needsManual.length > 0) {\n logger.error(`\\n⚠️ ${needsManual.length} file(s) still need manual resolution:\\n`);\n for (const f of needsManual) logger.info(` • ${f}`);\n logger.info(`\\n Steps to finish:\\n`);\n logger.info(` 1. Open each file and fix the conflict markers (<<<<, ====, >>>>)`);\n logger.info(` 2. Mark resolved: git add <file>`);\n logger.info(` 3. Finish sync: gitx sync --continue`);\n logger.info(` 4. Retry merge: gitx pr merge <number>\\n`);\n logger.info(` To give up and go back: gitx sync --abort\\n`);\n process.exitCode = 1;\n return;\n }\n\n // All resolved — stage and continue\n if (resolved.length > 0) {\n logger.success(`\\n✅ AI resolved all ${resolved.length} conflict(s). Staging and continuing…\\n`);\n await git([\"add\", \"-A\"], cwd);\n\n const env = { ...process.env, GIT_EDITOR: \"true\" };\n const { stderr: contErr } = await execFileAsync(\n \"git\",\n [strategy === \"rebase\" ? \"rebase\" : \"merge\", \"--continue\"],\n { cwd, env }\n ).then(\n (r) => ({ stdout: r.stdout, stderr: \"\" }),\n (e: { stderr?: string; message?: string }) => ({\n stdout: \"\",\n stderr: (e.stderr ?? e.message ?? \"\").trim(),\n })\n );\n\n if (contErr && !contErr.toLowerCase().includes(\"successfully\")) {\n logger.error(`Could not continue ${strategy}: ${contErr}`);\n process.exitCode = 1;\n return;\n }\n }\n } else {\n // No AI — fall back to manual instructions\n logger.error(`\\n⚠️ Merge conflicts in ${conflicts.length} file(s):\\n`);\n for (const f of conflicts) logger.info(` • ${f}`);\n logger.info(`\\n Steps to resolve:\\n`);\n logger.info(` 1. Open each file and fix the conflict markers (<<<<, ====, >>>>)`);\n logger.info(` 2. Mark resolved: git add <file>`);\n logger.info(` 3. Finish sync: gitx sync --continue`);\n logger.info(` 4. Retry merge: gitx pr merge <number>\\n`);\n logger.info(` To give up and go back: gitx sync --abort\\n`);\n process.exitCode = 1;\n return;\n }\n }\n\n if (syncErr && !syncErr.toLowerCase().includes(\"successfully\")) {\n syncSpinner.fail(`Sync failed: ${syncErr}`);\n process.exitCode = 1;\n return;\n }\n\n syncSpinner.succeed(\n strategy === \"rebase\"\n ? `Rebased ${head} onto origin/${base} ✓`\n : `Merged origin/${base} into ${head} ✓`\n );\n\n // Rebase rewrites history → force-with-lease; merge → plain push\n await pushAfterSync(cwd, strategy === \"rebase\");\n });\n}\n\n/**\n * Before syncing, look up any open PR for the current branch.\n * If it has unresolved inline review comments, ask the user:\n * - \"Resolve comments first, then sync\" → address + commit, sync continues\n * - \"Sync normally\" → proceed immediately\n *\n * Fixes are committed using \"commit-no-push\" mode so the sync rebase/merge\n * picks them up and pushes everything together in a single push.\n */\nasync function checkAndOfferAddressComments(cwd: string, currentBranch: string): Promise<void> {\n let gitx: Gitx | null = null;\n try {\n gitx = await Gitx.fromCwd(cwd);\n if (!await Gitx.isAiAvailable(gitx.config)) return;\n } catch {\n return; // no gitx config — skip silently\n }\n\n let prNumber: number | null = null;\n let unresolvedCount = 0;\n\n try {\n const ctx = await gitx.getRepoContext();\n const provider = createProvider(ctx);\n\n // Find the open PR for the current branch\n const prs = await provider.listPRs(ctx.repoSlug);\n const openPr = prs.find((p) => p.head === currentBranch && p.state === \"open\");\n if (!openPr) return;\n\n prNumber = openPr.number;\n\n // Use the shared helper: root inline comments with no \"✅ Addressed\" reply yet\n const allComments = await provider.getPRComments(ctx.repoSlug, prNumber);\n unresolvedCount = filterUnresolvedInlineComments(allComments).length;\n\n if (unresolvedCount === 0) return;\n } catch {\n return; // provider error — don't block the sync\n }\n\n // ── Surface the choice ──────────────────────────────────────────────────────\n logger.info(`\\n💬 PR #${prNumber} has ${unresolvedCount} unresolved review comment(s).\\n`);\n\n let choice: string;\n try {\n choice = await select({\n message: \"How would you like to proceed?\",\n choices: [\n {\n name: `Resolve comments first, then sync (AI generates fixes → you approve → commit → sync)`,\n value: \"resolve\",\n },\n {\n name: `Sync normally (skip comment resolution, proceed with merge)`,\n value: \"skip\",\n },\n ],\n });\n } catch {\n return; // Ctrl-C → skip\n }\n\n if (choice === \"skip\") {\n logger.info(\"⏭️ Skipping comment resolution — proceeding with sync.\\n\");\n return;\n }\n\n // ── Resolve comments (commit but don't push — sync handles the push) ───────\n logger.info(`\\n🔧 Resolving ${unresolvedCount} review comment(s) on PR #${prNumber}…\\n`);\n try {\n const result = await runAddressWorkflow(gitx!, prNumber, { mode: \"commit-no-push\" });\n const applied = result.addressed.filter((a) => a.applied).length;\n const skipped = result.addressed.filter((a) => a.skipped).length;\n\n if (applied > 0) {\n logger.success(`✅ ${applied} fix(es) committed.${skipped > 0 ? ` (${skipped} skipped)` : \"\"}`);\n logger.info(\" Sync will rebase these commits and push everything together.\\n\");\n } else {\n logger.info(\" No fixes applied — continuing with normal sync.\\n\");\n }\n } catch (err) {\n logger.warn(`⚠️ Comment resolution error: ${(err as Error).message}\\n Continuing with sync.\\n`);\n }\n}\n\nasync function pushAfterSync(cwd: string, forceWithLease = false): Promise<void> {\n // Rebase rewrites history → requires --force-with-lease.\n // Merge does not rewrite history → plain push is fine.\n const pushArgs = forceWithLease\n ? [\"push\", \"--force-with-lease\"]\n : [\"push\"];\n\n const label = forceWithLease ? \"Pushing (force-with-lease)…\" : \"Pushing…\";\n const pushSpinner = ora(label).start();\n const { stderr } = await git(pushArgs, cwd);\n if (stderr && stderr.includes(\"error\")) {\n pushSpinner.fail(`Push failed: ${stderr}`);\n const hint = forceWithLease ? \"git push --force-with-lease\" : \"git push\";\n logger.info(` Try: ${hint}`);\n process.exitCode = 1;\n return;\n }\n pushSpinner.succeed(\"Pushed ✓\");\n logger.success(`\\n✅ Branch is now up to date. Run \\`gitx pr merge <number>\\` to merge.\\n`);\n}\n"]}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAaA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD1D"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { registerInitCommand } from "./commands/init.js";
|
|
3
|
+
import { registerCommitCommand } from "./commands/commit.js";
|
|
4
|
+
import { registerPushCommand } from "./commands/push.js";
|
|
5
|
+
import { registerSyncCommand } from "./commands/sync.js";
|
|
3
6
|
import { registerImplementCommand } from "./commands/implement.js";
|
|
4
7
|
import { registerPrCommands } from "./commands/pr/index.js";
|
|
8
|
+
import { registerConfigCommand } from "./commands/config.js";
|
|
9
|
+
import { registerAskCommand } from "./commands/ask.js";
|
|
10
|
+
import { registerPortCommand } from "./commands/port.js";
|
|
5
11
|
import { logger } from "../logger/logger.js";
|
|
6
12
|
import { GitxError } from "../utils/errors.js";
|
|
7
13
|
export async function runCli(argv) {
|
|
@@ -9,24 +15,46 @@ export async function runCli(argv) {
|
|
|
9
15
|
program
|
|
10
16
|
.name("gitx")
|
|
11
17
|
.description("🧠🤝 AI-powered Git workflow automation CLI")
|
|
12
|
-
.version("0.1.
|
|
18
|
+
.version("0.1.3");
|
|
13
19
|
registerInitCommand(program);
|
|
20
|
+
registerCommitCommand(program);
|
|
21
|
+
registerPushCommand(program);
|
|
22
|
+
registerSyncCommand(program);
|
|
23
|
+
registerConfigCommand(program);
|
|
14
24
|
registerImplementCommand(program);
|
|
15
25
|
registerPrCommands(program);
|
|
26
|
+
registerAskCommand(program);
|
|
27
|
+
registerPortCommand(program);
|
|
16
28
|
program.showHelpAfterError(true);
|
|
17
29
|
try {
|
|
18
30
|
await program.parseAsync(argv);
|
|
19
31
|
}
|
|
20
32
|
catch (error) {
|
|
21
33
|
if (error instanceof GitxError) {
|
|
22
|
-
logger.error(error.message);
|
|
23
|
-
if (
|
|
24
|
-
|
|
34
|
+
logger.error(`\n${error.message}`);
|
|
35
|
+
// Only show the cause if it adds useful info (not just an AxiosError wrapper)
|
|
36
|
+
if (error.cause && !(error.cause instanceof Error && error.message.includes(error.cause.message))) {
|
|
37
|
+
const causeMsg = error.cause instanceof Error
|
|
38
|
+
? error.cause.message
|
|
39
|
+
: String(error.cause);
|
|
40
|
+
// Strip noisy internal prefixes
|
|
41
|
+
const clean = causeMsg.replace(/^AxiosError:\s*/i, "").replace(/^Error:\s*/i, "");
|
|
42
|
+
if (clean && clean !== error.message) {
|
|
43
|
+
logger.warn(`Details: ${clean}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
25
46
|
process.exitCode = error.exitCode;
|
|
26
47
|
return;
|
|
27
48
|
}
|
|
28
|
-
|
|
29
|
-
|
|
49
|
+
// Unknown errors — show cleanly without a stack dump
|
|
50
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
51
|
+
logger.error(`\nUnexpected error: ${msg}`);
|
|
52
|
+
if (process.env["GITX_DEBUG"]) {
|
|
53
|
+
console.error(error);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger.warn("Set GITX_DEBUG=1 for full stack trace.");
|
|
57
|
+
}
|
|
30
58
|
process.exitCode = 1;
|
|
31
59
|
}
|
|
32
60
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,6CAA6C,CAAC;SAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,kBAAkB,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command } from \"commander\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerCommitCommand } from \"./commands/commit.js\";\nimport { registerPushCommand } from \"./commands/push.js\";\nimport { registerSyncCommand } from \"./commands/sync.js\";\nimport { registerImplementCommand } from \"./commands/implement.js\";\nimport { registerPrCommands } from \"./commands/pr/index.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAskCommand } from \"./commands/ask.js\";\nimport { registerPortCommand } from \"./commands/port.js\";\nimport { logger } from \"../logger/logger.js\";\nimport { GitxError } from \"../utils/errors.js\";\n\nexport async function runCli(argv: string[]): Promise<void> {\n const program = new Command();\n\n program\n .name(\"gitx\")\n .description(\"🧠🤝 AI-powered Git workflow automation CLI\")\n .version(\"0.1.3\");\n\n registerInitCommand(program);\n registerCommitCommand(program);\n registerPushCommand(program);\n registerSyncCommand(program);\n registerConfigCommand(program);\n registerImplementCommand(program);\n registerPrCommands(program);\n registerAskCommand(program);\n registerPortCommand(program);\n\n program.showHelpAfterError(true);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof GitxError) {\n logger.error(`\\n${error.message}`);\n // Only show the cause if it adds useful info (not just an AxiosError wrapper)\n if (error.cause && !(error.cause instanceof Error && error.message.includes((error.cause as Error).message))) {\n const causeMsg = error.cause instanceof Error\n ? error.cause.message\n : String(error.cause);\n // Strip noisy internal prefixes\n const clean = causeMsg.replace(/^AxiosError:\\s*/i, \"\").replace(/^Error:\\s*/i, \"\");\n if (clean && clean !== error.message) {\n logger.warn(`Details: ${clean}`);\n }\n }\n process.exitCode = error.exitCode;\n return;\n }\n\n // Unknown errors — show cleanly without a stack dump\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`\\nUnexpected error: ${msg}`);\n if (process.env[\"GITX_DEBUG\"]) {\n console.error(error);\n } else {\n logger.warn(\"Set GITX_DEBUG=1 for full stack trace.\");\n }\n process.exitCode = 1;\n }\n}\n"]}
|
package/dist/config/config.d.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config system — single source of truth: ~/.gitxrc
|
|
3
|
+
*
|
|
4
|
+
* All reads and writes go to exactly one file: ~/.gitxrc
|
|
5
|
+
* No local project-level config files are searched or created.
|
|
6
|
+
* This eliminates the class of bugs where a stale local config
|
|
7
|
+
* silently shadows the global one.
|
|
8
|
+
*/
|
|
1
9
|
import type { GitxConfig } from "../types/config.js";
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
4
|
-
|
|
10
|
+
/** The one and only config file path. Always ~/.gitxrc */
|
|
11
|
+
export declare function getConfigPath(): string;
|
|
12
|
+
/** Load config from ~/.gitxrc */
|
|
13
|
+
export declare function loadConfig(_cwd?: string): Promise<GitxConfig>;
|
|
14
|
+
/** Save config to ~/.gitxrc. Returns the path written. */
|
|
15
|
+
export declare function saveConfig(config: GitxConfig, _cwd?: string): Promise<string>;
|
|
16
|
+
/** @deprecated Use saveConfig — writes to ~/.gitxrc */
|
|
17
|
+
export declare function saveLocalConfig(config: GitxConfig, _cwd?: string): Promise<void>;
|
|
18
|
+
/** @deprecated Use getConfigPath */
|
|
19
|
+
export declare function getGlobalConfigPath(): string;
|
|
20
|
+
/** @deprecated No longer needed — always returns getConfigPath() */
|
|
21
|
+
export declare function findConfigPath(_cwd?: string): Promise<string>;
|
|
5
22
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMrD,0DAA0D;AAC1D,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,iCAAiC;AACjC,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAwBnE;AAED,0DAA0D;AAC1D,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInF;AAID,uDAAuD;AACvD,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAED,oCAAoC;AACpC,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,oEAAoE;AACpE,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE"}
|
package/dist/config/config.js
CHANGED
|
@@ -1,34 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Config system — single source of truth: ~/.gitxrc
|
|
3
|
+
*
|
|
4
|
+
* All reads and writes go to exactly one file: ~/.gitxrc
|
|
5
|
+
* No local project-level config files are searched or created.
|
|
6
|
+
* This eliminates the class of bugs where a stale local config
|
|
7
|
+
* silently shadows the global one.
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
10
|
+
import { homedir } from "node:os";
|
|
2
11
|
import { resolve } from "node:path";
|
|
3
12
|
import { GitxError } from "../utils/errors.js";
|
|
4
13
|
import { isGitxConfig } from "./schema.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const parsed = JSON.parse(raw);
|
|
13
|
-
if (!isGitxConfig(parsed)) {
|
|
14
|
-
throw new GitxError(`Invalid config in ${filename}.`, { exitCode: 2 });
|
|
15
|
-
}
|
|
16
|
-
return parsed;
|
|
17
|
-
}
|
|
18
|
-
throw new GitxError("No gitx config found. Run `gitx init` first.", { exitCode: 2 });
|
|
19
|
-
}
|
|
20
|
-
export async function saveConfig(config, cwd = process.cwd()) {
|
|
21
|
-
const fullPath = resolve(cwd, "gitx.config.json");
|
|
22
|
-
const contents = JSON.stringify(config, null, 2) + "\n";
|
|
23
|
-
await writeFile(fullPath, contents, "utf8");
|
|
14
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
15
|
+
/** The one and only config file path. Always ~/.gitxrc */
|
|
16
|
+
export function getConfigPath() {
|
|
17
|
+
const home = homedir();
|
|
18
|
+
if (!home)
|
|
19
|
+
throw new GitxError("Could not determine home directory.", { exitCode: 2 });
|
|
20
|
+
return resolve(home, ".gitxrc");
|
|
24
21
|
}
|
|
25
|
-
|
|
22
|
+
/** Load config from ~/.gitxrc */
|
|
23
|
+
export async function loadConfig(_cwd) {
|
|
24
|
+
const path = getConfigPath();
|
|
25
|
+
let raw;
|
|
26
26
|
try {
|
|
27
|
-
await
|
|
28
|
-
return true;
|
|
27
|
+
raw = await readFile(path, "utf8");
|
|
29
28
|
}
|
|
30
29
|
catch {
|
|
31
|
-
|
|
30
|
+
throw new GitxError(`No gitx config found at ${path}. Run \`gitx init\` to set up your credentials.`, { exitCode: 2 });
|
|
31
|
+
}
|
|
32
|
+
let parsed;
|
|
33
|
+
try {
|
|
34
|
+
parsed = JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new GitxError(`Config file at ${path} is not valid JSON. Fix or delete it and re-run \`gitx init\`.`, { exitCode: 2 });
|
|
38
|
+
}
|
|
39
|
+
const migrated = migrateLegacyConfig(parsed);
|
|
40
|
+
if (!isGitxConfig(migrated)) {
|
|
41
|
+
throw new GitxError(`Config at ${path} has an unexpected structure. Re-run \`gitx init\`.`, { exitCode: 2 });
|
|
42
|
+
}
|
|
43
|
+
return migrated;
|
|
44
|
+
}
|
|
45
|
+
/** Save config to ~/.gitxrc. Returns the path written. */
|
|
46
|
+
export async function saveConfig(config, _cwd) {
|
|
47
|
+
const path = getConfigPath();
|
|
48
|
+
await writeFile(path, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
49
|
+
return path;
|
|
50
|
+
}
|
|
51
|
+
// ─── Legacy compat (kept so init.ts still compiles) ──────────────────────────
|
|
52
|
+
/** @deprecated Use saveConfig — writes to ~/.gitxrc */
|
|
53
|
+
export async function saveLocalConfig(config, _cwd) {
|
|
54
|
+
await saveConfig(config);
|
|
55
|
+
}
|
|
56
|
+
/** @deprecated Use getConfigPath */
|
|
57
|
+
export function getGlobalConfigPath() {
|
|
58
|
+
return getConfigPath();
|
|
59
|
+
}
|
|
60
|
+
/** @deprecated No longer needed — always returns getConfigPath() */
|
|
61
|
+
export async function findConfigPath(_cwd) {
|
|
62
|
+
return getConfigPath();
|
|
63
|
+
}
|
|
64
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Migrate old config formats to the current structure.
|
|
67
|
+
*
|
|
68
|
+
* Handles two legacy shapes:
|
|
69
|
+
* 1. Single git-provider top-level: { provider: "github", token: "..." }
|
|
70
|
+
* → { providers: { github: { token } } }
|
|
71
|
+
*
|
|
72
|
+
* 2. Old single AI config: { ai: { provider: "claude", apiKey: "..." } }
|
|
73
|
+
* → { aiProviders: { claude: { apiKey } }, defaultAiProvider: "claude" }
|
|
74
|
+
* (and removes the old `ai` field)
|
|
75
|
+
*/
|
|
76
|
+
function migrateLegacyConfig(value) {
|
|
77
|
+
if (typeof value !== "object" || value === null)
|
|
78
|
+
return value;
|
|
79
|
+
const rec = { ...value };
|
|
80
|
+
// 1. Migrate flat single-provider format → providers object
|
|
81
|
+
if (!(typeof rec["providers"] === "object" && rec["providers"] !== null)) {
|
|
82
|
+
const provider = rec["provider"];
|
|
83
|
+
const token = rec["token"];
|
|
84
|
+
const defaultBranch = rec["defaultBranch"];
|
|
85
|
+
if ((provider === "github" || provider === "gitlab" || provider === "azure") &&
|
|
86
|
+
typeof token === "string" &&
|
|
87
|
+
token.trim().length > 0) {
|
|
88
|
+
return {
|
|
89
|
+
providers: { [provider]: { token } },
|
|
90
|
+
...(typeof defaultBranch === "string" ? { defaultBranch } : {}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// 2. Migrate old ai: { provider, apiKey } → aiProviders + defaultAiProvider
|
|
95
|
+
if (rec["ai"] && !rec["aiProviders"]) {
|
|
96
|
+
const ai = rec["ai"];
|
|
97
|
+
const aiProv = ai["provider"];
|
|
98
|
+
const aiKey = ai["apiKey"];
|
|
99
|
+
const aiModel = ai["model"];
|
|
100
|
+
if (typeof aiProv === "string") {
|
|
101
|
+
rec["aiProviders"] = {
|
|
102
|
+
[aiProv]: {
|
|
103
|
+
...(typeof aiKey === "string" && aiKey.trim() ? { apiKey: aiKey } : {}),
|
|
104
|
+
...(typeof aiModel === "string" && aiModel.trim() ? { model: aiModel } : {}),
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
rec["defaultAiProvider"] = aiProv;
|
|
108
|
+
delete rec["ai"];
|
|
109
|
+
}
|
|
32
110
|
}
|
|
111
|
+
return rec;
|
|
33
112
|
}
|
|
34
113
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Config system — single source of truth: ~/.gitxrc\n *\n * All reads and writes go to exactly one file: ~/.gitxrc\n * No local project-level config files are searched or created.\n * This eliminates the class of bugs where a stale local config\n * silently shadows the global one.\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\nimport type { GitxConfig } from \"../types/config.js\";\nimport { GitxError } from \"../utils/errors.js\";\nimport { isGitxConfig } from \"./schema.js\";\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/** The one and only config file path. Always ~/.gitxrc */\nexport function getConfigPath(): string {\n const home = homedir();\n if (!home) throw new GitxError(\"Could not determine home directory.\", { exitCode: 2 });\n return resolve(home, \".gitxrc\");\n}\n\n/** Load config from ~/.gitxrc */\nexport async function loadConfig(_cwd?: string): Promise<GitxConfig> {\n const path = getConfigPath();\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n throw new GitxError(\n `No gitx config found at ${path}. Run \\`gitx init\\` to set up your credentials.`,\n { exitCode: 2 }\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new GitxError(`Config file at ${path} is not valid JSON. Fix or delete it and re-run \\`gitx init\\`.`, { exitCode: 2 });\n }\n\n const migrated = migrateLegacyConfig(parsed);\n if (!isGitxConfig(migrated)) {\n throw new GitxError(`Config at ${path} has an unexpected structure. Re-run \\`gitx init\\`.`, { exitCode: 2 });\n }\n return migrated;\n}\n\n/** Save config to ~/.gitxrc. Returns the path written. */\nexport async function saveConfig(config: GitxConfig, _cwd?: string): Promise<string> {\n const path = getConfigPath();\n await writeFile(path, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n return path;\n}\n\n// ─── Legacy compat (kept so init.ts still compiles) ──────────────────────────\n\n/** @deprecated Use saveConfig — writes to ~/.gitxrc */\nexport async function saveLocalConfig(config: GitxConfig, _cwd?: string): Promise<void> {\n await saveConfig(config);\n}\n\n/** @deprecated Use getConfigPath */\nexport function getGlobalConfigPath(): string {\n return getConfigPath();\n}\n\n/** @deprecated No longer needed — always returns getConfigPath() */\nexport async function findConfigPath(_cwd?: string): Promise<string> {\n return getConfigPath();\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\n/**\n * Migrate old config formats to the current structure.\n *\n * Handles two legacy shapes:\n * 1. Single git-provider top-level: { provider: \"github\", token: \"...\" }\n * → { providers: { github: { token } } }\n *\n * 2. Old single AI config: { ai: { provider: \"claude\", apiKey: \"...\" } }\n * → { aiProviders: { claude: { apiKey } }, defaultAiProvider: \"claude\" }\n * (and removes the old `ai` field)\n */\nfunction migrateLegacyConfig(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const rec = { ...(value as Record<string, unknown>) };\n\n // 1. Migrate flat single-provider format → providers object\n if (!(typeof rec[\"providers\"] === \"object\" && rec[\"providers\"] !== null)) {\n const provider = rec[\"provider\"];\n const token = rec[\"token\"];\n const defaultBranch = rec[\"defaultBranch\"];\n if (\n (provider === \"github\" || provider === \"gitlab\" || provider === \"azure\") &&\n typeof token === \"string\" &&\n token.trim().length > 0\n ) {\n return {\n providers: { [provider as string]: { token } },\n ...(typeof defaultBranch === \"string\" ? { defaultBranch } : {}),\n };\n }\n }\n\n // 2. Migrate old ai: { provider, apiKey } → aiProviders + defaultAiProvider\n if (rec[\"ai\"] && !rec[\"aiProviders\"]) {\n const ai = rec[\"ai\"] as Record<string, unknown>;\n const aiProv = ai[\"provider\"];\n const aiKey = ai[\"apiKey\"];\n const aiModel = ai[\"model\"];\n if (typeof aiProv === \"string\") {\n rec[\"aiProviders\"] = {\n [aiProv]: {\n ...(typeof aiKey === \"string\" && aiKey.trim() ? { apiKey: aiKey } : {}),\n ...(typeof aiModel === \"string\" && aiModel.trim() ? { model: aiModel } : {}),\n },\n };\n rec[\"defaultAiProvider\"] = aiProv;\n delete rec[\"ai\"];\n }\n }\n\n return rec;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AASrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAwEhE"}
|
package/dist/config/schema.js
CHANGED
|
@@ -1,18 +1,79 @@
|
|
|
1
1
|
function isRecord(value) {
|
|
2
2
|
return typeof value === "object" && value !== null;
|
|
3
3
|
}
|
|
4
|
+
const ALLOWED_GIT_PROVIDERS = new Set(["github", "gitlab", "azure"]);
|
|
5
|
+
const ALLOWED_AI_PROVIDERS = new Set(["claude", "openai", "claude-cli"]);
|
|
4
6
|
export function isGitxConfig(value) {
|
|
5
7
|
if (!isRecord(value))
|
|
6
8
|
return false;
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
9
|
+
// providers must be an object (can be empty for fresh installs)
|
|
10
|
+
const providers = value["providers"];
|
|
11
|
+
if (!isRecord(providers))
|
|
12
|
+
return false;
|
|
13
|
+
for (const [k, v] of Object.entries(providers)) {
|
|
14
|
+
if (!ALLOWED_GIT_PROVIDERS.has(k))
|
|
15
|
+
return false;
|
|
16
|
+
if (!isRecord(v))
|
|
17
|
+
return false;
|
|
18
|
+
const authMethod = v["authMethod"];
|
|
19
|
+
if (authMethod !== undefined && authMethod !== "pat" && authMethod !== "gcm")
|
|
20
|
+
return false;
|
|
21
|
+
if (authMethod === "gcm") {
|
|
22
|
+
// GCM entries have no stored token — that is expected and valid
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
// PAT (default): token must be a non-empty string
|
|
26
|
+
if (typeof v["token"] !== "string" || String(v["token"]).trim().length === 0)
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
// aiProviders is optional — validate each entry if present
|
|
30
|
+
const aiProviders = value["aiProviders"];
|
|
31
|
+
if (aiProviders !== undefined) {
|
|
32
|
+
if (!isRecord(aiProviders))
|
|
33
|
+
return false;
|
|
34
|
+
for (const [k, entry] of Object.entries(aiProviders)) {
|
|
35
|
+
if (!ALLOWED_AI_PROVIDERS.has(k))
|
|
36
|
+
return false;
|
|
37
|
+
if (!isRecord(entry))
|
|
38
|
+
return false;
|
|
39
|
+
// claude-cli has no apiKey; others require one if present
|
|
40
|
+
if (k !== "claude-cli") {
|
|
41
|
+
const apiKey = entry["apiKey"];
|
|
42
|
+
if (apiKey !== undefined && (typeof apiKey !== "string" || apiKey.trim().length === 0)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const model = entry["model"];
|
|
47
|
+
if (model !== undefined && typeof model !== "string")
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// defaultAiProvider is optional but must be a known kind
|
|
52
|
+
const defaultAiProvider = value["defaultAiProvider"];
|
|
53
|
+
if (defaultAiProvider !== undefined && !ALLOWED_AI_PROVIDERS.has(String(defaultAiProvider))) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Legacy ai field — optional, validated loosely for compat
|
|
57
|
+
const ai = value["ai"];
|
|
58
|
+
if (ai !== undefined) {
|
|
59
|
+
if (!isRecord(ai))
|
|
60
|
+
return false;
|
|
61
|
+
if (!ALLOWED_AI_PROVIDERS.has(String(ai["provider"])))
|
|
62
|
+
return false;
|
|
63
|
+
// apiKey optional for claude-cli
|
|
64
|
+
if (ai["provider"] !== "claude-cli") {
|
|
65
|
+
const apiKey = ai["apiKey"];
|
|
66
|
+
if (apiKey !== undefined && (typeof apiKey !== "string" || String(apiKey).trim().length === 0)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// defaultBranch is optional
|
|
10
72
|
const defaultBranch = value["defaultBranch"];
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return providerOk && tokenOk && repoOk && branchOk;
|
|
73
|
+
if (defaultBranch !== undefined &&
|
|
74
|
+
(typeof defaultBranch !== "string" || defaultBranch.trim().length === 0 || defaultBranch.includes(" "))) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
17
78
|
}
|
|
18
79
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GitxConfig } from \"../types/config.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nconst ALLOWED_GIT_PROVIDERS = new Set([\"github\", \"gitlab\", \"azure\"]);\nconst ALLOWED_AI_PROVIDERS = new Set([\"claude\", \"openai\", \"claude-cli\"]);\n\nexport function isGitxConfig(value: unknown): value is GitxConfig {\n if (!isRecord(value)) return false;\n\n // providers must be an object (can be empty for fresh installs)\n const providers = value[\"providers\"];\n if (!isRecord(providers)) return false;\n\n for (const [k, v] of Object.entries(providers)) {\n if (!ALLOWED_GIT_PROVIDERS.has(k)) return false;\n if (!isRecord(v)) return false;\n\n const authMethod = v[\"authMethod\"];\n if (authMethod !== undefined && authMethod !== \"pat\" && authMethod !== \"gcm\") return false;\n\n if (authMethod === \"gcm\") {\n // GCM entries have no stored token — that is expected and valid\n continue;\n }\n\n // PAT (default): token must be a non-empty string\n if (typeof v[\"token\"] !== \"string\" || String(v[\"token\"]).trim().length === 0) return false;\n }\n\n // aiProviders is optional — validate each entry if present\n const aiProviders = value[\"aiProviders\"];\n if (aiProviders !== undefined) {\n if (!isRecord(aiProviders)) return false;\n for (const [k, entry] of Object.entries(aiProviders)) {\n if (!ALLOWED_AI_PROVIDERS.has(k)) return false;\n if (!isRecord(entry)) return false;\n // claude-cli has no apiKey; others require one if present\n if (k !== \"claude-cli\") {\n const apiKey = entry[\"apiKey\"];\n if (apiKey !== undefined && (typeof apiKey !== \"string\" || apiKey.trim().length === 0)) {\n return false;\n }\n }\n const model = entry[\"model\"];\n if (model !== undefined && typeof model !== \"string\") return false;\n }\n }\n\n // defaultAiProvider is optional but must be a known kind\n const defaultAiProvider = value[\"defaultAiProvider\"];\n if (defaultAiProvider !== undefined && !ALLOWED_AI_PROVIDERS.has(String(defaultAiProvider))) {\n return false;\n }\n\n // Legacy ai field — optional, validated loosely for compat\n const ai = value[\"ai\"];\n if (ai !== undefined) {\n if (!isRecord(ai)) return false;\n if (!ALLOWED_AI_PROVIDERS.has(String(ai[\"provider\"]))) return false;\n // apiKey optional for claude-cli\n if (ai[\"provider\"] !== \"claude-cli\") {\n const apiKey = ai[\"apiKey\"];\n if (apiKey !== undefined && (typeof apiKey !== \"string\" || String(apiKey).trim().length === 0)) {\n return false;\n }\n }\n }\n\n // defaultBranch is optional\n const defaultBranch = value[\"defaultBranch\"];\n if (\n defaultBranch !== undefined &&\n (typeof defaultBranch !== \"string\" || defaultBranch.trim().length === 0 || defaultBranch.includes(\" \"))\n ) {\n return false;\n }\n\n return true;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProviderKind } from "../types/provider.js";
|
|
2
|
+
export interface RepoContext {
|
|
3
|
+
provider: ProviderKind;
|
|
4
|
+
repoSlug: string;
|
|
5
|
+
token: string;
|
|
6
|
+
/**
|
|
7
|
+
* How the token should be sent in the Authorization header.
|
|
8
|
+
* - "pat" → Basic base64(:{token}) (default, for GitHub/GitLab/Azure PAT)
|
|
9
|
+
* - "bearer" → Bearer {token} (for Azure GCM OAuth tokens)
|
|
10
|
+
*/
|
|
11
|
+
tokenType?: "pat" | "bearer";
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"","sourcesContent":["import type { ProviderKind } from \"../types/provider.js\";\n\nexport interface RepoContext {\n provider: ProviderKind;\n repoSlug: string; // provider-facing slug (GitHub/GitLab: owner/name)\n token: string;\n /**\n * How the token should be sent in the Authorization header.\n * - \"pat\" → Basic base64(:{token}) (default, for GitHub/GitLab/Azure PAT)\n * - \"bearer\" → Bearer {token} (for Azure GCM OAuth tokens)\n */\n tokenType?: \"pat\" | \"bearer\";\n}\n\n"]}
|
package/dist/core/gitx.d.ts
CHANGED
|
@@ -1,14 +1,61 @@
|
|
|
1
1
|
import type { GitxConfig } from "../types/config.js";
|
|
2
2
|
import type { AiClient } from "../ai/types.js";
|
|
3
3
|
import type { GitxPlugin } from "./plugin.js";
|
|
4
|
+
import type { RepoContext } from "./context.js";
|
|
4
5
|
export declare class Gitx {
|
|
5
6
|
readonly config: GitxConfig;
|
|
6
7
|
readonly ai: AiClient;
|
|
7
8
|
readonly cwd: string;
|
|
8
9
|
private readonly plugins;
|
|
9
10
|
private constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the active Anthropic API key.
|
|
13
|
+
* Priority: ANTHROPIC_API_KEY env var → aiProviders.claude.apiKey → legacy ai.apiKey
|
|
14
|
+
*/
|
|
15
|
+
static resolveAiKey(config: GitxConfig): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the OpenAI API key.
|
|
18
|
+
* Priority: OPENAI_API_KEY env var → aiProviders.openai.apiKey
|
|
19
|
+
*/
|
|
20
|
+
static resolveOpenAiKey(config: GitxConfig): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Check whether any real AI (API key or local CLI) is available.
|
|
23
|
+
*/
|
|
24
|
+
static isAiAvailable(config: GitxConfig): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Build the best available AiClient for the given config.
|
|
27
|
+
*
|
|
28
|
+
* Selection cascade:
|
|
29
|
+
* 1. ANTHROPIC_API_KEY env var → ClaudeAi (remote API)
|
|
30
|
+
* 2. defaultAiProvider in config → use that specific provider
|
|
31
|
+
* 3. Any configured aiProviders entry → first one found with a key
|
|
32
|
+
* 4. Auto-detect local `claude` CLI → ClaudeCliAi (free, no key)
|
|
33
|
+
* 5. MockAi fallback → placeholders, warns user
|
|
34
|
+
*/
|
|
35
|
+
static buildAi(config: GitxConfig): Promise<AiClient>;
|
|
36
|
+
/** Build an AiClient for a specific provider kind. Returns null if not possible. */
|
|
37
|
+
private static _buildForProvider;
|
|
38
|
+
/**
|
|
39
|
+
* Create a Gitx instance from the current working directory.
|
|
40
|
+
* Never throws due to missing config — returns graceful defaults.
|
|
41
|
+
*/
|
|
10
42
|
static fromCwd(cwd?: string): Promise<Gitx>;
|
|
11
43
|
use(plugin: GitxPlugin): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve provider, repoSlug, and token for the current repo.
|
|
46
|
+
* Shows actionable guidance instead of crashing when token is missing.
|
|
47
|
+
*/
|
|
48
|
+
getRepoContext(): Promise<RepoContext>;
|
|
12
49
|
getRepoSlug(): Promise<string>;
|
|
50
|
+
getProvider(): Promise<RepoContext["provider"]>;
|
|
51
|
+
getToken(): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Detect provider from the current repo without requiring a configured token.
|
|
54
|
+
* Useful for showing the user what they need to configure.
|
|
55
|
+
*/
|
|
56
|
+
detectProvider(): Promise<{
|
|
57
|
+
provider: string;
|
|
58
|
+
repoSlug: string;
|
|
59
|
+
} | undefined>;
|
|
13
60
|
}
|
|
14
61
|
//# sourceMappingURL=gitx.d.ts.map
|
package/dist/core/gitx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitx.d.ts","sourceRoot":"","sources":["../../src/core/gitx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"gitx.d.ts","sourceRoot":"","sources":["../../src/core/gitx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAMrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,qBAAa,IAAI;IACf,SAAgB,MAAM,EAAE,UAAU,CAAC;IACnC,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,OAAO;IAQP;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAQ3D;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAI/D;;OAEG;WACU,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE;;;;;;;;;OASG;WACU,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwC3D,oFAAoF;mBAC/D,iBAAiB;IA6BtC;;;OAGG;WACU,OAAO,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IA+EtC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAI/C,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAYpF"}
|