@g-abhishek/gitx 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.
Files changed (94) hide show
  1. package/README.md +12 -0
  2. package/dist/ai/mockAi.d.ts +9 -0
  3. package/dist/ai/mockAi.d.ts.map +1 -0
  4. package/dist/ai/mockAi.js +37 -0
  5. package/dist/ai/mockAi.js.map +1 -0
  6. package/dist/ai/types.d.ts +44 -0
  7. package/dist/ai/types.d.ts.map +1 -0
  8. package/dist/ai/types.js +2 -0
  9. package/dist/ai/types.js.map +1 -0
  10. package/dist/bin.d.ts +3 -0
  11. package/dist/bin.d.ts.map +1 -0
  12. package/dist/bin.js +4 -0
  13. package/dist/bin.js.map +1 -0
  14. package/dist/cli/commands/implement.d.ts +3 -0
  15. package/dist/cli/commands/implement.d.ts.map +1 -0
  16. package/dist/cli/commands/implement.js +48 -0
  17. package/dist/cli/commands/implement.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +3 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +57 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/pr/create.d.ts +3 -0
  23. package/dist/cli/commands/pr/create.d.ts.map +1 -0
  24. package/dist/cli/commands/pr/create.js +12 -0
  25. package/dist/cli/commands/pr/create.js.map +1 -0
  26. package/dist/cli/commands/pr/fixComments.d.ts +3 -0
  27. package/dist/cli/commands/pr/fixComments.d.ts.map +1 -0
  28. package/dist/cli/commands/pr/fixComments.js +11 -0
  29. package/dist/cli/commands/pr/fixComments.js.map +1 -0
  30. package/dist/cli/commands/pr/index.d.ts +3 -0
  31. package/dist/cli/commands/pr/index.d.ts.map +1 -0
  32. package/dist/cli/commands/pr/index.js +12 -0
  33. package/dist/cli/commands/pr/index.js.map +1 -0
  34. package/dist/cli/commands/pr/list.d.ts +3 -0
  35. package/dist/cli/commands/pr/list.d.ts.map +1 -0
  36. package/dist/cli/commands/pr/list.js +9 -0
  37. package/dist/cli/commands/pr/list.js.map +1 -0
  38. package/dist/cli/commands/pr/review.d.ts +3 -0
  39. package/dist/cli/commands/pr/review.d.ts.map +1 -0
  40. package/dist/cli/commands/pr/review.js +11 -0
  41. package/dist/cli/commands/pr/review.js.map +1 -0
  42. package/dist/cli/index.d.ts +2 -0
  43. package/dist/cli/index.d.ts.map +1 -0
  44. package/dist/cli/index.js +33 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/config/config.d.ts +5 -0
  47. package/dist/config/config.d.ts.map +1 -0
  48. package/dist/config/config.js +34 -0
  49. package/dist/config/config.js.map +1 -0
  50. package/dist/config/schema.d.ts +3 -0
  51. package/dist/config/schema.d.ts.map +1 -0
  52. package/dist/config/schema.js +17 -0
  53. package/dist/config/schema.js.map +1 -0
  54. package/dist/core/gitx.d.ts +12 -0
  55. package/dist/core/gitx.d.ts.map +1 -0
  56. package/dist/core/gitx.js +21 -0
  57. package/dist/core/gitx.js.map +1 -0
  58. package/dist/core/plugin.d.ts +6 -0
  59. package/dist/core/plugin.d.ts.map +1 -0
  60. package/dist/core/plugin.js +2 -0
  61. package/dist/core/plugin.js.map +1 -0
  62. package/dist/index.d.ts +6 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/logger/logger.d.ts +9 -0
  67. package/dist/logger/logger.d.ts.map +1 -0
  68. package/dist/logger/logger.js +27 -0
  69. package/dist/logger/logger.js.map +1 -0
  70. package/dist/types/config.d.ts +8 -0
  71. package/dist/types/config.d.ts.map +1 -0
  72. package/dist/types/config.js +2 -0
  73. package/dist/types/config.js.map +1 -0
  74. package/dist/types/modes.d.ts +2 -0
  75. package/dist/types/modes.d.ts.map +1 -0
  76. package/dist/types/modes.js +2 -0
  77. package/dist/types/modes.js.map +1 -0
  78. package/dist/types/provider.d.ts +2 -0
  79. package/dist/types/provider.d.ts.map +1 -0
  80. package/dist/types/provider.js +2 -0
  81. package/dist/types/provider.js.map +1 -0
  82. package/dist/utils/errors.d.ts +9 -0
  83. package/dist/utils/errors.d.ts.map +1 -0
  84. package/dist/utils/errors.js +11 -0
  85. package/dist/utils/errors.js.map +1 -0
  86. package/dist/utils/modes.d.ts +3 -0
  87. package/dist/utils/modes.d.ts.map +1 -0
  88. package/dist/utils/modes.js +7 -0
  89. package/dist/utils/modes.js.map +1 -0
  90. package/dist/utils/validators.d.ts +4 -0
  91. package/dist/utils/validators.d.ts.map +1 -0
  92. package/dist/utils/validators.js +31 -0
  93. package/dist/utils/validators.js.map +1 -0
  94. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # gitx
