@kata-sh/cli 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.
@@ -0,0 +1,9 @@
1
+ import { type TaskResult } from "@kata-sh/core";
2
+ export interface TaskCommandOptions {
3
+ prompt: string;
4
+ dryRun: boolean;
5
+ branch?: string;
6
+ noPr?: boolean;
7
+ }
8
+ export declare function runTask(options: TaskCommandOptions): Promise<TaskResult>;
9
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,UAAU,EAEf,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAcD,wBAAsB,OAAO,CAC5B,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CAoIrB"}
@@ -0,0 +1,129 @@
1
+ import { AgentRunner, GitHubService, NotAGitRepoError, WorktreeManager, } from "@kata-sh/core";
2
+ import { generateSlug } from "../slug.js";
3
+ function extractTextFromMessage(message) {
4
+ if (message.type !== "assistant")
5
+ return undefined;
6
+ for (const block of message.message.content) {
7
+ if (block.type === "text") {
8
+ return block.text;
9
+ }
10
+ }
11
+ return undefined;
12
+ }
13
+ export async function runTask(options) {
14
+ const { prompt, dryRun, branch, noPr } = options;
15
+ const startTime = Date.now();
16
+ const worktreeManager = new WorktreeManager();
17
+ const agentRunner = new AgentRunner();
18
+ const githubService = new GitHubService();
19
+ let repoRoot;
20
+ try {
21
+ repoRoot = await worktreeManager.getRepoRoot();
22
+ }
23
+ catch (error) {
24
+ if (error instanceof NotAGitRepoError) {
25
+ console.error("Error: Not in a git repository.");
26
+ process.exitCode = 1;
27
+ return {
28
+ success: false,
29
+ branch: "",
30
+ duration: Date.now() - startTime,
31
+ error: "Not in a git repository",
32
+ };
33
+ }
34
+ throw error;
35
+ }
36
+ const branchName = branch ?? generateSlug(prompt);
37
+ const worktree = await worktreeManager.create({
38
+ branchName,
39
+ repoRoot,
40
+ });
41
+ try {
42
+ console.log(`Branch: ${worktree.branch}`);
43
+ console.log(`Worktree: ${worktree.path}`);
44
+ console.log("");
45
+ const result = await agentRunner.run({
46
+ prompt,
47
+ workingDirectory: worktree.path,
48
+ onMessage: (message) => {
49
+ const text = extractTextFromMessage(message);
50
+ if (text) {
51
+ process.stdout.write(text);
52
+ }
53
+ },
54
+ });
55
+ if (!result.success) {
56
+ console.error(`\nAgent failed: ${result.error}`);
57
+ process.exitCode = 1;
58
+ return {
59
+ success: false,
60
+ branch: worktree.branch,
61
+ duration: Date.now() - startTime,
62
+ error: result.error,
63
+ };
64
+ }
65
+ if (result.filesChanged.length === 0) {
66
+ console.log("\nNo changes made.");
67
+ return {
68
+ success: true,
69
+ branch: worktree.branch,
70
+ duration: Date.now() - startTime,
71
+ };
72
+ }
73
+ if (dryRun) {
74
+ console.log(`\nDry run complete. ${result.filesChanged.length} file(s) changed.`);
75
+ return {
76
+ success: true,
77
+ branch: worktree.branch,
78
+ duration: Date.now() - startTime,
79
+ };
80
+ }
81
+ // Push the branch from the worktree directory
82
+ await githubService.pushBranch({
83
+ repoRoot: worktree.path,
84
+ branch: worktree.branch,
85
+ });
86
+ console.log(`\nPushed branch: ${worktree.branch}`);
87
+ if (noPr) {
88
+ return {
89
+ success: true,
90
+ branch: worktree.branch,
91
+ duration: Date.now() - startTime,
92
+ };
93
+ }
94
+ let remoteInfo;
95
+ try {
96
+ remoteInfo = await githubService.getRemoteInfo(repoRoot);
97
+ }
98
+ catch {
99
+ console.log("No GitHub remote found. Skipping PR creation.");
100
+ return {
101
+ success: true,
102
+ branch: worktree.branch,
103
+ duration: Date.now() - startTime,
104
+ };
105
+ }
106
+ const { title, body } = githubService.generatePRDescription(prompt, result.filesChanged);
107
+ const pr = await githubService.createPullRequest({
108
+ owner: remoteInfo.owner,
109
+ repo: remoteInfo.repo,
110
+ title,
111
+ body,
112
+ head: worktree.branch,
113
+ base: worktree.baseBranch,
114
+ });
115
+ console.log(`PR created: ${pr.url}`);
116
+ return {
117
+ success: true,
118
+ branch: worktree.branch,
119
+ pullRequest: pr,
120
+ duration: Date.now() - startTime,
121
+ };
122
+ }
123
+ finally {
124
+ await worktreeManager.remove(worktree.path).catch((err) => {
125
+ console.error(`Warning: Failed to clean up worktree: ${err}`);
126
+ });
127
+ }
128
+ }
129
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.test.d.ts","sourceRoot":"","sources":["../../src/commands/task.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,169 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ vi.mock("@kata-sh/core", () => ({
3
+ WorktreeManager: vi.fn(),
4
+ AgentRunner: vi.fn(),
5
+ GitHubService: vi.fn(),
6
+ NotAGitRepoError: class NotAGitRepoError extends Error {
7
+ name = "NotAGitRepoError";
8
+ },
9
+ }));
10
+ import { AgentRunner, GitHubService, NotAGitRepoError, WorktreeManager, } from "@kata-sh/core";
11
+ import { runTask } from "./task.js";
12
+ const MockWorktreeManager = vi.mocked(WorktreeManager);
13
+ const MockAgentRunner = vi.mocked(AgentRunner);
14
+ const MockGitHubService = vi.mocked(GitHubService);
15
+ function setupMocks(overrides) {
16
+ const worktreeInstance = {
17
+ getRepoRoot: overrides?.getRepoRoot ?? vi.fn().mockResolvedValue("/repo"),
18
+ create: overrides?.create ??
19
+ vi.fn().mockResolvedValue({
20
+ path: "/repo/.worktrees/kata/fix-bug",
21
+ branch: "kata/fix-bug",
22
+ baseBranch: "main",
23
+ repoRoot: "/repo",
24
+ }),
25
+ remove: overrides?.remove ?? vi.fn().mockResolvedValue(undefined),
26
+ list: vi.fn(),
27
+ exists: vi.fn(),
28
+ };
29
+ const agentInstance = {
30
+ run: overrides?.run ??
31
+ vi.fn().mockResolvedValue({
32
+ success: true,
33
+ filesChanged: ["src/index.ts"],
34
+ }),
35
+ };
36
+ const githubInstance = {
37
+ pushBranch: overrides?.pushBranch ?? vi.fn().mockResolvedValue(undefined),
38
+ getRemoteInfo: overrides?.getRemoteInfo ??
39
+ vi.fn().mockResolvedValue({
40
+ owner: "user",
41
+ repo: "project",
42
+ remote: "origin",
43
+ }),
44
+ createPullRequest: overrides?.createPullRequest ??
45
+ vi.fn().mockResolvedValue({
46
+ number: 42,
47
+ url: "https://github.com/user/project/pull/42",
48
+ title: "Fix bug",
49
+ body: "Fix bug\n\n## Files Changed\n- src/index.ts",
50
+ branch: "kata/fix-bug",
51
+ baseBranch: "main",
52
+ }),
53
+ generatePRDescription: overrides?.generatePRDescription ??
54
+ vi.fn().mockReturnValue({
55
+ title: "Fix bug",
56
+ body: "Fix bug\n\n## Files Changed\n- src/index.ts",
57
+ }),
58
+ resolveToken: vi.fn(),
59
+ };
60
+ MockWorktreeManager.mockImplementation(() => worktreeInstance);
61
+ MockAgentRunner.mockImplementation(() => agentInstance);
62
+ MockGitHubService.mockImplementation(() => githubInstance);
63
+ return { worktreeInstance, agentInstance, githubInstance };
64
+ }
65
+ describe("runTask", () => {
66
+ beforeEach(() => {
67
+ vi.clearAllMocks();
68
+ process.exitCode = undefined;
69
+ });
70
+ it("runs the happy path: worktree → agent → push → PR → cleanup", async () => {
71
+ const { worktreeInstance, agentInstance, githubInstance } = setupMocks();
72
+ const result = await runTask({ prompt: "Fix bug", dryRun: false });
73
+ expect(worktreeInstance.getRepoRoot).toHaveBeenCalled();
74
+ expect(worktreeInstance.create).toHaveBeenCalledWith({
75
+ branchName: "fix-bug",
76
+ repoRoot: "/repo",
77
+ });
78
+ expect(agentInstance.run).toHaveBeenCalledWith(expect.objectContaining({
79
+ prompt: "Fix bug",
80
+ workingDirectory: "/repo/.worktrees/kata/fix-bug",
81
+ }));
82
+ expect(githubInstance.pushBranch).toHaveBeenCalled();
83
+ expect(githubInstance.createPullRequest).toHaveBeenCalled();
84
+ expect(worktreeInstance.remove).toHaveBeenCalledWith("/repo/.worktrees/kata/fix-bug");
85
+ expect(result.success).toBe(true);
86
+ expect(result.pullRequest).toBeDefined();
87
+ expect(result.pullRequest?.url).toBe("https://github.com/user/project/pull/42");
88
+ });
89
+ it("skips push and PR on dry-run", async () => {
90
+ const { githubInstance, worktreeInstance } = setupMocks();
91
+ const result = await runTask({ prompt: "Fix bug", dryRun: true });
92
+ expect(githubInstance.pushBranch).not.toHaveBeenCalled();
93
+ expect(githubInstance.createPullRequest).not.toHaveBeenCalled();
94
+ expect(worktreeInstance.remove).toHaveBeenCalled();
95
+ expect(result.success).toBe(true);
96
+ expect(result.pullRequest).toBeUndefined();
97
+ });
98
+ it("cleans up worktree on agent failure", async () => {
99
+ const { worktreeInstance } = setupMocks({
100
+ run: vi.fn().mockResolvedValue({
101
+ success: false,
102
+ filesChanged: [],
103
+ error: "Agent crashed",
104
+ }),
105
+ });
106
+ const result = await runTask({ prompt: "Fix bug", dryRun: false });
107
+ expect(result.success).toBe(false);
108
+ expect(result.error).toBe("Agent crashed");
109
+ expect(worktreeInstance.remove).toHaveBeenCalled();
110
+ expect(process.exitCode).toBe(1);
111
+ });
112
+ it("skips PR when no remote is found", async () => {
113
+ const { githubInstance, worktreeInstance } = setupMocks({
114
+ getRemoteInfo: vi.fn().mockRejectedValue(new Error("No git remote")),
115
+ });
116
+ const result = await runTask({ prompt: "Fix bug", dryRun: false });
117
+ expect(githubInstance.pushBranch).toHaveBeenCalled();
118
+ expect(githubInstance.createPullRequest).not.toHaveBeenCalled();
119
+ expect(worktreeInstance.remove).toHaveBeenCalled();
120
+ expect(result.success).toBe(true);
121
+ expect(result.pullRequest).toBeUndefined();
122
+ });
123
+ it("uses custom branch name when provided", async () => {
124
+ const { worktreeInstance } = setupMocks();
125
+ await runTask({
126
+ prompt: "Fix bug",
127
+ dryRun: false,
128
+ branch: "my-custom-branch",
129
+ });
130
+ expect(worktreeInstance.create).toHaveBeenCalledWith({
131
+ branchName: "my-custom-branch",
132
+ repoRoot: "/repo",
133
+ });
134
+ });
135
+ it("pushes but skips PR with --no-pr", async () => {
136
+ const { githubInstance } = setupMocks();
137
+ const result = await runTask({
138
+ prompt: "Fix bug",
139
+ dryRun: false,
140
+ noPr: true,
141
+ });
142
+ expect(githubInstance.pushBranch).toHaveBeenCalled();
143
+ expect(githubInstance.createPullRequest).not.toHaveBeenCalled();
144
+ expect(result.success).toBe(true);
145
+ });
146
+ it("handles not-in-a-git-repo gracefully", async () => {
147
+ setupMocks({
148
+ getRepoRoot: vi
149
+ .fn()
150
+ .mockRejectedValue(new NotAGitRepoError("/not-a-repo")),
151
+ });
152
+ const result = await runTask({ prompt: "Fix bug", dryRun: false });
153
+ expect(result.success).toBe(false);
154
+ expect(result.error).toBe("Not in a git repository");
155
+ expect(process.exitCode).toBe(1);
156
+ });
157
+ it("handles no changes from agent", async () => {
158
+ setupMocks({
159
+ run: vi.fn().mockResolvedValue({
160
+ success: true,
161
+ filesChanged: [],
162
+ }),
163
+ });
164
+ const result = await runTask({ prompt: "Fix bug", dryRun: false });
165
+ expect(result.success).toBe(true);
166
+ expect(result.pullRequest).toBeUndefined();
167
+ });
168
+ });
169
+ //# sourceMappingURL=task.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.test.js","sourceRoot":"","sources":["../../src/commands/task.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;IACxB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,gBAAgB,EAAE,MAAM,gBAAiB,SAAQ,KAAK;QACrD,IAAI,GAAG,kBAAkB,CAAC;KAC1B;CACD,CAAC,CAAC,CAAC;AAEJ,OAAO,EACN,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,eAAe,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACvD,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEnD,SAAS,UAAU,CAAC,SA6BnB;IACA,MAAM,gBAAgB,GAAG;QACxB,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;QACzE,MAAM,EACL,SAAS,EAAE,MAAM;YACjB,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACzB,IAAI,EAAE,+BAA+B;gBACrC,MAAM,EAAE,cAAc;gBACtB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,OAAO;aACjB,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACjE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;IAEF,MAAM,aAAa,GAAG;QACrB,GAAG,EACF,SAAS,EAAE,GAAG;YACd,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACzB,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,CAAC,cAAc,CAAC;aAC9B,CAAC;KACH,CAAC;IAEF,MAAM,cAAc,GAAG;QACtB,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACzE,aAAa,EACZ,SAAS,EAAE,aAAa;YACxB,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACzB,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,QAAQ;aAChB,CAAC;QACH,iBAAiB,EAChB,SAAS,EAAE,iBAAiB;YAC5B,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACzB,MAAM,EAAE,EAAE;gBACV,GAAG,EAAE,yCAAyC;gBAC9C,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,6CAA6C;gBACnD,MAAM,EAAE,cAAc;gBACtB,UAAU,EAAE,MAAM;aAClB,CAAC;QACH,qBAAqB,EACpB,SAAS,EAAE,qBAAqB;YAChC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACvB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,6CAA6C;aACnD,CAAC;QACH,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;KACrB,CAAC;IAEF,mBAAmB,CAAC,kBAAkB,CACrC,GAAG,EAAE,CAAC,gBAAmE,CACzE,CAAC;IACF,eAAe,CAAC,kBAAkB,CACjC,GAAG,EAAE,CAAC,aAA4D,CAClE,CAAC;IACF,iBAAiB,CAAC,kBAAkB,CACnC,GAAG,EAAE,CAAC,cAA+D,CACrE,CAAC;IAEF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC5D,CAAC;AAED,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACxB,UAAU,CAAC,GAAG,EAAE;QACf,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC;QAEzE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACpD,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC7C,MAAM,CAAC,gBAAgB,CAAC;YACvB,MAAM,EAAE,SAAS;YACjB,gBAAgB,EAAE,+BAA+B;SACjD,CAAC,CACF,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC5D,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACnD,+BAA+B,CAC/B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CACnC,yCAAyC,CACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;YACvC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC9B,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,EAAE;gBAChB,KAAK,EAAE,eAAe;aACtB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;YACvD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SACpE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,CAAC;QAE1C,MAAM,OAAO,CAAC;YACb,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,kBAAkB;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACpD,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC5B,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,UAAU,CAAC;YACV,WAAW,EAAE,EAAE;iBACb,EAAE,EAAE;iBACJ,iBAAiB,CAAC,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;SACxD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC9C,UAAU,CAAC;YACV,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC9B,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,EAAE;aAChB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-e2e.test.d.ts","sourceRoot":"","sources":["../../src/e2e/task-e2e.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import { execFile as execFileCb } from "node:child_process";
2
+ import { existsSync, mkdtempSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ const execFile = promisify(execFileCb);
8
+ // Mock only the external services — AgentRunner and GitHubService.
9
+ // WorktreeManager uses real git operations against a temp repo.
10
+ vi.mock("@kata-sh/core", async (importOriginal) => {
11
+ const actual = await importOriginal();
12
+ return {
13
+ ...actual,
14
+ AgentRunner: vi.fn(),
15
+ GitHubService: vi.fn(),
16
+ };
17
+ });
18
+ import { AgentRunner, GitHubService } from "@kata-sh/core";
19
+ import { runTask } from "../commands/task.js";
20
+ const MockAgentRunner = vi.mocked(AgentRunner);
21
+ const MockGitHubService = vi.mocked(GitHubService);
22
+ async function initTempRepo() {
23
+ const dir = realpathSync(mkdtempSync(join(tmpdir(), "kata-e2e-")));
24
+ await execFile("git", ["init", dir]);
25
+ await execFile("git", ["-C", dir, "config", "user.email", "test@test.com"]);
26
+ await execFile("git", ["-C", dir, "config", "user.name", "Test"]);
27
+ writeFileSync(join(dir, "README.md"), "# Test Repo\n");
28
+ await execFile("git", ["-C", dir, "add", "."]);
29
+ await execFile("git", ["-C", dir, "commit", "-m", "init"]);
30
+ return dir;
31
+ }
32
+ function setupAgentMock(behavior) {
33
+ MockAgentRunner.mockImplementation(() => {
34
+ return {
35
+ run: vi
36
+ .fn()
37
+ .mockImplementation(async (opts) => {
38
+ if (behavior === "fail") {
39
+ return {
40
+ success: false,
41
+ filesChanged: [],
42
+ error: "Agent process crashed",
43
+ };
44
+ }
45
+ if (behavior === "no-changes") {
46
+ return { success: true, filesChanged: [] };
47
+ }
48
+ // Simulate agent creating a file and committing
49
+ const filePath = join(opts.workingDirectory, "new-file.ts");
50
+ writeFileSync(filePath, "export const x = 1;\n");
51
+ await execFile("git", ["-C", opts.workingDirectory, "add", "."]);
52
+ await execFile("git", [
53
+ "-C",
54
+ opts.workingDirectory,
55
+ "commit",
56
+ "-m",
57
+ "agent: add new file",
58
+ ]);
59
+ return {
60
+ success: true,
61
+ filesChanged: ["new-file.ts"],
62
+ };
63
+ }),
64
+ };
65
+ });
66
+ }
67
+ function setupGitHubMock(options) {
68
+ const pushBranch = vi.fn().mockResolvedValue(undefined);
69
+ const getRemoteInfo = options?.getRemoteInfoThrows
70
+ ? vi.fn().mockRejectedValue(new Error("No git remote"))
71
+ : vi.fn().mockResolvedValue({
72
+ owner: "user",
73
+ repo: "project",
74
+ remote: "origin",
75
+ });
76
+ const createPullRequest = vi.fn().mockResolvedValue({
77
+ number: 42,
78
+ url: "https://github.com/user/project/pull/42",
79
+ title: "Test PR",
80
+ body: "body",
81
+ branch: "kata/test",
82
+ baseBranch: "main",
83
+ });
84
+ const generatePRDescription = vi.fn().mockReturnValue({
85
+ title: "Test PR",
86
+ body: "Test body\n\n## Files Changed\n- new-file.ts",
87
+ });
88
+ MockGitHubService.mockImplementation(() => {
89
+ return {
90
+ pushBranch,
91
+ getRemoteInfo,
92
+ createPullRequest,
93
+ generatePRDescription,
94
+ resolveToken: vi.fn(),
95
+ };
96
+ });
97
+ return { pushBranch, createPullRequest, getRemoteInfo };
98
+ }
99
+ describe("task command (e2e)", () => {
100
+ let repoDir;
101
+ const originalCwd = process.cwd();
102
+ beforeEach(async () => {
103
+ vi.clearAllMocks();
104
+ process.exitCode = undefined;
105
+ repoDir = await initTempRepo();
106
+ process.chdir(repoDir);
107
+ });
108
+ afterEach(() => {
109
+ process.chdir(originalCwd);
110
+ rmSync(repoDir, { recursive: true, force: true });
111
+ });
112
+ it("full task lifecycle: worktree → agent → push → PR → cleanup", async () => {
113
+ setupAgentMock("create-file");
114
+ const { pushBranch, createPullRequest } = setupGitHubMock();
115
+ const result = await runTask({ prompt: "Add feature", dryRun: false });
116
+ expect(result.success).toBe(true);
117
+ expect(result.branch).toBe("kata/add-feature");
118
+ // Agent ran and push/PR were called
119
+ expect(pushBranch).toHaveBeenCalledWith(expect.objectContaining({ branch: "kata/add-feature" }));
120
+ expect(createPullRequest).toHaveBeenCalledWith(expect.objectContaining({
121
+ head: "kata/add-feature",
122
+ owner: "user",
123
+ repo: "project",
124
+ }));
125
+ expect(result.pullRequest).toBeDefined();
126
+ // Worktree was cleaned up
127
+ const worktreePath = join(repoDir, ".worktrees", "kata/add-feature");
128
+ expect(existsSync(worktreePath)).toBe(false);
129
+ });
130
+ it("dry-run skips push and PR", async () => {
131
+ setupAgentMock("create-file");
132
+ const { pushBranch, createPullRequest } = setupGitHubMock();
133
+ const result = await runTask({ prompt: "Add feature", dryRun: true });
134
+ expect(result.success).toBe(true);
135
+ expect(pushBranch).not.toHaveBeenCalled();
136
+ expect(createPullRequest).not.toHaveBeenCalled();
137
+ expect(result.pullRequest).toBeUndefined();
138
+ });
139
+ it("--branch flag uses custom branch name", async () => {
140
+ setupAgentMock("create-file");
141
+ const { pushBranch } = setupGitHubMock();
142
+ const result = await runTask({
143
+ prompt: "Add feature",
144
+ dryRun: false,
145
+ branch: "my-custom-branch",
146
+ });
147
+ expect(result.success).toBe(true);
148
+ expect(result.branch).toBe("kata/my-custom-branch");
149
+ expect(pushBranch).toHaveBeenCalledWith(expect.objectContaining({ branch: "kata/my-custom-branch" }));
150
+ });
151
+ it("agent failure cleans up worktree", async () => {
152
+ setupAgentMock("fail");
153
+ setupGitHubMock();
154
+ const result = await runTask({ prompt: "Fail task", dryRun: false });
155
+ expect(result.success).toBe(false);
156
+ expect(result.error).toBeDefined();
157
+ // Worktree should be cleaned up despite the failure
158
+ const worktreePath = join(repoDir, ".worktrees", "kata/fail-task");
159
+ expect(existsSync(worktreePath)).toBe(false);
160
+ });
161
+ it("no GitHub remote skips PR gracefully", async () => {
162
+ setupAgentMock("create-file");
163
+ const { pushBranch, createPullRequest } = setupGitHubMock({
164
+ getRemoteInfoThrows: true,
165
+ });
166
+ const result = await runTask({ prompt: "Add feature", dryRun: false });
167
+ expect(result.success).toBe(true);
168
+ expect(pushBranch).toHaveBeenCalled();
169
+ expect(createPullRequest).not.toHaveBeenCalled();
170
+ expect(result.pullRequest).toBeUndefined();
171
+ });
172
+ });
173
+ //# sourceMappingURL=task-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-e2e.test.js","sourceRoot":"","sources":["../../src/e2e/task-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { runTask } from "./commands/task.js";
4
+ const require = createRequire(import.meta.url);
5
+ const pkg = require("../package.json");
6
+ function printHelp() {
7
+ console.log(`kata-cloud v${pkg.version}
8
+
9
+ Usage:
10
+ kata-cloud task "<prompt>" Run an AI agent to complete a task
11
+ kata-cloud --help Show this help message
12
+ kata-cloud --version Show version
13
+
14
+ Task flags:
15
+ --dry-run Run agent but skip push and PR creation
16
+ --branch <name> Use a custom branch name instead of auto-generated
17
+ --no-pr Push the branch but skip PR creation`);
18
+ }
19
+ function parseArgs(argv) {
20
+ const result = {
21
+ command: undefined,
22
+ prompt: undefined,
23
+ dryRun: false,
24
+ branch: undefined,
25
+ noPr: false,
26
+ help: false,
27
+ version: false,
28
+ };
29
+ const args = argv.slice(2);
30
+ let i = 0;
31
+ while (i < args.length) {
32
+ const arg = args[i];
33
+ if (arg === "--help" || arg === "-h") {
34
+ result.help = true;
35
+ }
36
+ else if (arg === "--version" || arg === "-v") {
37
+ result.version = true;
38
+ }
39
+ else if (arg === "--dry-run") {
40
+ result.dryRun = true;
41
+ }
42
+ else if (arg === "--no-pr") {
43
+ result.noPr = true;
44
+ }
45
+ else if (arg === "--branch") {
46
+ i++;
47
+ result.branch = args[i];
48
+ }
49
+ else if (!result.command) {
50
+ result.command = arg;
51
+ }
52
+ else if (!result.prompt) {
53
+ result.prompt = arg;
54
+ }
55
+ i++;
56
+ }
57
+ return result;
58
+ }
59
+ async function main() {
60
+ const parsed = parseArgs(process.argv);
61
+ if (parsed.help) {
62
+ printHelp();
63
+ return;
64
+ }
65
+ if (parsed.version) {
66
+ console.log(pkg.version);
67
+ return;
68
+ }
69
+ if (parsed.command !== "task") {
70
+ if (parsed.command) {
71
+ console.error(`Unknown command: ${parsed.command}`);
72
+ }
73
+ printHelp();
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ if (!parsed.prompt) {
78
+ console.error('Error: Missing prompt. Usage: kata-cloud task "<prompt>"');
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ await runTask({
83
+ prompt: parsed.prompt,
84
+ dryRun: parsed.dryRun,
85
+ branch: parsed.branch,
86
+ noPr: parsed.noPr,
87
+ });
88
+ }
89
+ main().catch((error) => {
90
+ console.error(error);
91
+ process.exitCode = 1;
92
+ });
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/slug.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function generateSlug(prompt: string): string;
2
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASnD"}
package/dist/slug.js ADDED
@@ -0,0 +1,12 @@
1
+ const MAX_SLUG_LENGTH = 50;
2
+ export function generateSlug(prompt) {
3
+ return prompt
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9\s-]/g, "")
6
+ .trim()
7
+ .replace(/\s+/g, "-")
8
+ .replace(/-+/g, "-")
9
+ .slice(0, MAX_SLUG_LENGTH)
10
+ .replace(/-$/, "");
11
+ }
12
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,UAAU,YAAY,CAAC,MAAc;IAC1C,OAAO,MAAM;SACX,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;SACzB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=slug.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.test.d.ts","sourceRoot":"","sources":["../src/slug.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { generateSlug } from "./slug.js";
3
+ describe("generateSlug", () => {
4
+ it("converts a simple prompt to a slug", () => {
5
+ expect(generateSlug("Fix the login bug")).toBe("fix-the-login-bug");
6
+ });
7
+ it("removes special characters", () => {
8
+ expect(generateSlug("Add user's profile page!")).toBe("add-users-profile-page");
9
+ });
10
+ it("collapses multiple spaces and hyphens", () => {
11
+ expect(generateSlug("fix the -- bug")).toBe("fix-the-bug");
12
+ });
13
+ it("truncates to 50 characters", () => {
14
+ const long = "Implement a comprehensive user authentication system with OAuth support";
15
+ const slug = generateSlug(long);
16
+ expect(slug.length).toBeLessThanOrEqual(50);
17
+ expect(slug).not.toMatch(/-$/);
18
+ });
19
+ it("trims leading and trailing whitespace", () => {
20
+ expect(generateSlug(" hello world ")).toBe("hello-world");
21
+ });
22
+ it("handles empty string", () => {
23
+ expect(generateSlug("")).toBe("");
24
+ });
25
+ it("removes trailing hyphen after truncation", () => {
26
+ // 50 chars with a hyphen at position 50
27
+ const prompt = `${"a".repeat(49)} b`;
28
+ const slug = generateSlug(prompt);
29
+ expect(slug).not.toMatch(/-$/);
30
+ });
31
+ });
32
+ //# sourceMappingURL=slug.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.test.js","sourceRoot":"","sources":["../src/slug.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CACpD,wBAAwB,CACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GACT,yEAAyE,CAAC;QAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,wCAAwC;QACxC,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@kata-sh/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "kata-cloud": "./dist/index.js"
7
+ },
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": ["dist"],
15
+ "scripts": {
16
+ "build": "tsc -b",
17
+ "typecheck": "tsc --noEmit"
18
+ },
19
+ "dependencies": {
20
+ "@kata-sh/core": "0.1.0"
21
+ }
22
+ }