@g-abhishek/gitx 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +0 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +8 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +2 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/core/gitx.d.ts +2 -0
- package/dist/core/gitx.d.ts.map +1 -1
- package/dist/core/gitx.js +13 -1
- package/dist/core/gitx.js.map +1 -1
- package/dist/types/config.d.ts +7 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +40 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/validators.d.ts +1 -0
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js +7 -0
- package/dist/utils/validators.js.map +1 -1
- package/package.json +2 -1
package/dist/bin.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgE1D"}
|
|
@@ -2,13 +2,15 @@ import inquirer from "inquirer";
|
|
|
2
2
|
import ora from "ora";
|
|
3
3
|
import { logger } from "../../logger/logger.js";
|
|
4
4
|
import { saveConfig } from "../../config/config.js";
|
|
5
|
-
import { validateNonEmpty,
|
|
5
|
+
import { validateNonEmpty, validateOptionalRepoSlug } from "../../utils/validators.js";
|
|
6
|
+
import { resolveRepoSlugFromCwd } from "../../utils/git.js";
|
|
6
7
|
export function registerInitCommand(program) {
|
|
7
8
|
program
|
|
8
9
|
.command("init")
|
|
9
10
|
.description("🚀 Initialize gitx configuration")
|
|
10
11
|
.action(async () => {
|
|
11
12
|
logger.info("📄 gitx init");
|
|
13
|
+
const inferredRepo = await resolveRepoSlugFromCwd();
|
|
12
14
|
const answers = await inquirer.prompt([
|
|
13
15
|
{
|
|
14
16
|
type: "list",
|
|
@@ -30,8 +32,9 @@ export function registerInitCommand(program) {
|
|
|
30
32
|
{
|
|
31
33
|
type: "input",
|
|
32
34
|
name: "repo",
|
|
33
|
-
message: "Repo (e.g. owner/name)",
|
|
34
|
-
|
|
35
|
+
message: "Repo (optional; e.g. owner/name). Leave blank to infer from current git repo.",
|
|
36
|
+
default: inferredRepo,
|
|
37
|
+
validate: validateOptionalRepoSlug
|
|
35
38
|
},
|
|
36
39
|
{
|
|
37
40
|
type: "input",
|
|
@@ -41,10 +44,11 @@ export function registerInitCommand(program) {
|
|
|
41
44
|
validate: validateNonEmpty("Default branch")
|
|
42
45
|
}
|
|
43
46
|
]);
|
|
47
|
+
const repo = answers.repo.trim().length > 0 ? answers.repo.trim() : undefined;
|
|
44
48
|
const config = {
|
|
45
49
|
provider: answers.provider,
|
|
46
50
|
token: answers.token,
|
|
47
|
-
repo:
|
|
51
|
+
...(repo ? { repo } : {}),
|
|
48
52
|
defaultBranch: answers.defaultBranch
|
|
49
53
|
};
|
|
50
54
|
const spinner = ora("Saving config…").start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE5B,MAAM,YAAY,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAKlC;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,uBAAuB;gBAChC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;iBACzC;aACF;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,uBAAuB;gBAChC,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACpC;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,+EAA+E;gBACxF,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,wBAAwB;aACnC;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9E,MAAM,MAAM,GAAe;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEhC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport ora from \"ora\";\nimport { logger } from \"../../logger/logger.js\";\nimport { saveConfig } from \"../../config/config.js\";\nimport type { GitxConfig } from \"../../types/config.js\";\nimport type { ProviderKind } from \"../../types/provider.js\";\nimport { validateNonEmpty, validateOptionalRepoSlug } from \"../../utils/validators.js\";\nimport { resolveRepoSlugFromCwd } from \"../../utils/git.js\";\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"🚀 Initialize gitx configuration\")\n .action(async () => {\n logger.info(\"📄 gitx init\");\n\n const inferredRepo = await resolveRepoSlugFromCwd();\n\n const answers = await inquirer.prompt<{\n provider: ProviderKind;\n token: string;\n repo: string;\n defaultBranch: string;\n }>([\n {\n type: \"list\",\n name: \"provider\",\n message: \"Choose a Git provider\",\n choices: [\n { name: \"GitHub\", value: \"github\" },\n { name: \"GitLab\", value: \"gitlab\" },\n { name: \"Azure DevOps\", value: \"azure\" }\n ]\n },\n {\n type: \"password\",\n name: \"token\",\n message: \"Enter an access token\",\n mask: \"*\",\n validate: validateNonEmpty(\"Token\")\n },\n {\n type: \"input\",\n name: \"repo\",\n message: \"Repo (optional; e.g. owner/name). Leave blank to infer from current git repo.\",\n default: inferredRepo,\n validate: validateOptionalRepoSlug\n },\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch\",\n default: \"main\",\n validate: validateNonEmpty(\"Default branch\")\n }\n ]);\n\n const repo = answers.repo.trim().length > 0 ? answers.repo.trim() : undefined;\n\n const config: GitxConfig = {\n provider: answers.provider,\n token: answers.token,\n ...(repo ? { repo } : {}),\n defaultBranch: answers.defaultBranch\n };\n\n const spinner = ora(\"Saving config…\").start();\n await saveConfig(config);\n spinner.succeed(\"Config saved\");\n\n logger.success(\"✅ gitx is ready\");\n logger.info(\"Next: run `gitx implement \\\"<task>\\\" --mode=plan`\");\n });\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;AAMrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAehE"}
|
package/dist/config/schema.js
CHANGED
|
@@ -10,7 +10,8 @@ export function isGitxConfig(value) {
|
|
|
10
10
|
const defaultBranch = value["defaultBranch"];
|
|
11
11
|
const providerOk = provider === "github" || provider === "gitlab" || provider === "azure";
|
|
12
12
|
const tokenOk = typeof token === "string" && token.length > 0;
|
|
13
|
-
const repoOk =
|
|
13
|
+
const repoOk = repo === undefined ||
|
|
14
|
+
(typeof repo === "string" && repo.includes("/") && !repo.includes(" ") && repo.trim().length > 0);
|
|
14
15
|
const branchOk = typeof defaultBranch === "string" && defaultBranch.length > 0;
|
|
15
16
|
return providerOk && tokenOk && repoOk && branchOk;
|
|
16
17
|
}
|
|
@@ -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;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,MAAM,MAAM,
|
|
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;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,MAAM,MAAM,GACV,IAAI,KAAK,SAAS;QAClB,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/E,OAAO,UAAU,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,CAAC;AACrD,CAAC","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\nexport function isGitxConfig(value: unknown): value is GitxConfig {\n if (!isRecord(value)) return false;\n const provider = value[\"provider\"];\n const token = value[\"token\"];\n const repo = value[\"repo\"];\n const defaultBranch = value[\"defaultBranch\"];\n\n const providerOk = provider === \"github\" || provider === \"gitlab\" || provider === \"azure\";\n const tokenOk = typeof token === \"string\" && token.length > 0;\n const repoOk =\n repo === undefined ||\n (typeof repo === \"string\" && repo.includes(\"/\") && !repo.includes(\" \") && repo.trim().length > 0);\n const branchOk = typeof defaultBranch === \"string\" && defaultBranch.length > 0;\n\n return providerOk && tokenOk && repoOk && branchOk;\n}\n"]}
|
package/dist/core/gitx.d.ts
CHANGED
|
@@ -4,9 +4,11 @@ import type { GitxPlugin } from "./plugin.js";
|
|
|
4
4
|
export declare class Gitx {
|
|
5
5
|
readonly config: GitxConfig;
|
|
6
6
|
readonly ai: AiClient;
|
|
7
|
+
readonly cwd: string;
|
|
7
8
|
private readonly plugins;
|
|
8
9
|
private constructor();
|
|
9
10
|
static fromCwd(cwd?: string): Promise<Gitx>;
|
|
10
11
|
use(plugin: GitxPlugin): Promise<void>;
|
|
12
|
+
getRepoSlug(): Promise<string>;
|
|
11
13
|
}
|
|
12
14
|
//# 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,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gitx.d.ts","sourceRoot":"","sources":["../../src/core/gitx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,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;WAMM,OAAO,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CASrC"}
|
package/dist/core/gitx.js
CHANGED
|
@@ -1,21 +1,33 @@
|
|
|
1
1
|
import { loadConfig } from "../config/config.js";
|
|
2
2
|
import { MockAi } from "../ai/mockAi.js";
|
|
3
|
+
import { resolveRepoSlugFromCwd } from "../utils/git.js";
|
|
4
|
+
import { GitxError } from "../utils/errors.js";
|
|
3
5
|
export class Gitx {
|
|
4
6
|
config;
|
|
5
7
|
ai;
|
|
8
|
+
cwd;
|
|
6
9
|
plugins = [];
|
|
7
10
|
constructor(args) {
|
|
8
11
|
this.config = args.config;
|
|
9
12
|
this.ai = args.ai;
|
|
13
|
+
this.cwd = args.cwd;
|
|
10
14
|
}
|
|
11
15
|
static async fromCwd(cwd = process.cwd()) {
|
|
12
16
|
const config = await loadConfig(cwd);
|
|
13
17
|
const ai = new MockAi();
|
|
14
|
-
return new Gitx({ config, ai });
|
|
18
|
+
return new Gitx({ config, ai, cwd });
|
|
15
19
|
}
|
|
16
20
|
async use(plugin) {
|
|
17
21
|
this.plugins.push(plugin);
|
|
18
22
|
await plugin.setup(this);
|
|
19
23
|
}
|
|
24
|
+
async getRepoSlug() {
|
|
25
|
+
if (this.config.repo && this.config.repo.trim().length > 0)
|
|
26
|
+
return this.config.repo;
|
|
27
|
+
const inferred = await resolveRepoSlugFromCwd(this.cwd);
|
|
28
|
+
if (inferred)
|
|
29
|
+
return inferred;
|
|
30
|
+
throw new GitxError("Repo not configured and could not be inferred from git remote. Set `repo` in gitx config or run `gitx init` inside a repo with `origin`.", { exitCode: 2 });
|
|
31
|
+
}
|
|
20
32
|
}
|
|
21
33
|
//# sourceMappingURL=gitx.js.map
|
package/dist/core/gitx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitx.js","sourceRoot":"","sources":["../../src/core/gitx.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"gitx.js","sourceRoot":"","sources":["../../src/core/gitx.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,OAAO,IAAI;IACC,MAAM,CAAa;IACnB,EAAE,CAAW;IACb,GAAG,CAAS;IACX,OAAO,GAAiB,EAAE,CAAC;IAE5C,YAAoB,IAAuD;QACzE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAkB;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACpF,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,0IAA0I,EAC1I,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { GitxConfig } from \"../types/config.js\";\nimport { loadConfig } from \"../config/config.js\";\nimport { MockAi } from \"../ai/mockAi.js\";\nimport type { AiClient } from \"../ai/types.js\";\nimport type { GitxPlugin } from \"./plugin.js\";\nimport { resolveRepoSlugFromCwd } from \"../utils/git.js\";\nimport { GitxError } from \"../utils/errors.js\";\n\nexport class Gitx {\n public readonly config: GitxConfig;\n public readonly ai: AiClient;\n public readonly cwd: string;\n private readonly plugins: GitxPlugin[] = [];\n\n private constructor(args: { config: GitxConfig; ai: AiClient; cwd: string }) {\n this.config = args.config;\n this.ai = args.ai;\n this.cwd = args.cwd;\n }\n\n static async fromCwd(cwd = process.cwd()): Promise<Gitx> {\n const config = await loadConfig(cwd);\n const ai = new MockAi();\n return new Gitx({ config, ai, cwd });\n }\n\n async use(plugin: GitxPlugin): Promise<void> {\n this.plugins.push(plugin);\n await plugin.setup(this);\n }\n\n async getRepoSlug(): Promise<string> {\n if (this.config.repo && this.config.repo.trim().length > 0) return this.config.repo;\n const inferred = await resolveRepoSlugFromCwd(this.cwd);\n if (inferred) return inferred;\n throw new GitxError(\n \"Repo not configured and could not be inferred from git remote. Set `repo` in gitx config or run `gitx init` inside a repo with `origin`.\",\n { exitCode: 2 },\n );\n }\n}\n"]}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -2,7 +2,13 @@ import type { ProviderKind } from "./provider.js";
|
|
|
2
2
|
export interface GitxConfig {
|
|
3
3
|
provider: ProviderKind;
|
|
4
4
|
token: string;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Optional: when omitted, `gitx` will infer it from the current working directory's
|
|
7
|
+
* `remote.origin.url` (where possible).
|
|
8
|
+
*
|
|
9
|
+
* Format: owner/name (or provider-specific slug).
|
|
10
|
+
*/
|
|
11
|
+
repo?: string;
|
|
6
12
|
defaultBranch: string;
|
|
7
13
|
}
|
|
8
14
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
package/dist/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"","sourcesContent":["import type { ProviderKind } from \"./provider.js\";\n\nexport interface GitxConfig {\n provider: ProviderKind;\n token: string;\n
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"","sourcesContent":["import type { ProviderKind } from \"./provider.js\";\n\nexport interface GitxConfig {\n provider: ProviderKind;\n token: string;\n /**\n * Optional: when omitted, `gitx` will infer it from the current working directory's\n * `remote.origin.url` (where possible).\n *\n * Format: owner/name (or provider-specific slug).\n */\n repo?: string;\n defaultBranch: string;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function getGitRemoteOriginUrl(cwd?: string): Promise<string | undefined>;
|
|
2
|
+
export declare function inferRepoSlugFromRemote(url: string): string | undefined;
|
|
3
|
+
export declare function resolveRepoSlugFromCwd(cwd?: string): Promise<string | undefined>;
|
|
4
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAKA,wBAAsB,qBAAqB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ5F;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqBvE;AAED,wBAAsB,sBAAsB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAI7F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export async function getGitRemoteOriginUrl(cwd = process.cwd()) {
|
|
5
|
+
try {
|
|
6
|
+
const { stdout } = await execFileAsync("git", ["config", "--get", "remote.origin.url"], { cwd });
|
|
7
|
+
const url = String(stdout ?? "").trim();
|
|
8
|
+
return url.length > 0 ? url : undefined;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function inferRepoSlugFromRemote(url) {
|
|
15
|
+
// Supports common GitHub/GitLab URL formats:
|
|
16
|
+
// - git@github.com:owner/repo.git
|
|
17
|
+
// - https://github.com/owner/repo(.git)
|
|
18
|
+
// - ssh://git@github.com/owner/repo(.git)
|
|
19
|
+
const cleaned = url.trim();
|
|
20
|
+
const patterns = [
|
|
21
|
+
/^(?:git@)(?:github\.com|gitlab\.com):(?<owner>[^/]+)\/(?<repo>[^/]+?)(?:\.git)?$/i,
|
|
22
|
+
/^(?:https?:\/\/)(?:github\.com|gitlab\.com)\/(?<owner>[^/]+)\/(?<repo>[^/]+?)(?:\.git)?(?:\/)?$/i,
|
|
23
|
+
/^(?:ssh:\/\/)(?:git@)(?:github\.com|gitlab\.com)\/(?<owner>[^/]+)\/(?<repo>[^/]+?)(?:\.git)?$/i
|
|
24
|
+
];
|
|
25
|
+
for (const re of patterns) {
|
|
26
|
+
const match = re.exec(cleaned);
|
|
27
|
+
const owner = match?.groups?.["owner"];
|
|
28
|
+
const repo = match?.groups?.["repo"];
|
|
29
|
+
if (owner && repo)
|
|
30
|
+
return `${owner}/${repo}`;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
export async function resolveRepoSlugFromCwd(cwd = process.cwd()) {
|
|
35
|
+
const originUrl = await getGitRemoteOriginUrl(cwd);
|
|
36
|
+
if (!originUrl)
|
|
37
|
+
return undefined;
|
|
38
|
+
return inferRepoSlugFromRemote(originUrl);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACjG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,6CAA6C;IAC7C,kCAAkC;IAClC,wCAAwC;IACxC,0CAA0C;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,MAAM,QAAQ,GAAa;QACzB,mFAAmF;QACnF,kGAAkG;QAClG,gGAAgG;KACjG,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function getGitRemoteOriginUrl(cwd = process.cwd()): Promise<string | undefined> {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], { cwd });\n const url = String(stdout ?? \"\").trim();\n return url.length > 0 ? url : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function inferRepoSlugFromRemote(url: string): string | undefined {\n // Supports common GitHub/GitLab URL formats:\n // - git@github.com:owner/repo.git\n // - https://github.com/owner/repo(.git)\n // - ssh://git@github.com/owner/repo(.git)\n const cleaned = url.trim();\n\n const patterns: RegExp[] = [\n /^(?:git@)(?:github\\.com|gitlab\\.com):(?<owner>[^/]+)\\/(?<repo>[^/]+?)(?:\\.git)?$/i,\n /^(?:https?:\\/\\/)(?:github\\.com|gitlab\\.com)\\/(?<owner>[^/]+)\\/(?<repo>[^/]+?)(?:\\.git)?(?:\\/)?$/i,\n /^(?:ssh:\\/\\/)(?:git@)(?:github\\.com|gitlab\\.com)\\/(?<owner>[^/]+)\\/(?<repo>[^/]+?)(?:\\.git)?$/i\n ];\n\n for (const re of patterns) {\n const match = re.exec(cleaned);\n const owner = match?.groups?.[\"owner\"];\n const repo = match?.groups?.[\"repo\"];\n if (owner && repo) return `${owner}/${repo}`;\n }\n\n return undefined;\n}\n\nexport async function resolveRepoSlugFromCwd(cwd = process.cwd()): Promise<string | undefined> {\n const originUrl = await getGitRemoteOriginUrl(cwd);\n if (!originUrl) return undefined;\n return inferRepoSlugFromRemote(originUrl);\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function validateNonEmpty(label: string): (value: unknown) => true | string;
|
|
2
2
|
export declare function assertValid(result: true | string, label?: string): void;
|
|
3
3
|
export declare function validateRepoSlug(value: unknown): true | string;
|
|
4
|
+
export declare function validateOptionalRepoSlug(value: unknown): true | string;
|
|
4
5
|
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,SAAkB,GAAG,IAAI,CAIhF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAY9D"}
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,SAAkB,GAAG,IAAI,CAIhF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAY9D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAItE"}
|
package/dist/utils/validators.js
CHANGED
|
@@ -28,4 +28,11 @@ export function validateRepoSlug(value) {
|
|
|
28
28
|
}
|
|
29
29
|
return true;
|
|
30
30
|
}
|
|
31
|
+
export function validateOptionalRepoSlug(value) {
|
|
32
|
+
if (typeof value !== "string")
|
|
33
|
+
return "Repo must be a string";
|
|
34
|
+
if (value.trim().length === 0)
|
|
35
|
+
return true;
|
|
36
|
+
return validateRepoSlug(value);
|
|
37
|
+
}
|
|
31
38
|
//# sourceMappingURL=validators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,CAAC,KAAc,EAAE,EAAE;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,KAAK,mBAAmB,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,KAAK,cAAc,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB,EAAE,KAAK,GAAG,eAAe;IACxE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC;IAC1E,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,uBAAuB,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAEjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { GitxError } from \"./errors.js\";\n\nexport function validateNonEmpty(label: string): (value: unknown) => true | string {\n return (value: unknown) => {\n if (typeof value !== \"string\") return `${label} must be a string`;\n if (value.trim().length === 0) return `${label} is required`;\n return true;\n };\n}\n\nexport function assertValid(result: true | string, label = \"Invalid input\"): void {\n if (result === true) return;\n const message = result.startsWith(label) ? result : `${label}: ${result}`;\n throw new GitxError(message, { exitCode: 2 });\n}\n\nexport function validateRepoSlug(value: unknown): true | string {\n if (typeof value !== \"string\") return \"Repo must be a string\";\n const trimmed = value.trim();\n if (trimmed.length === 0) return \"Repo is required\";\n if (trimmed.includes(\" \")) return \"Repo must not contain spaces\";\n\n const parts = trimmed.split(\"/\");\n if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {\n return \"Repo must look like owner/name\";\n }\n\n return true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,CAAC,KAAc,EAAE,EAAE;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,KAAK,mBAAmB,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,KAAK,cAAc,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB,EAAE,KAAK,GAAG,eAAe;IACxE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC;IAC1E,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,uBAAuB,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAEjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,uBAAuB,CAAC;IAC9D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { GitxError } from \"./errors.js\";\n\nexport function validateNonEmpty(label: string): (value: unknown) => true | string {\n return (value: unknown) => {\n if (typeof value !== \"string\") return `${label} must be a string`;\n if (value.trim().length === 0) return `${label} is required`;\n return true;\n };\n}\n\nexport function assertValid(result: true | string, label = \"Invalid input\"): void {\n if (result === true) return;\n const message = result.startsWith(label) ? result : `${label}: ${result}`;\n throw new GitxError(message, { exitCode: 2 });\n}\n\nexport function validateRepoSlug(value: unknown): true | string {\n if (typeof value !== \"string\") return \"Repo must be a string\";\n const trimmed = value.trim();\n if (trimmed.length === 0) return \"Repo is required\";\n if (trimmed.includes(\" \")) return \"Repo must not contain spaces\";\n\n const parts = trimmed.split(\"/\");\n if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {\n return \"Repo must look like owner/name\";\n }\n\n return true;\n}\n\nexport function validateOptionalRepoSlug(value: unknown): true | string {\n if (typeof value !== \"string\") return \"Repo must be a string\";\n if (value.trim().length === 0) return true;\n return validateRepoSlug(value);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@g-abhishek/gitx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "AI-powered Git workflow automation CLI and SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"dev": "node --enable-source-maps dist/bin.js",
|
|
43
43
|
"lint": "eslint .",
|
|
44
44
|
"format": "prettier -w .",
|
|
45
|
+
"prepack": "npm run build",
|
|
45
46
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
46
47
|
},
|
|
47
48
|
"dependencies": {
|