@idea1/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +105 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/close-worktree.d.ts +3 -0
- package/dist/commands/close-worktree.d.ts.map +1 -0
- package/dist/commands/close-worktree.js +184 -0
- package/dist/commands/close-worktree.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +45 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +18 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +46 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/start-project-item.d.ts +3 -0
- package/dist/commands/start-project-item.d.ts.map +1 -0
- package/dist/commands/start-project-item.js +214 -0
- package/dist/commands/start-project-item.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +5 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +348 -0
- package/dist/interactive.js.map +1 -0
- package/dist/lib/logger.d.ts +16 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +44 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/settings.d.ts +10 -0
- package/dist/lib/settings.d.ts.map +1 -0
- package/dist/lib/settings.js +27 -0
- package/dist/lib/settings.js.map +1 -0
- package/dist/lib/shell.d.ts +23 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +61 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/services/claude.d.ts +25 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +81 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/config.d.ts +35 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +63 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/git.d.ts +89 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +246 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/github.d.ts +18 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +90 -0
- package/dist/services/github.js.map +1 -0
- package/dist/types/index.d.ts +61 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { exec, execOrThrow } from '../lib/shell.js';
|
|
2
|
+
import { logger } from '../lib/logger.js';
|
|
3
|
+
import { dirname, basename } from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Get the repository root path from git
|
|
6
|
+
*/
|
|
7
|
+
export async function getRepoRoot() {
|
|
8
|
+
return execOrThrow('git', ['rev-parse', '--show-toplevel']);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get the repository name (directory name of the repo root)
|
|
12
|
+
*/
|
|
13
|
+
export async function getRepoName() {
|
|
14
|
+
const repoRoot = await getRepoRoot();
|
|
15
|
+
return basename(repoRoot.trim());
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the main repository root (even when inside a worktree)
|
|
19
|
+
*/
|
|
20
|
+
export async function getMainRepoRoot() {
|
|
21
|
+
const gitCommonDir = await execOrThrow('git', ['rev-parse', '--git-common-dir']);
|
|
22
|
+
// git_common_dir points to main repo's .git directory
|
|
23
|
+
// Parent of .git is the main repo root
|
|
24
|
+
const mainRoot = dirname(gitCommonDir.trim());
|
|
25
|
+
return mainRoot === '.' ? await getRepoRoot() : mainRoot;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the current branch name
|
|
29
|
+
*/
|
|
30
|
+
export async function getCurrentBranch() {
|
|
31
|
+
const branch = await execOrThrow('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
32
|
+
return branch.trim();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if inside a git worktree (not the main repo)
|
|
36
|
+
*/
|
|
37
|
+
export async function isInsideWorktree() {
|
|
38
|
+
try {
|
|
39
|
+
const gitDir = await execOrThrow('git', ['rev-parse', '--git-dir']);
|
|
40
|
+
const gitCommonDir = await execOrThrow('git', ['rev-parse', '--git-common-dir']);
|
|
41
|
+
return gitDir.trim() !== gitCommonDir.trim();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Ensure the current repository has no uncommitted changes or untracked files
|
|
49
|
+
*/
|
|
50
|
+
export async function ensureCleanWorkingDirectory() {
|
|
51
|
+
// Check for uncommitted changes
|
|
52
|
+
const diffResult = await exec('git', ['diff-index', '--quiet', 'HEAD', '--']);
|
|
53
|
+
if (diffResult.exitCode !== 0) {
|
|
54
|
+
throw new Error('You have uncommitted changes in the repository. Please commit, stash, or discard your changes before proceeding.');
|
|
55
|
+
}
|
|
56
|
+
// Check for untracked files
|
|
57
|
+
const untrackedResult = await execOrThrow('git', ['ls-files', '--others', '--exclude-standard']);
|
|
58
|
+
if (untrackedResult.trim()) {
|
|
59
|
+
throw new Error('You have untracked files in the repository. Please commit, stash, or remove untracked files before proceeding.');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if there are uncommitted changes (including untracked files)
|
|
64
|
+
*/
|
|
65
|
+
export async function hasUncommittedChanges() {
|
|
66
|
+
const diffResult = await exec('git', ['diff', '--quiet']);
|
|
67
|
+
const cachedResult = await exec('git', ['diff', '--cached', '--quiet']);
|
|
68
|
+
const untrackedResult = await execOrThrow('git', ['ls-files', '--others', '--exclude-standard']);
|
|
69
|
+
return diffResult.exitCode !== 0 || cachedResult.exitCode !== 0 || untrackedResult.trim().length > 0;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Fetch latest changes from origin
|
|
73
|
+
*/
|
|
74
|
+
export async function fetchLatest() {
|
|
75
|
+
logger.step('Fetching latest changes from origin...');
|
|
76
|
+
await execOrThrow('git', ['fetch', 'origin']);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Checkout and pull the latest from a branch
|
|
80
|
+
*/
|
|
81
|
+
export async function checkoutAndPullBranch(branchName) {
|
|
82
|
+
logger.step(`Checking out ${branchName}...`);
|
|
83
|
+
await execOrThrow('git', ['checkout', branchName]);
|
|
84
|
+
logger.step(`Pulling latest from ${branchName}...`);
|
|
85
|
+
await execOrThrow('git', ['pull', 'origin', branchName]);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create a new branch from a base branch and push it to origin
|
|
89
|
+
*/
|
|
90
|
+
export async function createAndPushBranch(fullBranchName, baseBranchName) {
|
|
91
|
+
logger.step(`Creating branch: ${fullBranchName} from ${baseBranchName}...`);
|
|
92
|
+
await execOrThrow('git', ['checkout', '-b', fullBranchName, baseBranchName]);
|
|
93
|
+
logger.step('Pushing branch to origin...');
|
|
94
|
+
await execOrThrow('git', ['push', '--set-upstream', 'origin', fullBranchName]);
|
|
95
|
+
logger.success(`Branch ${fullBranchName} created successfully and pushed to origin`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Prepare the repository for worktree creation by fetching and syncing branches
|
|
99
|
+
*/
|
|
100
|
+
export async function prepareRepoForWorktree(fullBranchName, destBranchName) {
|
|
101
|
+
logger.step('Syncing branches...');
|
|
102
|
+
await fetchLatest();
|
|
103
|
+
await checkoutAndPullBranch(destBranchName);
|
|
104
|
+
await execOrThrow('git', ['pull', 'origin', fullBranchName]);
|
|
105
|
+
await execOrThrow('git', ['checkout', fullBranchName]);
|
|
106
|
+
await execOrThrow('git', ['pull', 'origin', fullBranchName]);
|
|
107
|
+
logger.success(`Branch ${fullBranchName} is ready for development`);
|
|
108
|
+
// Return to dest branch so worktree creation works correctly
|
|
109
|
+
await execOrThrow('git', ['checkout', destBranchName]);
|
|
110
|
+
await execOrThrow('git', ['pull', 'origin', destBranchName]);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a git worktree for the given branch
|
|
114
|
+
*/
|
|
115
|
+
export async function createWorktree(fullBranchName, shortBranchName) {
|
|
116
|
+
const repoRoot = await getRepoRoot();
|
|
117
|
+
const repoName = await getRepoName();
|
|
118
|
+
const worktreePath = `${dirname(repoRoot.trim())}/${repoName}-${shortBranchName}`;
|
|
119
|
+
logger.step(`Creating git worktree at ${worktreePath}...`);
|
|
120
|
+
await execOrThrow('git', ['worktree', 'add', worktreePath, fullBranchName]);
|
|
121
|
+
logger.success(`Worktree created successfully at ${worktreePath}`);
|
|
122
|
+
return worktreePath;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Remove a git worktree
|
|
126
|
+
*/
|
|
127
|
+
export async function removeWorktree(worktreePath) {
|
|
128
|
+
logger.step(`Removing git worktree at ${worktreePath}...`);
|
|
129
|
+
await execOrThrow('git', ['worktree', 'remove', worktreePath]);
|
|
130
|
+
logger.success('Worktree removed');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Enter worktree and set up upstream
|
|
134
|
+
*/
|
|
135
|
+
export async function enterWorktreeAndSetup(worktreePath, fullBranchName) {
|
|
136
|
+
// Set upstream branch to enable easy PR creation
|
|
137
|
+
await exec('git', ['push', '-u', 'origin', fullBranchName], { cwd: worktreePath });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Store project item URL in git config for later retrieval
|
|
141
|
+
*/
|
|
142
|
+
export async function storeProjectItemUrl(projectItemUrl, branchName) {
|
|
143
|
+
const branch = branchName ?? await getCurrentBranch();
|
|
144
|
+
if (projectItemUrl && branch) {
|
|
145
|
+
await execOrThrow('git', ['config', '--local', `branch.${branch}.idea1ProjectItemUrl`, projectItemUrl]);
|
|
146
|
+
logger.dim(`Project item URL stored in git config for ${branch}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Retrieve project item URL from git config
|
|
151
|
+
*/
|
|
152
|
+
export async function getProjectItemUrl(branchName) {
|
|
153
|
+
const branch = branchName ?? await getCurrentBranch();
|
|
154
|
+
const result = await exec('git', ['config', '--local', '--get', `branch.${branch}.idea1ProjectItemUrl`]);
|
|
155
|
+
return result.exitCode === 0 && result.stdout.trim() ? result.stdout.trim() : null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Store base branch in git config for later retrieval
|
|
159
|
+
*/
|
|
160
|
+
export async function storeBaseBranch(baseBranch, branchName) {
|
|
161
|
+
const branch = branchName ?? await getCurrentBranch();
|
|
162
|
+
if (baseBranch && branch) {
|
|
163
|
+
await execOrThrow('git', ['config', '--local', `branch.${branch}.baseBranch`, baseBranch]);
|
|
164
|
+
logger.dim(`Base branch stored in git config for ${branch}: ${baseBranch}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Retrieve base branch for a branch (with hierarchical resolution)
|
|
169
|
+
*/
|
|
170
|
+
export async function getBaseBranch(branchName) {
|
|
171
|
+
const branch = branchName ?? await getCurrentBranch();
|
|
172
|
+
// 1. Primary: query existing PR (authoritative source) - requires github service
|
|
173
|
+
// This is handled in the command layer
|
|
174
|
+
// 2. Fallback: branch-specific config
|
|
175
|
+
const result = await exec('git', ['config', '--local', '--get', `branch.${branch}.baseBranch`]);
|
|
176
|
+
if (result.exitCode === 0 && result.stdout.trim()) {
|
|
177
|
+
return result.stdout.trim();
|
|
178
|
+
}
|
|
179
|
+
// 3. Return null (caller decides default)
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate that a branch exists
|
|
184
|
+
*/
|
|
185
|
+
export async function branchExists(branchName) {
|
|
186
|
+
// Check remote first
|
|
187
|
+
const remoteResult = await exec('git', ['rev-parse', '--verify', `origin/${branchName}`]);
|
|
188
|
+
if (remoteResult.exitCode === 0) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
// Check local
|
|
192
|
+
const localResult = await exec('git', ['rev-parse', '--verify', branchName]);
|
|
193
|
+
return localResult.exitCode === 0;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Add all changes and commit
|
|
197
|
+
*/
|
|
198
|
+
export async function commitAllChanges(message) {
|
|
199
|
+
logger.step('Adding all changes...');
|
|
200
|
+
await execOrThrow('git', ['add', '-A']);
|
|
201
|
+
// Check if there are changes to commit
|
|
202
|
+
const diffResult = await exec('git', ['diff', '--cached', '--quiet']);
|
|
203
|
+
if (diffResult.exitCode === 0) {
|
|
204
|
+
logger.dim('No changes to commit');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
logger.step('Committing changes...');
|
|
208
|
+
await execOrThrow('git', ['commit', '-m', message]);
|
|
209
|
+
logger.success('Changes committed successfully');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Push to remote branch
|
|
213
|
+
*/
|
|
214
|
+
export async function pushToRemote(branchName) {
|
|
215
|
+
logger.step(`Pushing changes to remote branch ${branchName}...`);
|
|
216
|
+
await execOrThrow('git', ['push', '--set-upstream', 'origin', branchName]);
|
|
217
|
+
logger.success('Changes pushed successfully');
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Garbage collect orphaned branch configs
|
|
221
|
+
*/
|
|
222
|
+
export async function gcOrphanedBranchConfigs() {
|
|
223
|
+
const result = await exec('git', ['config', '--local', '--list']);
|
|
224
|
+
if (result.exitCode !== 0)
|
|
225
|
+
return;
|
|
226
|
+
const configKeys = result.stdout
|
|
227
|
+
.split('\n')
|
|
228
|
+
.filter(line => /^branch\.[^.]+\.(baseBranch|idea1ProjectItemUrl)=/.test(line))
|
|
229
|
+
.map(line => line.split('=')[0]);
|
|
230
|
+
let removedCount = 0;
|
|
231
|
+
for (const key of configKeys) {
|
|
232
|
+
const match = key.match(/^branch\.(.+)\.(baseBranch|idea1ProjectItemUrl)$/);
|
|
233
|
+
if (!match)
|
|
234
|
+
continue;
|
|
235
|
+
const branchName = match[1];
|
|
236
|
+
const exists = await branchExists(branchName);
|
|
237
|
+
if (!exists) {
|
|
238
|
+
await exec('git', ['config', '--local', '--unset', key]);
|
|
239
|
+
removedCount++;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (removedCount > 0) {
|
|
243
|
+
logger.dim(`Removed ${removedCount} orphaned branch config entries`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/services/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PrInfo } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure GitHub CLI is available
|
|
4
|
+
*/
|
|
5
|
+
export declare function ensureGitHubCli(): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a PR already exists for the given branch
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkPrExists(branchName: string, baseBranchName: string): Promise<PrInfo | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Get base branch from existing PR
|
|
12
|
+
*/
|
|
13
|
+
export declare function getPrBaseBranch(branchName: string): Promise<string | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Create a PR if it doesn't already exist
|
|
16
|
+
*/
|
|
17
|
+
export declare function createPrIfNeeded(branchName: string, baseBranchName: string, projectItemUrl: string | null, draft?: boolean): Promise<PrInfo | null>;
|
|
18
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/services/github.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBtG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAchF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,KAAK,UAAQ,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuCxB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { exec, commandExists } from '../lib/shell.js';
|
|
2
|
+
import { logger } from '../lib/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Ensure GitHub CLI is available
|
|
5
|
+
*/
|
|
6
|
+
export async function ensureGitHubCli() {
|
|
7
|
+
if (!await commandExists('gh')) {
|
|
8
|
+
throw new Error('GitHub CLI (gh) is not installed. Please install it: https://cli.github.com/');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a PR already exists for the given branch
|
|
13
|
+
*/
|
|
14
|
+
export async function checkPrExists(branchName, baseBranchName) {
|
|
15
|
+
await ensureGitHubCli();
|
|
16
|
+
logger.step(`Checking for existing PR for branch ${branchName}...`);
|
|
17
|
+
const result = await exec('gh', [
|
|
18
|
+
'pr', 'list',
|
|
19
|
+
'--head', branchName,
|
|
20
|
+
'--base', baseBranchName,
|
|
21
|
+
'--json', 'number,url,state',
|
|
22
|
+
'--jq', '.[0]'
|
|
23
|
+
]);
|
|
24
|
+
if (result.exitCode === 0 && result.stdout.trim() && result.stdout.trim() !== 'null') {
|
|
25
|
+
try {
|
|
26
|
+
const prInfo = JSON.parse(result.stdout.trim());
|
|
27
|
+
logger.dim(`PR already exists for branch ${branchName} (PR #${prInfo.number})`);
|
|
28
|
+
return prInfo;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
logger.dim(`No existing PR found for branch ${branchName}`);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get base branch from existing PR
|
|
39
|
+
*/
|
|
40
|
+
export async function getPrBaseBranch(branchName) {
|
|
41
|
+
await ensureGitHubCli();
|
|
42
|
+
const result = await exec('gh', [
|
|
43
|
+
'pr', 'view', branchName,
|
|
44
|
+
'--json', 'baseRefName',
|
|
45
|
+
'-q', '.baseRefName'
|
|
46
|
+
]);
|
|
47
|
+
if (result.exitCode === 0 && result.stdout.trim()) {
|
|
48
|
+
return result.stdout.trim();
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a PR if it doesn't already exist
|
|
54
|
+
*/
|
|
55
|
+
export async function createPrIfNeeded(branchName, baseBranchName, projectItemUrl, draft = false) {
|
|
56
|
+
await ensureGitHubCli();
|
|
57
|
+
// Check if PR already exists
|
|
58
|
+
const existingPr = await checkPrExists(branchName, baseBranchName);
|
|
59
|
+
if (existingPr) {
|
|
60
|
+
logger.dim(`Skipping PR creation - PR #${existingPr.number} already exists`);
|
|
61
|
+
return existingPr;
|
|
62
|
+
}
|
|
63
|
+
logger.step(`Creating new PR for ${branchName} -> ${baseBranchName}...`);
|
|
64
|
+
// Create title and body based on whether project_item_url is provided
|
|
65
|
+
let title;
|
|
66
|
+
let body;
|
|
67
|
+
if (projectItemUrl) {
|
|
68
|
+
title = `${branchName} -- Agent implementation of ${projectItemUrl}`;
|
|
69
|
+
body = `Automated PR for agent implementation of ${branchName} - project item: ${projectItemUrl}`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
title = branchName;
|
|
73
|
+
body = `Automated PR for ${branchName}`;
|
|
74
|
+
}
|
|
75
|
+
const args = ['pr', 'create', '--title', title, '--base', baseBranchName, '--body', body];
|
|
76
|
+
if (draft) {
|
|
77
|
+
args.push('--draft');
|
|
78
|
+
}
|
|
79
|
+
const result = await exec('gh', args);
|
|
80
|
+
if (result.exitCode === 0) {
|
|
81
|
+
logger.success('PR created successfully');
|
|
82
|
+
// Try to get the PR info
|
|
83
|
+
return await checkPrExists(branchName, baseBranchName);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger.warning(`Failed to create PR: ${result.stderr}`);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/services/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command interface for the command registry
|
|
3
|
+
*/
|
|
4
|
+
export interface Command {
|
|
5
|
+
name: string;
|
|
6
|
+
aliases: string[];
|
|
7
|
+
description: string;
|
|
8
|
+
execute: (args: string[]) => Promise<void>;
|
|
9
|
+
options?: CommandOption[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Command option definition
|
|
13
|
+
*/
|
|
14
|
+
export interface CommandOption {
|
|
15
|
+
flags: string;
|
|
16
|
+
description: string;
|
|
17
|
+
defaultValue?: string | boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Idea1 settings from .idea1/settings.json
|
|
21
|
+
*/
|
|
22
|
+
export interface Idea1Settings {
|
|
23
|
+
hooks?: {
|
|
24
|
+
'setup-worktree'?: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Start project item options
|
|
29
|
+
*/
|
|
30
|
+
export interface StartProjectItemOptions {
|
|
31
|
+
isolationMode: 'worktree' | 'container';
|
|
32
|
+
sourcePath?: string;
|
|
33
|
+
baseBranch: string;
|
|
34
|
+
buildImage: boolean;
|
|
35
|
+
disableFirewall: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Close worktree options
|
|
39
|
+
*/
|
|
40
|
+
export interface CloseWorktreeOptions {
|
|
41
|
+
sourcePath?: string;
|
|
42
|
+
baseBranch?: string;
|
|
43
|
+
promptPr: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Git branch info
|
|
47
|
+
*/
|
|
48
|
+
export interface BranchInfo {
|
|
49
|
+
fullName: string;
|
|
50
|
+
shortName: string;
|
|
51
|
+
baseBranch: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* PR info
|
|
55
|
+
*/
|
|
56
|
+
export interface PrInfo {
|
|
57
|
+
number: number;
|
|
58
|
+
url: string;
|
|
59
|
+
state: string;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE;QACN,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,UAAU,GAAG,WAAW,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@idea1/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for Idea1.ai workflow automation - AI-assisted development workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"idea1": "./bin/idea1"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"build:dev": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"clean": "rm -rf dist",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"cli",
|
|
20
|
+
"idea1",
|
|
21
|
+
"ai",
|
|
22
|
+
"development",
|
|
23
|
+
"workflow",
|
|
24
|
+
"automation"
|
|
25
|
+
],
|
|
26
|
+
"author": "Idea1.ai",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/idea1-ai/omega.git"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"boxen": "^8.0.1",
|
|
37
|
+
"chalk": "^5.3.0",
|
|
38
|
+
"commander": "^12.1.0",
|
|
39
|
+
"conf": "^13.0.1",
|
|
40
|
+
"execa": "^9.5.1",
|
|
41
|
+
"inquirer": "^12.1.0",
|
|
42
|
+
"ora": "^8.1.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/inquirer": "^9.0.7",
|
|
46
|
+
"@types/node": "^22.10.1",
|
|
47
|
+
"typescript": "^5.7.2"
|
|
48
|
+
},
|
|
49
|
+
"files": [
|
|
50
|
+
"dist",
|
|
51
|
+
"bin"
|
|
52
|
+
]
|
|
53
|
+
}
|