2
+
3
+ AI-powered Git workflow automation CLI and SDK (WIP).
4
+
5
+ ## Getting started
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+ node dist/bin.js --help
11
+ ```
12
+
@@ -0,0 +1,9 @@
1
+ import type { AiAnalyzeTaskResponse, AiClient, AiGenerateDiffsResponse, AiGeneratePlanResponse, AiSuggestFixesResponse, AiSummarizeChangesResponse } from "./types.js";
2
+ export declare class MockAi implements AiClient {
3
+ analyzeTask(input: string): Promise<AiAnalyzeTaskResponse>;
4
+ generatePlan(_context: unknown): Promise<AiGeneratePlanResponse>;
5
+ generateDiffs(step: unknown): Promise<AiGenerateDiffsResponse>;
6
+ summarizeChanges(_diff: unknown): Promise<AiSummarizeChangesResponse>;
7
+ suggestFixes(_comment: unknown): Promise<AiSuggestFixesResponse>;
8
+ }
9
+ //# sourceMappingURL=mockAi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockAi.d.ts","sourceRoot":"","sources":["../../src/ai/mockAi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,QAAQ,EACR,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAO,YAAW,QAAQ;IAC/B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAU1D,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAiBhE,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAI9D,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAIrE,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAGvE"}
@@ -0,0 +1,37 @@
1
+ export class MockAi {
2
+ async analyzeTask(input) {
3
+ return {
4
+ task: input,
5
+ intent: "unknown",
6
+ summary: "Mock analysis (AI integration coming next).",
7
+ assumptions: ["Repository is a Node/TypeScript project."],
8
+ risks: ["AI is currently mocked; no real code changes will be generated."]
9
+ };
10
+ }
11
+ async generatePlan(_context) {
12
+ return {
13
+ steps: [
14
+ {
15
+ id: "step-1",
16
+ title: "Inspect repo",
17
+ description: "Scan structure, dependencies, and constraints."
18
+ },
19
+ {
20
+ id: "step-2",
21
+ title: "Implement change",
22
+ description: "Apply minimal changes and add/update tests if present."
23
+ }
24
+ ]
25
+ };
26
+ }
27
+ async generateDiffs(step) {
28
+ return { stepId: String(step?.id ?? "unknown"), diffs: [] };
29
+ }
30
+ async summarizeChanges(_diff) {
31
+ return { summary: "No changes (mock).", filesChanged: [] };
32
+ }
33
+ async suggestFixes(_comment) {
34
+ return { suggestedEdits: [] };
35
+ }
36
+ }
37
+ //# sourceMappingURL=mockAi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockAi.js","sourceRoot":"","sources":["../../src/ai/mockAi.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,MAAM;IACjB,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO;YACL,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,6CAA6C;YACtD,WAAW,EAAE,CAAC,0CAA0C,CAAC;YACzD,KAAK,EAAE,CAAC,iEAAiE,CAAC;SAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAiB;QAClC,OAAO;YACL,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,QAAQ;oBACZ,KAAK,EAAE,cAAc;oBACrB,WAAW,EAAE,gDAAgD;iBAC9D;gBACD;oBACE,EAAE,EAAE,QAAQ;oBACZ,KAAK,EAAE,kBAAkB;oBACzB,WAAW,EAAE,wDAAwD;iBACtE;aACF;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAa;QAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAE,IAA+B,EAAE,EAAE,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAc;QACnC,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAiB;QAClC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAChC,CAAC;CACF","sourcesContent":["import type {\n AiAnalyzeTaskResponse,\n AiClient,\n AiGenerateDiffsResponse,\n AiGeneratePlanResponse,\n AiSuggestFixesResponse,\n AiSummarizeChangesResponse\n} from \"./types.js\";\n\nexport class MockAi implements AiClient {\n async analyzeTask(input: string): Promise<AiAnalyzeTaskResponse> {\n return {\n task: input,\n intent: \"unknown\",\n summary: \"Mock analysis (AI integration coming next).\",\n assumptions: [\"Repository is a Node/TypeScript project.\"],\n risks: [\"AI is currently mocked; no real code changes will be generated.\"]\n };\n }\n\n async generatePlan(_context: unknown): Promise<AiGeneratePlanResponse> {\n return {\n steps: [\n {\n id: \"step-1\",\n title: \"Inspect repo\",\n description: \"Scan structure, dependencies, and constraints.\"\n },\n {\n id: \"step-2\",\n title: \"Implement change\",\n description: \"Apply minimal changes and add/update tests if present.\"\n }\n ]\n };\n }\n\n async generateDiffs(step: unknown): Promise<AiGenerateDiffsResponse> {\n return { stepId: String((step as { id?: string } | null)?.id ?? \"unknown\"), diffs: [] };\n }\n\n async summarizeChanges(_diff: unknown): Promise<AiSummarizeChangesResponse> {\n return { summary: \"No changes (mock).\", filesChanged: [] };\n }\n\n async suggestFixes(_comment: unknown): Promise<AiSuggestFixesResponse> {\n return { suggestedEdits: [] };\n }\n}\n\n"]}
@@ -0,0 +1,44 @@
1
+ export interface AiAnalyzeTaskResponse {
2
+ task: string;
3
+ intent: "refactor" | "bugfix" | "feature" | "chore" | "unknown";
4
+ summary: string;
5
+ assumptions: string[];
6
+ risks: string[];
7
+ }
8
+ export interface AiPlanStep {
9
+ id: string;
10
+ title: string;
11
+ description: string;
12
+ }
13
+ export interface AiGeneratePlanResponse {
14
+ steps: AiPlanStep[];
15
+ }
16
+ export interface AiGenerateDiffsResponse {
17
+ stepId: string;
18
+ diffs: Array<{
19
+ path: string;
20
+ unifiedDiff: string;
21
+ }>;
22
+ }
23
+ export interface AiSummarizeChangesResponse {
24
+ summary: string;
25
+ filesChanged: Array<{
26
+ path: string;
27
+ changeType: "add" | "modify" | "delete";
28
+ }>;
29
+ }
30
+ export interface AiSuggestFixesResponse {
31
+ suggestedEdits: Array<{
32
+ path: string;
33
+ rationale: string;
34
+ unifiedDiff: string;
35
+ }>;
36
+ }
37
+ export interface AiClient {
38
+ analyzeTask(input: string): Promise<AiAnalyzeTaskResponse>;
39
+ generatePlan(context: unknown): Promise<AiGeneratePlanResponse>;
40
+ generateDiffs(step: unknown): Promise<AiGenerateDiffsResponse>;
41
+ summarizeChanges(diff: unknown): Promise<AiSummarizeChangesResponse>;
42
+ suggestFixes(comment: unknown): Promise<AiSuggestFixesResponse>;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3D,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAChE,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC/D,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACrE,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACjE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface AiAnalyzeTaskResponse {\n task: string;\n intent: \"refactor\" | \"bugfix\" | \"feature\" | \"chore\" | \"unknown\";\n summary: string;\n assumptions: string[];\n risks: string[];\n}\n\nexport interface AiPlanStep {\n id: string;\n title: string;\n description: string;\n}\n\nexport interface AiGeneratePlanResponse {\n steps: AiPlanStep[];\n}\n\nexport interface AiGenerateDiffsResponse {\n stepId: string;\n diffs: Array<{ path: string; unifiedDiff: string }>;\n}\n\nexport interface AiSummarizeChangesResponse {\n summary: string;\n filesChanged: Array<{ path: string; changeType: \"add\" | \"modify\" | \"delete\" }>;\n}\n\nexport interface AiSuggestFixesResponse {\n suggestedEdits: Array<{ path: string; rationale: string; unifiedDiff: string }>;\n}\n\nexport interface AiClient {\n analyzeTask(input: string): Promise<AiAnalyzeTaskResponse>;\n generatePlan(context: unknown): Promise<AiGeneratePlanResponse>;\n generateDiffs(step: unknown): Promise<AiGenerateDiffsResponse>;\n summarizeChanges(diff: unknown): Promise<AiSummarizeChangesResponse>;\n suggestFixes(comment: unknown): Promise<AiSuggestFixesResponse>;\n}\n\n"]}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli/index.js";
3
+ await runCli(process.argv);
4
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { runCli } from \"./cli/index.js\";\n\nawait runCli(process.argv);\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerImplementCommand(program: Command): void;
3
+ //# sourceMappingURL=implement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C/D"}
@@ -0,0 +1,48 @@
1
+ import inquirer from "inquirer";
2
+ import ora from "ora";
3
+ import { logger } from "../../logger/logger.js";
4
+ import { Gitx } from "../../core/gitx.js";
5
+ import { assertValid, validateNonEmpty } from "../../utils/validators.js";
6
+ import { parseAutonomyMode } from "../../utils/modes.js";
7
+ export function registerImplementCommand(program) {
8
+ program
9
+ .command("implement")
10
+ .description("🛠️ Implement a task with AI assistance")
11
+ .argument("<task>", "Task description")
12
+ .option("--mode <mode>", "plan|guided|semi-auto|auto", "guided")
13
+ .option("--dry-run", "Simulate execution (no changes)", false)
14
+ .action(async (task, options) => {
15
+ assertValid(validateNonEmpty("Task")(task), "Task");
16
+ const mode = parseAutonomyMode(options.mode);
17
+ const gitx = await Gitx.fromCwd();
18
+ const spinner = ora("🧠 Analyzing task…").start();
19
+ const analysis = await gitx.ai.analyzeTask(task);
20
+ spinner.succeed("Task analyzed");
21
+ logger.info("🧾 Summary");
22
+ logger.info(JSON.stringify(analysis, null, 2));
23
+ const planSpinner = ora("🗺️ Generating plan…").start();
24
+ const plan = await gitx.ai.generatePlan({ task, analysis });
25
+ planSpinner.succeed("Plan generated");
26
+ logger.info("🧩 Plan");
27
+ logger.info(JSON.stringify(plan, null, 2));
28
+ if (mode !== "auto") {
29
+ const { proceed } = await inquirer.prompt([
30
+ {
31
+ type: "confirm",
32
+ name: "proceed",
33
+ message: options.dryRun
34
+ ? "Proceed with dry-run execution?"
35
+ : "Proceed with execution (branch + commit + PR)?",
36
+ default: false
37
+ }
38
+ ]);
39
+ if (!proceed) {
40
+ logger.warn("⏹️ Cancelled");
41
+ return;
42
+ }
43
+ }
44
+ logger.warn("⚠️ implement flow execution is not wired yet (providers + git ops in next step).");
45
+ logger.info(`Mode: ${mode}, dry-run: ${options.dryRun ? "yes" : "no"}`);
46
+ });
47
+ }
48
+ //# sourceMappingURL=implement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACtC,MAAM,CAAC,eAAe,EAAE,4BAA4B,EAAE,QAAQ,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,iCAAiC,EAAE,KAAK,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAgD,EAAE,EAAE;QAC/E,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;gBAC9D;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,OAAO,CAAC,MAAM;wBACrB,CAAC,CAAC,iCAAiC;wBACnC,CAAC,CAAC,gDAAgD;oBACpD,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAChG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,cAAc,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,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 type { AutonomyMode } from \"../../types/modes.js\";\nimport { Gitx } from \"../../core/gitx.js\";\nimport { assertValid, validateNonEmpty } from \"../../utils/validators.js\";\nimport { parseAutonomyMode } from \"../../utils/modes.js\";\n\nexport function registerImplementCommand(program: Command): void {\n program\n .command(\"implement\")\n .description(\"🛠️ Implement a task with AI assistance\")\n .argument(\"<task>\", \"Task description\")\n .option(\"--mode <mode>\", \"plan|guided|semi-auto|auto\", \"guided\")\n .option(\"--dry-run\", \"Simulate execution (no changes)\", false)\n .action(async (task: string, options: { mode: AutonomyMode; dryRun: boolean }) => {\n assertValid(validateNonEmpty(\"Task\")(task), \"Task\");\n const mode = parseAutonomyMode(options.mode);\n\n const gitx = await Gitx.fromCwd();\n\n const spinner = ora(\"🧠 Analyzing task…\").start();\n const analysis = await gitx.ai.analyzeTask(task);\n spinner.succeed(\"Task analyzed\");\n\n logger.info(\"🧾 Summary\");\n logger.info(JSON.stringify(analysis, null, 2));\n\n const planSpinner = ora(\"🗺️ Generating plan…\").start();\n const plan = await gitx.ai.generatePlan({ task, analysis });\n planSpinner.succeed(\"Plan generated\");\n\n logger.info(\"🧩 Plan\");\n logger.info(JSON.stringify(plan, null, 2));\n\n if (mode !== \"auto\") {\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message: options.dryRun\n ? \"Proceed with dry-run execution?\"\n : \"Proceed with execution (branch + commit + PR)?\",\n default: false\n }\n ]);\n if (!proceed) {\n logger.warn(\"⏹️ Cancelled\");\n return;\n }\n }\n\n logger.warn(\"⚠️ implement flow execution is not wired yet (providers + git ops in next step).\");\n logger.info(`Mode: ${mode}, dry-run: ${options.dryRun ? \"yes\" : \"no\"}`);\n });\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +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;AASzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D1D"}
@@ -0,0 +1,57 @@
1
+ import inquirer from "inquirer";
2
+ import ora from "ora";
3
+ import { logger } from "../../logger/logger.js";
4
+ import { saveConfig } from "../../config/config.js";
5
+ import { validateNonEmpty, validateRepoSlug } from "../../utils/validators.js";
6
+ export function registerInitCommand(program) {
7
+ program
8
+ .command("init")
9
+ .description("🚀 Initialize gitx configuration")
10
+ .action(async () => {
11
+ logger.info("📄 gitx init");
12
+ const answers = await inquirer.prompt([
13
+ {
14
+ type: "list",
15
+ name: "provider",
16
+ message: "Choose a Git provider",
17
+ choices: [
18
+ { name: "GitHub", value: "github" },
19
+ { name: "GitLab", value: "gitlab" },
20
+ { name: "Azure DevOps", value: "azure" }
21
+ ]
22
+ },
23
+ {
24
+ type: "password",
25
+ name: "token",
26
+ message: "Enter an access token",
27
+ mask: "*",
28
+ validate: validateNonEmpty("Token")
29
+ },
30
+ {
31
+ type: "input",
32
+ name: "repo",
33
+ message: "Repo (e.g. owner/name)",
34
+ validate: validateRepoSlug
35
+ },
36
+ {
37
+ type: "input",
38
+ name: "defaultBranch",
39
+ message: "Default branch",
40
+ default: "main",
41
+ validate: validateNonEmpty("Default branch")
42
+ }
43
+ ]);
44
+ const config = {
45
+ provider: answers.provider,
46
+ token: answers.token,
47
+ repo: answers.repo,
48
+ defaultBranch: answers.defaultBranch
49
+ };
50
+ const spinner = ora("Saving config…").start();
51
+ await saveConfig(config);
52
+ spinner.succeed("Config saved");
53
+ logger.success("✅ gitx is ready");
54
+ logger.info("Next: run `gitx implement \"<task>\" --mode=plan`");
55
+ });
56
+ }
57
+ //# sourceMappingURL=init.js.map
@@ -0,0 +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,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,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,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,wBAAwB;gBACjC,QAAQ,EAAE,gBAAgB;aAC3B;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,MAAM,GAAe;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,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, validateRepoSlug } from \"../../utils/validators.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 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 (e.g. owner/name)\",\n validate: validateRepoSlug\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 config: GitxConfig = {\n provider: answers.provider,\n token: answers.token,\n repo: answers.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\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerPrCreateCommand(pr: Command): void;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/pr/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAQzD"}
@@ -0,0 +1,12 @@
1
+ import { logger } from "../../../logger/logger.js";
2
+ export function registerPrCreateCommand(pr) {
3
+ pr.command("create")
4
+ .description("🆕 Create a pull request")
5
+ .option("--branches <branches>", "Comma-separated branches (e.g. dev,staging,prod)")
6
+ .action(async (options) => {
7
+ logger.warn("Not implemented yet (provider system next).");
8
+ if (options.branches)
9
+ logger.info(`Branches: ${options.branches}`);
10
+ });
11
+ }
12
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/cli/commands/pr/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,EAAW;IACjD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,uBAAuB,EAAE,kDAAkD,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,OAA8B,EAAE,EAAE;QAC/C,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { logger } from \"../../../logger/logger.js\";\n\nexport function registerPrCreateCommand(pr: Command): void {\n pr.command(\"create\")\n .description(\"🆕 Create a pull request\")\n .option(\"--branches <branches>\", \"Comma-separated branches (e.g. dev,staging,prod)\")\n .action(async (options: { branches?: string }) => {\n logger.warn(\"Not implemented yet (provider system next).\");\n if (options.branches) logger.info(`Branches: ${options.branches}`);\n });\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerPrFixCommentsCommand(pr: Command): void;
3
+ //# sourceMappingURL=fixComments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixComments.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/pr/fixComments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAQ9D"}
@@ -0,0 +1,11 @@
1
+ import { logger } from "../../../logger/logger.js";
2
+ export function registerPrFixCommentsCommand(pr) {
3
+ pr.command("fix-comments")
4
+ .description("🩹 Attempt to fix PR review comments")
5
+ .argument("<id>", "Pull request id/number")
6
+ .action(async (id) => {
7
+ logger.warn("Not implemented yet (AI + provider wiring next).");
8
+ logger.info(`PR: ${id}`);
9
+ });
10
+ }
11
+ //# sourceMappingURL=fixComments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixComments.js","sourceRoot":"","sources":["../../../../src/cli/commands/pr/fixComments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,MAAM,UAAU,4BAA4B,CAAC,EAAW;IACtD,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,sCAAsC,CAAC;SACnD,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { logger } from \"../../../logger/logger.js\";\n\nexport function registerPrFixCommentsCommand(pr: Command): void {\n pr.command(\"fix-comments\")\n .description(\"🩹 Attempt to fix PR review comments\")\n .argument(\"<id>\", \"Pull request id/number\")\n .action(async (id: string) => {\n logger.warn(\"Not implemented yet (AI + provider wiring next).\");\n logger.info(`PR: ${id}`);\n });\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerPrCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/pr/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAOzD"}
@@ -0,0 +1,12 @@
1
+ import { registerPrListCommand } from "./list.js";
2
+ import { registerPrCreateCommand } from "./create.js";
3
+ import { registerPrReviewCommand } from "./review.js";
4
+ import { registerPrFixCommentsCommand } from "./fixComments.js";
5
+ export function registerPrCommands(program) {
6
+ const pr = program.command("pr").description("🔀 Pull request commands");
7
+ registerPrListCommand(pr);
8
+ registerPrCreateCommand(pr);
9
+ registerPrReviewCommand(pr);
10
+ registerPrFixCommentsCommand(pr);
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/pr/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAEzE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC5B,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC5B,4BAA4B,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { registerPrListCommand } from \"./list.js\";\nimport { registerPrCreateCommand } from \"./create.js\";\nimport { registerPrReviewCommand } from \"./review.js\";\nimport { registerPrFixCommentsCommand } from \"./fixComments.js\";\n\nexport function registerPrCommands(program: Command): void {\n const pr = program.command(\"pr\").description(\"🔀 Pull request commands\");\n\n registerPrListCommand(pr);\n registerPrCreateCommand(pr);\n registerPrReviewCommand(pr);\n registerPrFixCommentsCommand(pr);\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerPrListCommand(pr: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/pr/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAMvD"}
@@ -0,0 +1,9 @@
1
+ import { logger } from "../../../logger/logger.js";
2
+ export function registerPrListCommand(pr) {
3
+ pr.command("list")
4
+ .description("📋 List pull requests")
5
+ .action(async () => {
6
+ logger.warn("Not implemented yet (provider system next).");
7
+ });
8
+ }
9
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/cli/commands/pr/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,EAAW;IAC/C,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { logger } from \"../../../logger/logger.js\";\n\nexport function registerPrListCommand(pr: Command): void {\n pr.command(\"list\")\n .description(\"📋 List pull requests\")\n .action(async () => {\n logger.warn(\"Not implemented yet (provider system next).\");\n });\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerPrReviewCommand(pr: Command): void;
3
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/pr/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAQzD"}
@@ -0,0 +1,11 @@
1
+ import { logger } from "../../../logger/logger.js";
2
+ export function registerPrReviewCommand(pr) {
3
+ pr.command("review")
4
+ .description("🧐 Review a pull request")
5
+ .argument("<id>", "Pull request id/number")
6
+ .action(async (id) => {
7
+ logger.warn("Not implemented yet (provider system next).");
8
+ logger.info(`PR: ${id}`);
9
+ });
10
+ }
11
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../src/cli/commands/pr/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,EAAW;IACjD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { logger } from \"../../../logger/logger.js\";\n\nexport function registerPrReviewCommand(pr: Command): void {\n pr.command(\"review\")\n .description(\"🧐 Review a pull request\")\n .argument(\"<id>\", \"Pull request id/number\")\n .action(async (id: string) => {\n logger.warn(\"Not implemented yet (provider system next).\");\n logger.info(`PR: ${id}`);\n });\n}\n\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function runCli(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAOA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1D"}
@@ -0,0 +1,33 @@
1
+ import { Command } from "commander";
2
+ import { registerInitCommand } from "./commands/init.js";
3
+ import { registerImplementCommand } from "./commands/implement.js";
4
+ import { registerPrCommands } from "./commands/pr/index.js";
5
+ import { logger } from "../logger/logger.js";
6
+ import { GitxError } from "../utils/errors.js";
7
+ export async function runCli(argv) {
8
+ const program = new Command();
9
+ program
10
+ .name("gitx")
11
+ .description("🧠🤝 AI-powered Git workflow automation CLI")
12
+ .version("0.1.0");
13
+ registerInitCommand(program);
14
+ registerImplementCommand(program);
15
+ registerPrCommands(program);
16
+ program.showHelpAfterError(true);
17
+ try {
18
+ await program.parseAsync(argv);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof GitxError) {
22
+ logger.error(error.message);
23
+ if (error.cause)
24
+ logger.warn(`Cause: ${String(error.cause)}`);
25
+ process.exitCode = error.exitCode;
26
+ return;
27
+ }
28
+ logger.error("Unexpected error");
29
+ logger.error(String(error));
30
+ process.exitCode = 1;
31
+ }
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;IAE5B,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,CAAC,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC","sourcesContent":["import { Command } from \"commander\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerImplementCommand } from \"./commands/implement.js\";\nimport { registerPrCommands } from \"./commands/pr/index.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.0\");\n\n registerInitCommand(program);\n registerImplementCommand(program);\n registerPrCommands(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(error.message);\n if (error.cause) logger.warn(`Cause: ${String(error.cause)}`);\n process.exitCode = error.exitCode;\n return;\n }\n\n logger.error(\"Unexpected error\");\n logger.error(String(error));\n process.exitCode = 1;\n }\n}\n\n"]}
@@ -0,0 +1,5 @@
1
+ import type { GitxConfig } from "../types/config.js";
2
+ export declare const CONFIG_FILES: readonly ["gitx.config.json", ".gitxrc"];
3
+ export declare function loadConfig(cwd?: string): Promise<GitxConfig>;
4
+ export declare function saveConfig(config: GitxConfig, cwd?: string): Promise<void>;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,eAAO,MAAM,YAAY,0CAA2C,CAAC;AAErE,wBAAsB,UAAU,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBzE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF"}
@@ -0,0 +1,34 @@
1
+ import { access, readFile, writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { GitxError } from "../utils/errors.js";
4
+ import { isGitxConfig } from "./schema.js";
5
+ export const CONFIG_FILES = ["gitx.config.json", ".gitxrc"];
6
+ export async function loadConfig(cwd = process.cwd()) {
7
+ for (const filename of CONFIG_FILES) {
8
+ const fullPath = resolve(cwd, filename);
9
+ if (!(await exists(fullPath)))
10
+ continue;
11
+ const raw = await readFile(fullPath, "utf8");
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");
24
+ }
25
+ async function exists(path) {
26
+ try {
27
+ await access(path);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAU,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAClD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAE,SAAS;QAExC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,qBAAqB,QAAQ,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,8CAA8C,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { GitxConfig } from \"../types/config.js\";\nimport { GitxError } from \"../utils/errors.js\";\nimport { isGitxConfig } from \"./schema.js\";\n\nexport const CONFIG_FILES = [\"gitx.config.json\", \".gitxrc\"] as const;\n\nexport async function loadConfig(cwd = process.cwd()): Promise<GitxConfig> {\n for (const filename of CONFIG_FILES) {\n const fullPath = resolve(cwd, filename);\n if (!(await exists(fullPath))) continue;\n\n const raw = await readFile(fullPath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isGitxConfig(parsed)) {\n throw new GitxError(`Invalid config in ${filename}.`, { exitCode: 2 });\n }\n\n return parsed;\n }\n\n throw new GitxError(\"No gitx config found. Run `gitx init` first.\", { exitCode: 2 });\n}\n\nexport async function saveConfig(config: GitxConfig, cwd = process.cwd()): Promise<void> {\n const fullPath = resolve(cwd, \"gitx.config.json\");\n const contents = JSON.stringify(config, null, 2) + \"\\n\";\n await writeFile(fullPath, contents, \"utf8\");\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { GitxConfig } from "../types/config.js";
2
+ export declare function isGitxConfig(value: unknown): value is GitxConfig;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +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,CAahE"}
@@ -0,0 +1,17 @@
1
+ function isRecord(value) {
2
+ return typeof value === "object" && value !== null;
3
+ }
4
+ export function isGitxConfig(value) {
5
+ if (!isRecord(value))
6
+ return false;
7
+ const provider = value["provider"];
8
+ const token = value["token"];
9
+ const repo = value["repo"];
10
+ const defaultBranch = value["defaultBranch"];
11
+ const providerOk = provider === "github" || provider === "gitlab" || provider === "azure";
12
+ const tokenOk = typeof token === "string" && token.length > 0;
13
+ const repoOk = typeof repo === "string" && repo.includes("/") && !repo.includes(" ");
14
+ const branchOk = typeof defaultBranch === "string" && defaultBranch.length > 0;
15
+ return providerOk && tokenOk && repoOk && branchOk;
16
+ }
17
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +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,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrF,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 = typeof repo === \"string\" && repo.includes(\"/\") && !repo.includes(\" \");\n const branchOk = typeof defaultBranch === \"string\" && defaultBranch.length > 0;\n\n return providerOk && tokenOk && repoOk && branchOk;\n}\n\n"]}
@@ -0,0 +1,12 @@
1
+ import type { GitxConfig } from "../types/config.js";
2
+ import type { AiClient } from "../ai/types.js";
3
+ import type { GitxPlugin } from "./plugin.js";
4
+ export declare class Gitx {
5
+ readonly config: GitxConfig;
6
+ readonly ai: AiClient;
7
+ private readonly plugins;
8
+ private constructor();
9
+ static fromCwd(cwd?: string): Promise<Gitx>;
10
+ use(plugin: GitxPlugin): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=gitx.d.ts.map
@@ -0,0 +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;AAE9C,qBAAa,IAAI;IACf,SAAgB,MAAM,EAAE,UAAU,CAAC;IACnC,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,OAAO;WAKM,OAAO,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAI7C"}
@@ -0,0 +1,21 @@
1
+ import { loadConfig } from "../config/config.js";
2
+ import { MockAi } from "../ai/mockAi.js";
3
+ export class Gitx {
4
+ config;
5
+ ai;
6
+ plugins = [];
7
+ constructor(args) {
8
+ this.config = args.config;
9
+ this.ai = args.ai;
10
+ }
11
+ static async fromCwd(cwd = process.cwd()) {
12
+ const config = await loadConfig(cwd);
13
+ const ai = new MockAi();
14
+ return new Gitx({ config, ai });
15
+ }
16
+ async use(plugin) {
17
+ this.plugins.push(plugin);
18
+ await plugin.setup(this);
19
+ }
20
+ }
21
+ //# sourceMappingURL=gitx.js.map
@@ -0,0 +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;AAIzC,MAAM,OAAO,IAAI;IACC,MAAM,CAAa;IACnB,EAAE,CAAW;IACZ,OAAO,GAAiB,EAAE,CAAC;IAE5C,YAAoB,IAA0C;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACpB,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,CAAC,CAAC;IAClC,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;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\";\n\nexport class Gitx {\n public readonly config: GitxConfig;\n public readonly ai: AiClient;\n private readonly plugins: GitxPlugin[] = [];\n\n private constructor(args: { config: GitxConfig; ai: AiClient }) {\n this.config = args.config;\n this.ai = args.ai;\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 });\n }\n\n async use(plugin: GitxPlugin): Promise<void> {\n this.plugins.push(plugin);\n await plugin.setup(this);\n }\n}\n\n"]}
@@ -0,0 +1,6 @@
1
+ import type { Gitx } from "./gitx.js";
2
+ export interface GitxPlugin {
3
+ name: string;
4
+ setup(gitx: Gitx): void | Promise<void>;
5
+ }
6
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"","sourcesContent":["import type { Gitx } from \"./gitx.js\";\n\nexport interface GitxPlugin {\n name: string;\n setup(gitx: Gitx): void | Promise<void>;\n}\n\n"]}
@@ -0,0 +1,6 @@
1
+ export { Gitx } from "./core/gitx.js";
2
+ export type { GitxPlugin } from "./core/plugin.js";
3
+ export type { GitxConfig } from "./types/config.js";
4
+ export type { AutonomyMode } from "./types/modes.js";
5
+ export type { ProviderKind } from "./types/provider.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { Gitx } from "./core/gitx.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { Gitx } from \"./core/gitx.js\";\nexport type { GitxPlugin } from \"./core/plugin.js\";\nexport type { GitxConfig } from \"./types/config.js\";\nexport type { AutonomyMode } from \"./types/modes.js\";\nexport type { ProviderKind } from \"./types/provider.js\";\n\n"]}
@@ -0,0 +1,9 @@
1
+ type LogArgs = readonly unknown[];
2
+ export declare const logger: {
3
+ info: (...args: LogArgs) => void;
4
+ success: (...args: LogArgs) => void;
5
+ warn: (...args: LogArgs) => void;
6
+ error: (...args: LogArgs) => void;
7
+ };
8
+ export {};
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GAAG,SAAS,OAAO,EAAE,CAAC;AAMlC,eAAO,MAAM,MAAM;oBACD,OAAO;uBAKJ,OAAO;oBAKV,OAAO;qBAKN,OAAO;CAKzB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ function format(args) {
3
+ return args.map((a) => (typeof a === "string" ? a : JSON.stringify(a, null, 2))).join(" ");
4
+ }
5
+ export const logger = {
6
+ info: (...args) => {
7
+ // Blue for info
8
+ // eslint-disable-next-line no-console
9
+ console.log(chalk.blue(format(args)));
10
+ },
11
+ success: (...args) => {
12
+ // Green for success
13
+ // eslint-disable-next-line no-console
14
+ console.log(chalk.green(format(args)));
15
+ },
16
+ warn: (...args) => {
17
+ // Yellow for warnings
18
+ // eslint-disable-next-line no-console
19
+ console.warn(chalk.yellow(format(args)));
20
+ },
21
+ error: (...args) => {
22
+ // Red for errors
23
+ // eslint-disable-next-line no-console
24
+ console.error(chalk.red(format(args)));
25
+ }
26
+ };
27
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,SAAS,MAAM,CAAC,IAAa;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAG,IAAa,EAAE,EAAE;QACzB,gBAAgB;QAChB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,IAAa,EAAE,EAAE;QAC5B,oBAAoB;QACpB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,IAAa,EAAE,EAAE;QACzB,sBAAsB;QACtB,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,IAAa,EAAE,EAAE;QAC1B,iBAAiB;QACjB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC","sourcesContent":["import chalk from \"chalk\";\n\ntype LogArgs = readonly unknown[];\n\nfunction format(args: LogArgs): string {\n return args.map((a) => (typeof a === \"string\" ? a : JSON.stringify(a, null, 2))).join(\" \");\n}\n\nexport const logger = {\n info: (...args: LogArgs) => {\n // Blue for info\n // eslint-disable-next-line no-console\n console.log(chalk.blue(format(args)));\n },\n success: (...args: LogArgs) => {\n // Green for success\n // eslint-disable-next-line no-console\n console.log(chalk.green(format(args)));\n },\n warn: (...args: LogArgs) => {\n // Yellow for warnings\n // eslint-disable-next-line no-console\n console.warn(chalk.yellow(format(args)));\n },\n error: (...args: LogArgs) => {\n // Red for errors\n // eslint-disable-next-line no-console\n console.error(chalk.red(format(args)));\n }\n};\n\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ProviderKind } from "./provider.js";
2
+ export interface GitxConfig {
3
+ provider: ProviderKind;
4
+ token: string;
5
+ repo: string;
6
+ defaultBranch: string;
7
+ }
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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;IACb,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +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 repo: string; // owner/name (or provider-specific slug)\n defaultBranch: string;\n}\n\n"]}
@@ -0,0 +1,2 @@
1
+ export type AutonomyMode = "plan" | "guided" | "semi-auto" | "auto";
2
+ //# sourceMappingURL=modes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../src/types/modes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/types/modes.ts"],"names":[],"mappings":"","sourcesContent":["export type AutonomyMode = \"plan\" | \"guided\" | \"semi-auto\" | \"auto\";\n\n"]}
@@ -0,0 +1,2 @@
1
+ export type ProviderKind = "github" | "gitlab" | "azure";
2
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"","sourcesContent":["export type ProviderKind = \"github\" | \"gitlab\" | \"azure\";\n\n"]}
@@ -0,0 +1,9 @@
1
+ export declare class GitxError extends Error {
2
+ readonly exitCode: number;
3
+ readonly cause?: unknown;
4
+ constructor(message: string, options?: {
5
+ exitCode?: number;
6
+ cause?: unknown;
7
+ });
8
+ }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAM9E"}
@@ -0,0 +1,11 @@
1
+ export class GitxError extends Error {
2
+ exitCode;
3
+ cause;
4
+ constructor(message, options) {
5
+ super(message);
6
+ this.name = "GitxError";
7
+ this.exitCode = options?.exitCode ?? 1;
8
+ this.cause = options?.cause;
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClB,QAAQ,CAAS;IACjB,KAAK,CAAW;IAEhC,YAAY,OAAe,EAAE,OAAgD;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF","sourcesContent":["export class GitxError extends Error {\n public readonly exitCode: number;\n public readonly cause?: unknown;\n\n constructor(message: string, options?: { exitCode?: number; cause?: unknown }) {\n super(message);\n this.name = \"GitxError\";\n this.exitCode = options?.exitCode ?? 1;\n this.cause = options?.cause;\n }\n}\n\n"]}
@@ -0,0 +1,3 @@
1
+ import type { AutonomyMode } from "../types/modes.js";
2
+ export declare function parseAutonomyMode(value: unknown): AutonomyMode;
3
+ //# sourceMappingURL=modes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../src/utils/modes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAG9D"}
@@ -0,0 +1,7 @@
1
+ import { GitxError } from "./errors.js";
2
+ export function parseAutonomyMode(value) {
3
+ if (value === "plan" || value === "guided" || value === "semi-auto" || value === "auto")
4
+ return value;
5
+ throw new GitxError("Invalid --mode. Use plan|guided|semi-auto|auto.", { exitCode: 2 });
6
+ }
7
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/utils/modes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACtG,MAAM,IAAI,SAAS,CAAC,iDAAiD,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1F,CAAC","sourcesContent":["import type { AutonomyMode } from \"../types/modes.js\";\nimport { GitxError } from \"./errors.js\";\n\nexport function parseAutonomyMode(value: unknown): AutonomyMode {\n if (value === \"plan\" || value === \"guided\" || value === \"semi-auto\" || value === \"auto\") return value;\n throw new GitxError(\"Invalid --mode. Use plan|guided|semi-auto|auto.\", { exitCode: 2 });\n}\n\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function validateNonEmpty(label: string): (value: unknown) => true | string;
2
+ export declare function assertValid(result: true | string, label?: string): void;
3
+ export declare function validateRepoSlug(value: unknown): true | string;
4
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,31 @@
1
+ import { GitxError } from "./errors.js";
2
+ export function validateNonEmpty(label) {
3
+ return (value) => {
4
+ if (typeof value !== "string")
5
+ return `${label} must be a string`;
6
+ if (value.trim().length === 0)
7
+ return `${label} is required`;
8
+ return true;
9
+ };
10
+ }
11
+ export function assertValid(result, label = "Invalid input") {
12
+ if (result === true)
13
+ return;
14
+ const message = result.startsWith(label) ? result : `${label}: ${result}`;
15
+ throw new GitxError(message, { exitCode: 2 });
16
+ }
17
+ export function validateRepoSlug(value) {
18
+ if (typeof value !== "string")
19
+ return "Repo must be a string";
20
+ const trimmed = value.trim();
21
+ if (trimmed.length === 0)
22
+ return "Repo is required";
23
+ if (trimmed.includes(" "))
24
+ return "Repo must not contain spaces";
25
+ const parts = trimmed.split("/");
26
+ if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {
27
+ return "Repo must look like owner/name";
28
+ }
29
+ return true;
30
+ }
31
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@g-abhishek/gitx",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered Git workflow automation CLI and SDK",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "",
8
+ "homepage": "",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": ""
12
+ },
13
+ "bugs": {
14
+ "url": ""
15
+ },
16
+ "keywords": [
17
+ "git",
18
+ "cli",
19
+ "github",
20
+ "gitlab",
21
+ "azure",
22
+ "pull-request",
23
+ "ai"
24
+ ],
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "bin": {
29
+ "gitx": "./dist/bin.js"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json && node ./scripts/postbuild-shebang.mjs ./dist/bin.js",
42
+ "dev": "node --enable-source-maps dist/bin.js",
43
+ "lint": "eslint .",
44
+ "format": "prettier -w .",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit"
46
+ },
47
+ "dependencies": {
48
+ "axios": "^1.7.9",
49
+ "chalk": "^5.3.0",
50
+ "commander": "^12.1.0",
51
+ "inquirer": "^10.2.2",
52
+ "ora": "^8.0.1"
53
+ },
54
+ "devDependencies": {
55
+ "@eslint/js": "^9.7.0",
56
+ "@types/node": "^20.14.10",
57
+ "eslint": "^9.7.0",
58
+ "globals": "^15.8.0",
59
+ "prettier": "^3.3.3",
60
+ "typescript": "^5.5.4",
61
+ "typescript-eslint": "^8.0.0"
62
+ }
63
+ }