@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,214 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { execWithOutput } from '../lib/shell.js';
|
|
3
|
+
import { getSetupWorktreeHook } from '../lib/settings.js';
|
|
4
|
+
import * as git from '../services/git.js';
|
|
5
|
+
import * as claude from '../services/claude.js';
|
|
6
|
+
import { configService } from '../services/config.js';
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
/**
|
|
9
|
+
* Parse command line arguments for start-project-item
|
|
10
|
+
*/
|
|
11
|
+
function parseArgs(args) {
|
|
12
|
+
const options = {
|
|
13
|
+
isolationMode: configService.getDefaultIsolationMode(),
|
|
14
|
+
baseBranch: configService.getDefaultBaseBranch(),
|
|
15
|
+
buildImage: false,
|
|
16
|
+
disableFirewall: false
|
|
17
|
+
};
|
|
18
|
+
let projectItemUrl = '';
|
|
19
|
+
let shortBranchName;
|
|
20
|
+
let i = 0;
|
|
21
|
+
while (i < args.length) {
|
|
22
|
+
const arg = args[i];
|
|
23
|
+
switch (arg) {
|
|
24
|
+
case '--isolation-mode':
|
|
25
|
+
case '-m':
|
|
26
|
+
i++;
|
|
27
|
+
if (args[i] === 'worktree' || args[i] === 'container') {
|
|
28
|
+
options.isolationMode = args[i];
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
throw new Error('--isolation-mode must be either "worktree" or "container"');
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
case '--source-path':
|
|
35
|
+
case '-p':
|
|
36
|
+
i++;
|
|
37
|
+
options.sourcePath = args[i];
|
|
38
|
+
break;
|
|
39
|
+
case '--base-branch':
|
|
40
|
+
case '-b':
|
|
41
|
+
i++;
|
|
42
|
+
options.baseBranch = args[i];
|
|
43
|
+
break;
|
|
44
|
+
case '--build-image':
|
|
45
|
+
options.buildImage = true;
|
|
46
|
+
break;
|
|
47
|
+
case '--disable-firewall':
|
|
48
|
+
options.disableFirewall = true;
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
if (arg.startsWith('-')) {
|
|
52
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
53
|
+
}
|
|
54
|
+
if (!projectItemUrl) {
|
|
55
|
+
projectItemUrl = arg;
|
|
56
|
+
}
|
|
57
|
+
else if (!shortBranchName) {
|
|
58
|
+
shortBranchName = arg;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error('Too many arguments');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
return { projectItemUrl, shortBranchName, options };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Prompt user to select base branch interactively
|
|
70
|
+
*/
|
|
71
|
+
async function promptBaseBranch() {
|
|
72
|
+
let currentBranch = 'unknown';
|
|
73
|
+
try {
|
|
74
|
+
currentBranch = await git.getCurrentBranch();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Ignore
|
|
78
|
+
}
|
|
79
|
+
const { choice } = await inquirer.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'list',
|
|
82
|
+
name: 'choice',
|
|
83
|
+
message: 'Select base branch:',
|
|
84
|
+
choices: [
|
|
85
|
+
{ name: `Current branch (${currentBranch})`, value: 'current' },
|
|
86
|
+
{ name: 'working/release', value: 'working/release' },
|
|
87
|
+
{ name: 'Enter custom branch', value: 'custom' }
|
|
88
|
+
],
|
|
89
|
+
default: 'current'
|
|
90
|
+
}
|
|
91
|
+
]);
|
|
92
|
+
if (choice === 'current') {
|
|
93
|
+
return currentBranch;
|
|
94
|
+
}
|
|
95
|
+
else if (choice === 'custom') {
|
|
96
|
+
const { customBranch } = await inquirer.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'input',
|
|
99
|
+
name: 'customBranch',
|
|
100
|
+
message: 'Enter branch name:',
|
|
101
|
+
validate: (input) => input.trim() ? true : 'Branch name cannot be empty'
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
104
|
+
return customBranch.trim();
|
|
105
|
+
}
|
|
106
|
+
return choice;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Run the setup-worktree hook if defined
|
|
110
|
+
*/
|
|
111
|
+
async function runSetupWorktreeHook(repoRoot) {
|
|
112
|
+
const hookCommand = await getSetupWorktreeHook(repoRoot);
|
|
113
|
+
if (!hookCommand) {
|
|
114
|
+
logger.dim('No setup-worktree hook defined');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
logger.step(`Running setup-worktree hook: ${hookCommand}`);
|
|
118
|
+
const exitCode = await execWithOutput('bash', [hookCommand], { cwd: repoRoot });
|
|
119
|
+
if (exitCode !== 0) {
|
|
120
|
+
logger.warning('Setup-worktree hook failed, continuing anyway');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Setup worktree isolation mode
|
|
125
|
+
*/
|
|
126
|
+
async function setupWorktreeIsolation(fullBranchName, shortBranchName, projectItemUrl, baseBranchName) {
|
|
127
|
+
logger.step('Setting up worktree isolation...');
|
|
128
|
+
// Create git worktree
|
|
129
|
+
const worktreePath = await git.createWorktree(fullBranchName, shortBranchName);
|
|
130
|
+
// Enter worktree and set up upstream
|
|
131
|
+
await git.enterWorktreeAndSetup(worktreePath, fullBranchName);
|
|
132
|
+
// Store project item URL and base branch in git config
|
|
133
|
+
await git.storeProjectItemUrl(projectItemUrl, fullBranchName);
|
|
134
|
+
await git.storeBaseBranch(baseBranchName, fullBranchName);
|
|
135
|
+
// Run repo-specific setup hook if defined
|
|
136
|
+
await runSetupWorktreeHook(worktreePath);
|
|
137
|
+
// Run claude command
|
|
138
|
+
if (projectItemUrl) {
|
|
139
|
+
const prompt = claude.getImplementationPrompt(projectItemUrl);
|
|
140
|
+
await claude.runInteractive(prompt, worktreePath);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
await claude.runInteractive(undefined, worktreePath);
|
|
144
|
+
}
|
|
145
|
+
// Output the final directory path for the user
|
|
146
|
+
logger.newline();
|
|
147
|
+
logger.info('To continue working in this directory, run:');
|
|
148
|
+
logger.plain(`cd ${worktreePath}`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Setup container isolation mode (not yet implemented)
|
|
152
|
+
*/
|
|
153
|
+
async function setupContainerIsolation(_fullBranchName, _shortBranchName, _projectItemUrl, _options) {
|
|
154
|
+
logger.error('Container isolation mode is not yet implemented in the CLI tool.');
|
|
155
|
+
logger.info('Please use the shell script directly:');
|
|
156
|
+
logger.plain('dev/workflow/start-project-item.sh --isolation-mode container <url>');
|
|
157
|
+
}
|
|
158
|
+
export const startProjectItemCommand = {
|
|
159
|
+
name: 'start-project-item',
|
|
160
|
+
aliases: ['s', 'start'],
|
|
161
|
+
description: 'Start implementing a project item in an isolated environment',
|
|
162
|
+
async execute(args) {
|
|
163
|
+
const { projectItemUrl, shortBranchName: providedBranchName, options } = parseArgs(args);
|
|
164
|
+
if (!projectItemUrl) {
|
|
165
|
+
throw new Error('Please provide a project item URL');
|
|
166
|
+
}
|
|
167
|
+
// Validate URL format
|
|
168
|
+
if (!projectItemUrl.includes('idea1.ai/project/items/')) {
|
|
169
|
+
logger.warning('URL does not appear to be an idea1.ai project item URL');
|
|
170
|
+
}
|
|
171
|
+
// Handle --base-branch prompt
|
|
172
|
+
if (options.baseBranch === 'prompt') {
|
|
173
|
+
options.baseBranch = await promptBaseBranch();
|
|
174
|
+
logger.info(`Using base branch: ${options.baseBranch}`);
|
|
175
|
+
}
|
|
176
|
+
// Navigate to source path if provided
|
|
177
|
+
if (options.sourcePath) {
|
|
178
|
+
process.chdir(options.sourcePath);
|
|
179
|
+
}
|
|
180
|
+
// Set workflow status to "Agent implementation"
|
|
181
|
+
await claude.setWorkflowStatus(projectItemUrl, 'Agent implementation');
|
|
182
|
+
// Generate branch name if not provided
|
|
183
|
+
let shortBranchName = providedBranchName;
|
|
184
|
+
if (!shortBranchName) {
|
|
185
|
+
shortBranchName = await claude.generateBranchName(projectItemUrl);
|
|
186
|
+
}
|
|
187
|
+
logger.info(`Using branch name: ${shortBranchName}`);
|
|
188
|
+
if (!shortBranchName) {
|
|
189
|
+
throw new Error('Failed to generate a branch name');
|
|
190
|
+
}
|
|
191
|
+
// Ensure clean working directory
|
|
192
|
+
await git.ensureCleanWorkingDirectory();
|
|
193
|
+
// Validate base branch exists
|
|
194
|
+
const baseBranchExists = await git.branchExists(options.baseBranch);
|
|
195
|
+
if (!baseBranchExists) {
|
|
196
|
+
throw new Error(`Base branch '${options.baseBranch}' does not exist locally or on origin`);
|
|
197
|
+
}
|
|
198
|
+
// Fetch latest, checkout base branch, create new branch
|
|
199
|
+
await git.fetchLatest();
|
|
200
|
+
await git.checkoutAndPullBranch(options.baseBranch);
|
|
201
|
+
const fullBranchName = `working/agent/${shortBranchName}`;
|
|
202
|
+
await git.createAndPushBranch(fullBranchName, options.baseBranch);
|
|
203
|
+
await git.prepareRepoForWorktree(fullBranchName, options.baseBranch);
|
|
204
|
+
logger.dim('Note: PR will be created later when changes are pushed');
|
|
205
|
+
// Setup isolation
|
|
206
|
+
if (options.isolationMode === 'container') {
|
|
207
|
+
await setupContainerIsolation(fullBranchName, shortBranchName, projectItemUrl, options);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
await setupWorktreeIsolation(fullBranchName, shortBranchName, projectItemUrl, options.baseBranch);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=start-project-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-project-item.js","sourceRoot":"","sources":["../../src/commands/start-project-item.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runCli } from './cli.js';
|
|
3
|
+
import { logger } from './lib/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Main entry point
|
|
6
|
+
*/
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
await runCli(process.argv);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const err = error;
|
|
13
|
+
logger.error(err.message);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
main();
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAgXA;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4DxD"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import readline from 'readline';
|
|
4
|
+
import { getAllCommands, getCommand } from './commands/index.js';
|
|
5
|
+
import { logger } from './lib/logger.js';
|
|
6
|
+
import { exec } from './lib/shell.js';
|
|
7
|
+
// Get package version
|
|
8
|
+
const VERSION = '1.0.0';
|
|
9
|
+
/**
|
|
10
|
+
* Display the CLI header
|
|
11
|
+
*/
|
|
12
|
+
async function displayHeader() {
|
|
13
|
+
// Get current working directory
|
|
14
|
+
const cwd = process.cwd();
|
|
15
|
+
// Try to get repo name
|
|
16
|
+
let repoName = '';
|
|
17
|
+
const result = await exec('git', ['rev-parse', '--show-toplevel']);
|
|
18
|
+
if (result.exitCode === 0) {
|
|
19
|
+
repoName = result.stdout.trim().split('/').pop() ?? '';
|
|
20
|
+
}
|
|
21
|
+
const headerText = `Idea1 CLI v${VERSION}`;
|
|
22
|
+
const locationText = repoName ? `${cwd} (${repoName})` : cwd;
|
|
23
|
+
console.log(boxen(`${chalk.bold.blue(headerText)}\n${chalk.dim(locationText)}`, {
|
|
24
|
+
padding: 1,
|
|
25
|
+
margin: 1,
|
|
26
|
+
borderStyle: 'round',
|
|
27
|
+
borderColor: 'blue'
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Display available commands
|
|
32
|
+
*/
|
|
33
|
+
function displayCommands() {
|
|
34
|
+
logger.newline();
|
|
35
|
+
console.log(chalk.bold('Available commands:'));
|
|
36
|
+
const commands = getAllCommands();
|
|
37
|
+
for (const cmd of commands) {
|
|
38
|
+
const aliases = cmd.aliases.length > 0 ? chalk.dim(` (${cmd.aliases.join(', ')})`) : '';
|
|
39
|
+
console.log(` ${chalk.cyan('/' + cmd.name)}${aliases} - ${cmd.description}`);
|
|
40
|
+
}
|
|
41
|
+
console.log(` ${chalk.cyan('/exit')}${chalk.dim(' (q, quit)')} - Exit the CLI`);
|
|
42
|
+
logger.newline();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a command line input
|
|
46
|
+
*/
|
|
47
|
+
function parseInput(input) {
|
|
48
|
+
const trimmed = input.trim();
|
|
49
|
+
// Handle slash commands
|
|
50
|
+
if (trimmed.startsWith('/')) {
|
|
51
|
+
const parts = trimmed.slice(1).split(/\s+/);
|
|
52
|
+
return {
|
|
53
|
+
command: parts[0] ?? '',
|
|
54
|
+
args: parts.slice(1)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Handle bare commands
|
|
58
|
+
const parts = trimmed.split(/\s+/);
|
|
59
|
+
return {
|
|
60
|
+
command: parts[0] ?? '',
|
|
61
|
+
args: parts.slice(1)
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build command menu items
|
|
66
|
+
*/
|
|
67
|
+
function buildCommandMenuItems() {
|
|
68
|
+
const commands = getAllCommands();
|
|
69
|
+
const items = [];
|
|
70
|
+
for (const cmd of commands) {
|
|
71
|
+
const aliasText = cmd.aliases.length > 0 ? ` (${cmd.aliases.join(', ')})` : '';
|
|
72
|
+
items.push({
|
|
73
|
+
commandName: '/' + cmd.name,
|
|
74
|
+
aliasText,
|
|
75
|
+
description: cmd.description,
|
|
76
|
+
value: '/' + cmd.name,
|
|
77
|
+
matchTerms: ['/' + cmd.name, ...cmd.aliases.map(a => '/' + a)]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Add exit command
|
|
81
|
+
items.push({
|
|
82
|
+
commandName: '/exit',
|
|
83
|
+
aliasText: ' (q, quit)',
|
|
84
|
+
description: 'Exit the CLI',
|
|
85
|
+
value: '/exit',
|
|
86
|
+
matchTerms: ['/exit', '/q', '/quit']
|
|
87
|
+
});
|
|
88
|
+
// Calculate max width for alignment
|
|
89
|
+
const maxWidth = Math.max(...items.map(e => e.commandName.length + e.aliasText.length));
|
|
90
|
+
return items.map(entry => {
|
|
91
|
+
const paddingNeeded = maxWidth - (entry.commandName.length + entry.aliasText.length) + 2;
|
|
92
|
+
const padding = ' '.repeat(paddingNeeded);
|
|
93
|
+
return {
|
|
94
|
+
displayName: entry.commandName + entry.aliasText + padding + entry.description,
|
|
95
|
+
value: entry.value,
|
|
96
|
+
matchTerms: entry.matchTerms
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Filter menu items based on search term
|
|
102
|
+
* Returns items with the matched term attached
|
|
103
|
+
*/
|
|
104
|
+
function filterMenuItems(items, term) {
|
|
105
|
+
if (!term.startsWith('/')) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
const searchTerm = term.toLowerCase();
|
|
109
|
+
const results = [];
|
|
110
|
+
for (const item of items) {
|
|
111
|
+
// Find which term matched
|
|
112
|
+
const matchedTerm = item.matchTerms.find(t => t.toLowerCase().startsWith(searchTerm));
|
|
113
|
+
if (matchedTerm) {
|
|
114
|
+
results.push({ ...item, matchedTerm });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return results;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Render a menu item (styled)
|
|
121
|
+
*/
|
|
122
|
+
function renderMenuItem(item, isHighlighted) {
|
|
123
|
+
const parts = item.displayName.match(/^(\/\S+)(\s*\([^)]*\))?(.*)$/);
|
|
124
|
+
if (!parts) {
|
|
125
|
+
return isHighlighted ? chalk.cyan(item.displayName) : chalk.white(item.displayName);
|
|
126
|
+
}
|
|
127
|
+
const [, command, aliases = '', rest] = parts;
|
|
128
|
+
if (isHighlighted) {
|
|
129
|
+
return chalk.cyan(command) + chalk.gray(aliases) + chalk.cyan(rest);
|
|
130
|
+
}
|
|
131
|
+
return chalk.white(command) + chalk.gray(aliases) + chalk.white(rest);
|
|
132
|
+
}
|
|
133
|
+
const MAX_MENU_ITEMS = 5;
|
|
134
|
+
/**
|
|
135
|
+
* Interactive prompt with command completion
|
|
136
|
+
*/
|
|
137
|
+
function createInteractivePrompt() {
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const menuItems = buildCommandMenuItems();
|
|
140
|
+
let currentInput = '';
|
|
141
|
+
let filteredItems = [];
|
|
142
|
+
let highlightIndex = 0;
|
|
143
|
+
let menuOpen = false; // Whether menu space has been reserved
|
|
144
|
+
const rl = readline.createInterface({
|
|
145
|
+
input: process.stdin,
|
|
146
|
+
output: process.stdout,
|
|
147
|
+
terminal: true
|
|
148
|
+
});
|
|
149
|
+
// Enable raw mode for keypress handling
|
|
150
|
+
if (process.stdin.isTTY) {
|
|
151
|
+
process.stdin.setRawMode(true);
|
|
152
|
+
}
|
|
153
|
+
readline.emitKeypressEvents(process.stdin, rl);
|
|
154
|
+
const openMenu = () => {
|
|
155
|
+
if (menuOpen)
|
|
156
|
+
return;
|
|
157
|
+
menuOpen = true;
|
|
158
|
+
// Print newlines to reserve space, then move cursor back up
|
|
159
|
+
process.stdout.write('\n'.repeat(MAX_MENU_ITEMS));
|
|
160
|
+
process.stdout.write(`\x1b[${MAX_MENU_ITEMS}A`);
|
|
161
|
+
};
|
|
162
|
+
const closeMenu = () => {
|
|
163
|
+
if (!menuOpen)
|
|
164
|
+
return;
|
|
165
|
+
// Clear the menu lines
|
|
166
|
+
process.stdout.write('\x1b7'); // Save cursor
|
|
167
|
+
for (let i = 0; i < MAX_MENU_ITEMS; i++) {
|
|
168
|
+
process.stdout.write('\n\x1b[2K'); // Move down and clear line
|
|
169
|
+
}
|
|
170
|
+
process.stdout.write('\x1b8'); // Restore cursor
|
|
171
|
+
menuOpen = false;
|
|
172
|
+
};
|
|
173
|
+
const renderPromptLine = () => {
|
|
174
|
+
process.stdout.write('\r\x1b[2K');
|
|
175
|
+
process.stdout.write(chalk.cyan('> ') + currentInput);
|
|
176
|
+
};
|
|
177
|
+
const renderMenu = () => {
|
|
178
|
+
if (!menuOpen)
|
|
179
|
+
return;
|
|
180
|
+
// Save cursor position
|
|
181
|
+
process.stdout.write('\x1b7');
|
|
182
|
+
// Render each menu slot (always MAX_MENU_ITEMS lines)
|
|
183
|
+
for (let i = 0; i < MAX_MENU_ITEMS; i++) {
|
|
184
|
+
process.stdout.write('\n\x1b[2K'); // Move down, clear line
|
|
185
|
+
if (i < filteredItems.length) {
|
|
186
|
+
const item = filteredItems[i];
|
|
187
|
+
const isHighlighted = i === highlightIndex;
|
|
188
|
+
const prefix = isHighlighted ? chalk.cyan('❯ ') : ' ';
|
|
189
|
+
process.stdout.write(prefix + renderMenuItem(item, isHighlighted));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Restore cursor position
|
|
193
|
+
process.stdout.write('\x1b8');
|
|
194
|
+
};
|
|
195
|
+
const updateDisplay = () => {
|
|
196
|
+
filteredItems = filterMenuItems(menuItems, currentInput).slice(0, MAX_MENU_ITEMS);
|
|
197
|
+
const isMenuNeeded = filteredItems.length > 0;
|
|
198
|
+
// Open menu if we now have items
|
|
199
|
+
if (isMenuNeeded && !menuOpen) {
|
|
200
|
+
openMenu();
|
|
201
|
+
}
|
|
202
|
+
// Close menu if we no longer have items
|
|
203
|
+
if (!isMenuNeeded && menuOpen) {
|
|
204
|
+
closeMenu();
|
|
205
|
+
}
|
|
206
|
+
// Clamp highlight index
|
|
207
|
+
highlightIndex = Math.min(highlightIndex, Math.max(0, filteredItems.length - 1));
|
|
208
|
+
renderPromptLine();
|
|
209
|
+
renderMenu();
|
|
210
|
+
};
|
|
211
|
+
const cleanup = () => {
|
|
212
|
+
closeMenu();
|
|
213
|
+
if (process.stdin.isTTY) {
|
|
214
|
+
process.stdin.setRawMode(false);
|
|
215
|
+
}
|
|
216
|
+
rl.close();
|
|
217
|
+
};
|
|
218
|
+
const completeWithHighlighted = () => {
|
|
219
|
+
if (filteredItems.length > 0 && highlightIndex < filteredItems.length) {
|
|
220
|
+
const item = filteredItems[highlightIndex];
|
|
221
|
+
currentInput = item.matchedTerm ?? item.value;
|
|
222
|
+
filteredItems = [];
|
|
223
|
+
closeMenu();
|
|
224
|
+
renderPromptLine();
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const submit = () => {
|
|
228
|
+
if (menuOpen && filteredItems.length > 0 && highlightIndex < filteredItems.length) {
|
|
229
|
+
const item = filteredItems[highlightIndex];
|
|
230
|
+
currentInput = item.matchedTerm ?? item.value;
|
|
231
|
+
}
|
|
232
|
+
closeMenu();
|
|
233
|
+
process.stdout.write('\n');
|
|
234
|
+
cleanup();
|
|
235
|
+
resolve(currentInput);
|
|
236
|
+
};
|
|
237
|
+
// Initial prompt
|
|
238
|
+
renderPromptLine();
|
|
239
|
+
process.stdin.on('keypress', (str, key) => {
|
|
240
|
+
if (!key)
|
|
241
|
+
return;
|
|
242
|
+
// Handle Ctrl+C
|
|
243
|
+
if (key.ctrl && key.name === 'c') {
|
|
244
|
+
cleanup();
|
|
245
|
+
process.stdout.write('\n');
|
|
246
|
+
reject(new Error('force closed'));
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Handle Tab - complete with highlighted item
|
|
250
|
+
if (key.name === 'tab') {
|
|
251
|
+
completeWithHighlighted();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
// Handle Enter - submit
|
|
255
|
+
if (key.name === 'return') {
|
|
256
|
+
submit();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Handle arrow keys for menu navigation
|
|
260
|
+
if (key.name === 'up' && menuOpen && filteredItems.length > 0) {
|
|
261
|
+
highlightIndex = Math.max(0, highlightIndex - 1);
|
|
262
|
+
renderMenu();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (key.name === 'down' && menuOpen && filteredItems.length > 0) {
|
|
266
|
+
highlightIndex = Math.min(filteredItems.length - 1, highlightIndex + 1);
|
|
267
|
+
renderMenu();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// Prevent arrow keys from inserting escape sequences
|
|
271
|
+
if (key.name === 'up' || key.name === 'down' || key.name === 'left' || key.name === 'right') {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Handle backspace
|
|
275
|
+
if (key.name === 'backspace') {
|
|
276
|
+
if (currentInput.length > 0) {
|
|
277
|
+
currentInput = currentInput.slice(0, -1);
|
|
278
|
+
highlightIndex = 0;
|
|
279
|
+
updateDisplay();
|
|
280
|
+
}
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
// Handle regular character input
|
|
284
|
+
if (str && !key.ctrl && !key.meta && str.length === 1) {
|
|
285
|
+
currentInput += str;
|
|
286
|
+
highlightIndex = 0;
|
|
287
|
+
updateDisplay();
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Run the interactive REPL
|
|
294
|
+
*/
|
|
295
|
+
export async function runInteractiveMode() {
|
|
296
|
+
await displayHeader();
|
|
297
|
+
displayCommands();
|
|
298
|
+
// eslint-disable-next-line no-constant-condition
|
|
299
|
+
while (true) {
|
|
300
|
+
try {
|
|
301
|
+
const selectedCommand = await createInteractivePrompt();
|
|
302
|
+
if (!selectedCommand) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const { command, args } = parseInput(selectedCommand);
|
|
306
|
+
// Handle empty input
|
|
307
|
+
if (!command) {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
// Handle exit commands
|
|
311
|
+
if (['exit', 'q', 'quit'].includes(command.toLowerCase())) {
|
|
312
|
+
logger.info('Goodbye!');
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
// Handle help shortcut
|
|
316
|
+
if (command === '?' || command === 'commands') {
|
|
317
|
+
displayCommands();
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
// Look up command
|
|
321
|
+
const cmd = getCommand(command);
|
|
322
|
+
if (!cmd) {
|
|
323
|
+
logger.error(`Unknown command: ${command}`);
|
|
324
|
+
logger.dim('Type /help or /? to see available commands');
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
// Execute command
|
|
328
|
+
try {
|
|
329
|
+
await cmd.execute(args);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
const err = error;
|
|
333
|
+
logger.error(err.message);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
// Handle Ctrl+C gracefully
|
|
338
|
+
const err = error;
|
|
339
|
+
if (err.message?.includes('force closed') || err.name === 'ExitPromptError') {
|
|
340
|
+
logger.newline();
|
|
341
|
+
logger.info('Goodbye!');
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger utility for consistent console output with colors
|
|
3
|
+
*/
|
|
4
|
+
export declare const logger: {
|
|
5
|
+
info: (message: string) => void;
|
|
6
|
+
success: (message: string) => void;
|
|
7
|
+
warning: (message: string) => void;
|
|
8
|
+
error: (message: string) => void;
|
|
9
|
+
step: (message: string) => void;
|
|
10
|
+
dim: (message: string) => void;
|
|
11
|
+
plain: (message: string) => void;
|
|
12
|
+
header: (message: string) => void;
|
|
13
|
+
section: (message: string) => void;
|
|
14
|
+
newline: () => void;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,MAAM;oBACD,MAAM,KAAG,IAAI;uBAIV,MAAM,KAAG,IAAI;uBAIb,MAAM,KAAG,IAAI;qBAIf,MAAM,KAAG,IAAI;oBAId,MAAM,KAAG,IAAI;mBAId,MAAM,KAAG,IAAI;qBAIX,MAAM,KAAG,IAAI;sBAIZ,MAAM,KAAG,IAAI;uBAQZ,MAAM,KAAG,IAAI;mBAOnB,IAAI;CAGlB,CAAC"}
|