@lovelybunch/cli 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +221 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +90 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +100 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +121 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +70 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +108 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +146 -0
- package/dist/commands/show.js.map +1 -0
- package/package.json +6 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { fileStorage } from '@lovelybunch/core';
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { dirname, join } from 'path';
|
|
8
|
+
import { initCommand } from './commands/init.js';
|
|
9
|
+
import { proposeCommand } from './commands/propose.js';
|
|
10
|
+
import { listCommand } from './commands/list.js';
|
|
11
|
+
import { showCommand } from './commands/show.js';
|
|
12
|
+
import { serveCommand } from './commands/serve.js';
|
|
13
|
+
import { agentCommand } from './commands/agent.js';
|
|
14
|
+
import { implementCommand } from './commands/implement.js';
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
// Read version from package.json
|
|
18
|
+
let version = '1.0.0'; // fallback
|
|
19
|
+
try {
|
|
20
|
+
const packagePath = join(__dirname, '..', 'package.json');
|
|
21
|
+
const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
22
|
+
version = packageJson.version;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.warn('Could not read package.json version, using fallback');
|
|
26
|
+
}
|
|
27
|
+
const program = new Command();
|
|
28
|
+
program
|
|
29
|
+
.name('gait')
|
|
30
|
+
.description('GAIT - Agent-Native Source Control Management System')
|
|
31
|
+
.version(version);
|
|
32
|
+
// Add commands
|
|
33
|
+
program.addCommand(initCommand);
|
|
34
|
+
program.addCommand(proposeCommand);
|
|
35
|
+
program.addCommand(listCommand);
|
|
36
|
+
program.addCommand(showCommand);
|
|
37
|
+
program.addCommand(serveCommand);
|
|
38
|
+
program.addCommand(agentCommand);
|
|
39
|
+
program.addCommand(implementCommand);
|
|
40
|
+
// Global error handling
|
|
41
|
+
program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
42
|
+
const commandName = actionCommand.name();
|
|
43
|
+
// Skip initialization check for 'init' command
|
|
44
|
+
if (commandName === 'init') {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Check if GAIT is initialized for other commands
|
|
48
|
+
const isInitialized = await fileStorage.isInitialized();
|
|
49
|
+
if (!isInitialized) {
|
|
50
|
+
console.error(chalk.red('Error: GAIT is not initialized in this directory.'));
|
|
51
|
+
console.error(chalk.yellow('Run "gait init" to initialize GAIT.'));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Parse command line arguments
|
|
56
|
+
program.parse(process.argv);
|
|
57
|
+
// Show help if no command provided
|
|
58
|
+
if (!process.argv.slice(2).length) {
|
|
59
|
+
program.outputHelp();
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,QAAA,MAAM,KAAK,SAAuB,CAAC;AAmPnC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { fileStorage } from '@lovelybunch/core';
|
|
4
|
+
const agent = new Command('agent');
|
|
5
|
+
agent
|
|
6
|
+
.description('Manage AI agents')
|
|
7
|
+
.alias('agents');
|
|
8
|
+
// List agents
|
|
9
|
+
const listAgents = new Command('list');
|
|
10
|
+
listAgents
|
|
11
|
+
.description('List all agents')
|
|
12
|
+
.alias('ls')
|
|
13
|
+
.action(async () => {
|
|
14
|
+
try {
|
|
15
|
+
const agents = await fileStorage.loadAllAgents();
|
|
16
|
+
if (agents.length === 0) {
|
|
17
|
+
console.log(chalk.yellow('No agents found.'));
|
|
18
|
+
console.log(chalk.gray('Use "gait agent create" to create your first agent.'));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold(`Found ${agents.length} agent${agents.length === 1 ? '' : 's'}:\n`));
|
|
22
|
+
agents.forEach(agent => {
|
|
23
|
+
console.log(chalk.cyan(`${agent.id}`));
|
|
24
|
+
console.log(` Name: ${agent.name}`);
|
|
25
|
+
console.log(` Description: ${agent.description}`);
|
|
26
|
+
if (agent.tools && agent.tools.length > 0) {
|
|
27
|
+
console.log(` Tools: ${agent.tools.join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(` Tools: ${chalk.gray('All tools (inherited)')}`);
|
|
31
|
+
}
|
|
32
|
+
if (agent.metadata?.createdAt) {
|
|
33
|
+
console.log(` Created: ${agent.metadata.createdAt.toLocaleDateString()}`);
|
|
34
|
+
}
|
|
35
|
+
console.log();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error(chalk.red('Error listing agents:'), error.message);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// Show agent details
|
|
44
|
+
const showAgent = new Command('show');
|
|
45
|
+
showAgent
|
|
46
|
+
.description('Show agent details')
|
|
47
|
+
.argument('<id>', 'Agent ID')
|
|
48
|
+
.action(async (id) => {
|
|
49
|
+
try {
|
|
50
|
+
const agentData = await fileStorage.loadAgent(id);
|
|
51
|
+
if (!agentData) {
|
|
52
|
+
console.error(chalk.red(`Agent '${id}' not found.`));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.bold.cyan(agentData.name));
|
|
56
|
+
console.log(chalk.gray(`ID: ${agentData.id}`));
|
|
57
|
+
console.log(chalk.gray(`Description: ${agentData.description}`));
|
|
58
|
+
if (agentData.tools && agentData.tools.length > 0) {
|
|
59
|
+
console.log(chalk.gray(`Tools: ${agentData.tools.join(', ')}`));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(chalk.gray('Tools: All tools (inherited)'));
|
|
63
|
+
}
|
|
64
|
+
if (agentData.metadata?.createdAt) {
|
|
65
|
+
console.log(chalk.gray(`Created: ${agentData.metadata.createdAt.toLocaleDateString()}`));
|
|
66
|
+
}
|
|
67
|
+
if (agentData.metadata?.updatedAt) {
|
|
68
|
+
console.log(chalk.gray(`Updated: ${agentData.metadata.updatedAt.toLocaleDateString()}`));
|
|
69
|
+
}
|
|
70
|
+
if (agentData.content) {
|
|
71
|
+
console.log(chalk.bold('\nInstructions:'));
|
|
72
|
+
console.log(agentData.content);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(chalk.red('Error showing agent:'), error.message);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Create agent
|
|
81
|
+
const createAgent = new Command('create');
|
|
82
|
+
createAgent
|
|
83
|
+
.description('Create a new agent')
|
|
84
|
+
.argument('<name>', 'Agent name')
|
|
85
|
+
.argument('<description>', 'Agent description')
|
|
86
|
+
.option('-t, --tools <tools>', 'Comma-separated list of tools')
|
|
87
|
+
.option('-c, --content <content>', 'Agent instructions/system prompt')
|
|
88
|
+
.option('-f, --file <file>', 'Read instructions from file')
|
|
89
|
+
.action(async (name, description, options) => {
|
|
90
|
+
try {
|
|
91
|
+
let content = options.content;
|
|
92
|
+
if (options.file) {
|
|
93
|
+
const fs = await import('fs/promises');
|
|
94
|
+
content = await fs.readFile(options.file, 'utf-8');
|
|
95
|
+
}
|
|
96
|
+
const tools = options.tools ? options.tools.split(',').map((t) => t.trim()) : undefined;
|
|
97
|
+
const agent = {
|
|
98
|
+
id: name.toLowerCase().replace(/[^a-z0-9]+/g, '-'),
|
|
99
|
+
name,
|
|
100
|
+
description,
|
|
101
|
+
tools,
|
|
102
|
+
content,
|
|
103
|
+
metadata: {
|
|
104
|
+
createdAt: new Date(),
|
|
105
|
+
updatedAt: new Date(),
|
|
106
|
+
author: { type: 'human', id: 'current-user', name: 'Current User' }
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
// Check if agent already exists
|
|
110
|
+
const existing = await fileStorage.loadAgent(agent.id);
|
|
111
|
+
if (existing) {
|
|
112
|
+
console.error(chalk.red(`Agent '${agent.id}' already exists.`));
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
await fileStorage.saveAgent(agent);
|
|
116
|
+
console.log(chalk.green(`✓ Agent '${agent.id}' created successfully.`));
|
|
117
|
+
console.log(chalk.gray(` Name: ${agent.name}`));
|
|
118
|
+
console.log(chalk.gray(` Description: ${agent.description}`));
|
|
119
|
+
if (agent.tools) {
|
|
120
|
+
console.log(chalk.gray(` Tools: ${agent.tools.join(', ')}`));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(chalk.red('Error creating agent:'), error.message);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Update agent
|
|
129
|
+
const updateAgent = new Command('update');
|
|
130
|
+
updateAgent
|
|
131
|
+
.description('Update an existing agent')
|
|
132
|
+
.argument('<id>', 'Agent ID')
|
|
133
|
+
.option('-n, --name <name>', 'New agent name')
|
|
134
|
+
.option('-d, --description <description>', 'New description')
|
|
135
|
+
.option('-t, --tools <tools>', 'Comma-separated list of tools')
|
|
136
|
+
.option('-c, --content <content>', 'New agent instructions/system prompt')
|
|
137
|
+
.option('-f, --file <file>', 'Read instructions from file')
|
|
138
|
+
.action(async (id, options) => {
|
|
139
|
+
try {
|
|
140
|
+
const agent = await fileStorage.loadAgent(id);
|
|
141
|
+
if (!agent) {
|
|
142
|
+
console.error(chalk.red(`Agent '${id}' not found.`));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
let content = options.content || agent.content;
|
|
146
|
+
if (options.file) {
|
|
147
|
+
const fs = await import('fs/promises');
|
|
148
|
+
content = await fs.readFile(options.file, 'utf-8');
|
|
149
|
+
}
|
|
150
|
+
const tools = options.tools ? options.tools.split(',').map((t) => t.trim()) : agent.tools;
|
|
151
|
+
const updatedAgent = {
|
|
152
|
+
...agent,
|
|
153
|
+
name: options.name || agent.name,
|
|
154
|
+
description: options.description || agent.description,
|
|
155
|
+
tools,
|
|
156
|
+
content,
|
|
157
|
+
metadata: {
|
|
158
|
+
createdAt: agent.metadata?.createdAt || new Date(),
|
|
159
|
+
author: agent.metadata?.author || { type: 'human', id: 'current-user', name: 'Current User' },
|
|
160
|
+
...agent.metadata,
|
|
161
|
+
updatedAt: new Date()
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
await fileStorage.saveAgent(updatedAgent);
|
|
165
|
+
console.log(chalk.green(`✓ Agent '${id}' updated successfully.`));
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error(chalk.red('Error updating agent:'), error.message);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
// Delete agent
|
|
173
|
+
const deleteAgent = new Command('delete');
|
|
174
|
+
deleteAgent
|
|
175
|
+
.description('Delete an agent')
|
|
176
|
+
.argument('<id>', 'Agent ID')
|
|
177
|
+
.option('-f, --force', 'Skip confirmation prompt')
|
|
178
|
+
.action(async (id, options) => {
|
|
179
|
+
try {
|
|
180
|
+
const agent = await fileStorage.loadAgent(id);
|
|
181
|
+
if (!agent) {
|
|
182
|
+
console.error(chalk.red(`Agent '${id}' not found.`));
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
if (!options.force) {
|
|
186
|
+
const { default: inquirer } = await import('inquirer');
|
|
187
|
+
const { confirm } = await inquirer.prompt([
|
|
188
|
+
{
|
|
189
|
+
type: 'confirm',
|
|
190
|
+
name: 'confirm',
|
|
191
|
+
message: `Are you sure you want to delete agent '${id}'?`,
|
|
192
|
+
default: false
|
|
193
|
+
}
|
|
194
|
+
]);
|
|
195
|
+
if (!confirm) {
|
|
196
|
+
console.log(chalk.yellow('Operation cancelled.'));
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const deleted = await fileStorage.deleteAgent(id);
|
|
201
|
+
if (deleted) {
|
|
202
|
+
console.log(chalk.green(`✓ Agent '${id}' deleted successfully.`));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.error(chalk.red(`Failed to delete agent '${id}'.`));
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error(chalk.red('Error deleting agent:'), error.message);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
// Add subcommands
|
|
215
|
+
agent.addCommand(listAgents);
|
|
216
|
+
agent.addCommand(showAgent);
|
|
217
|
+
agent.addCommand(createAgent);
|
|
218
|
+
agent.addCommand(updateAgent);
|
|
219
|
+
agent.addCommand(deleteAgent);
|
|
220
|
+
export { agent as agentCommand };
|
|
221
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,gBAAgB,SA2FzB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { fileStorage } from '@lovelybunch/core';
|
|
5
|
+
export const implementCommand = new Command('implement')
|
|
6
|
+
.description('Start implementing a proposal using an AI assistant in terminal mode')
|
|
7
|
+
.argument('<proposal-id>', 'The proposal ID to implement (e.g., cp-1756262782987)')
|
|
8
|
+
.option('--model <model>', 'AI model to use for implementation', 'claude')
|
|
9
|
+
.action(async (proposalId, options) => {
|
|
10
|
+
try {
|
|
11
|
+
// Validate proposal exists
|
|
12
|
+
const proposal = await fileStorage.loadProposal(proposalId);
|
|
13
|
+
if (!proposal) {
|
|
14
|
+
console.error(chalk.red(`❌ Proposal '${proposalId}' not found.`));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk.blue(`🚀 Starting implementation of proposal: ${proposalId}`));
|
|
18
|
+
console.log(chalk.gray(`📝 ${proposal.intent}`));
|
|
19
|
+
console.log(chalk.gray(`🤖 Using model: ${options.model}`));
|
|
20
|
+
console.log(chalk.gray(`💡 Tip: Use 'exit' to quit the implementation session\n`));
|
|
21
|
+
// Determine which command to run based on model
|
|
22
|
+
let command;
|
|
23
|
+
let args;
|
|
24
|
+
switch (options.model.toLowerCase()) {
|
|
25
|
+
case 'claude':
|
|
26
|
+
command = 'claude';
|
|
27
|
+
args = ['code'];
|
|
28
|
+
break;
|
|
29
|
+
case 'gemini':
|
|
30
|
+
// Assuming gemini CLI exists
|
|
31
|
+
command = 'gemini';
|
|
32
|
+
args = ['code'];
|
|
33
|
+
break;
|
|
34
|
+
case 'codex':
|
|
35
|
+
// Assuming codex CLI exists
|
|
36
|
+
command = 'codex';
|
|
37
|
+
args = ['code'];
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
console.error(chalk.red(`❌ Unsupported model: ${options.model}`));
|
|
41
|
+
console.error(chalk.yellow('Supported models: claude, gemini, codex'));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
// Set environment variables for the AI assistant context
|
|
45
|
+
const env = {
|
|
46
|
+
...process.env,
|
|
47
|
+
GAIT_PROPOSAL_ID: proposalId,
|
|
48
|
+
GAIT_PROPOSAL_INTENT: proposal.intent,
|
|
49
|
+
GAIT_PROJECT_ROOT: process.cwd(),
|
|
50
|
+
};
|
|
51
|
+
// Start the AI assistant terminal session
|
|
52
|
+
const child = spawn(command, args, {
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
env,
|
|
55
|
+
cwd: process.cwd(),
|
|
56
|
+
});
|
|
57
|
+
// Handle child process events
|
|
58
|
+
child.on('error', (error) => {
|
|
59
|
+
if (error.code === 'ENOENT') {
|
|
60
|
+
console.error(chalk.red(`❌ Command '${command}' not found.`));
|
|
61
|
+
console.error(chalk.yellow(`Please make sure ${options.model} CLI is installed and available in your PATH.`));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.error(chalk.red(`❌ Error starting ${options.model}:`), error.message);
|
|
65
|
+
}
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
68
|
+
child.on('exit', (code) => {
|
|
69
|
+
if (code === 0) {
|
|
70
|
+
console.log(chalk.green(`✅ Implementation session completed successfully.`));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(chalk.yellow(`⚠️ Implementation session ended with code ${code}.`));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Handle Ctrl+C gracefully
|
|
77
|
+
process.on('SIGINT', () => {
|
|
78
|
+
console.log(chalk.yellow('\n🛑 Terminating implementation session...'));
|
|
79
|
+
child.kill('SIGINT');
|
|
80
|
+
});
|
|
81
|
+
process.on('SIGTERM', () => {
|
|
82
|
+
child.kill('SIGTERM');
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error(chalk.red('❌ Error starting implementation:'), error.message);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,sEAAsE,CAAC;KACnF,QAAQ,CAAC,eAAe,EAAE,uDAAuD,CAAC;KAClF,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,EAAE,QAAQ,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAA0B,EAAE,EAAE;IAC/D,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,UAAU,cAAc,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;QAEnF,gDAAgD;QAChD,IAAI,OAAe,CAAC;QACpB,IAAI,IAAc,CAAC;QAEnB,QAAQ,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,KAAK,QAAQ;gBACX,OAAO,GAAG,QAAQ,CAAC;gBACnB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,QAAQ;gBACX,6BAA6B;gBAC7B,OAAO,GAAG,QAAQ,CAAC;gBACnB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,OAAO;gBACV,4BAA4B;gBAC5B,OAAO,GAAG,OAAO,CAAC;gBAClB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;gBAChB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,MAAM,GAAG,GAAG;YACV,GAAG,OAAO,CAAC,GAAG;YACd,gBAAgB,EAAE,UAAU;YAC5B,oBAAoB,EAAE,QAAQ,CAAC,MAAM;YACrC,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE;SACjC,CAAC;QAEF,0CAA0C;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,SAAS;YAChB,GAAG;YACH,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QAEH,8BAA8B;QAC9B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,OAAO,cAAc,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,OAAO,CAAC,KAAK,+CAA+C,CAAC,CAAC,CAAC;YAChH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,IAAI,GAAG,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAoGpB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { fileStorage } from '@lovelybunch/core';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
export const initCommand = new Command('init')
|
|
8
|
+
.description('Initialize GAIT in the current repository')
|
|
9
|
+
.option('--name <name>', 'Repository name')
|
|
10
|
+
.option('--description <description>', 'Repository description')
|
|
11
|
+
.option('--force', 'Force initialization even if already initialized')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
const spinner = ora('Initializing GAIT...').start();
|
|
14
|
+
try {
|
|
15
|
+
// Check if already initialized
|
|
16
|
+
const isInitialized = await fileStorage.isInitialized();
|
|
17
|
+
if (isInitialized && !options.force) {
|
|
18
|
+
spinner.fail('GAIT is already initialized in this directory');
|
|
19
|
+
console.log(chalk.yellow('Use --force to reinitialize'));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Gather configuration details
|
|
23
|
+
let answers = {};
|
|
24
|
+
// If all required options are provided, skip prompts
|
|
25
|
+
if (options.name && options.description) {
|
|
26
|
+
answers = {
|
|
27
|
+
name: options.name,
|
|
28
|
+
description: options.description,
|
|
29
|
+
requireApproval: true,
|
|
30
|
+
minApprovers: 1,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
spinner.stop();
|
|
35
|
+
answers = await inquirer.prompt([
|
|
36
|
+
{
|
|
37
|
+
type: 'input',
|
|
38
|
+
name: 'name',
|
|
39
|
+
message: 'Repository name:',
|
|
40
|
+
default: options.name || path.basename(process.cwd()),
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'input',
|
|
44
|
+
name: 'description',
|
|
45
|
+
message: 'Repository description:',
|
|
46
|
+
default: options.description || 'GAIT-managed repository',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: 'confirm',
|
|
50
|
+
name: 'requireApproval',
|
|
51
|
+
message: 'Require approval for changes?',
|
|
52
|
+
default: true,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'number',
|
|
56
|
+
name: 'minApprovers',
|
|
57
|
+
message: 'Minimum number of approvers:',
|
|
58
|
+
default: 1,
|
|
59
|
+
when: (answers) => answers.requireApproval,
|
|
60
|
+
},
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
spinner.start('Creating GAIT configuration...');
|
|
64
|
+
// Create configuration
|
|
65
|
+
const config = {
|
|
66
|
+
version: '1.0.0',
|
|
67
|
+
repository: {
|
|
68
|
+
name: answers.name,
|
|
69
|
+
description: answers.description,
|
|
70
|
+
},
|
|
71
|
+
policies: {
|
|
72
|
+
requireApproval: answers.requireApproval,
|
|
73
|
+
minApprovers: answers.minApprovers || 1,
|
|
74
|
+
allowSelfApproval: false,
|
|
75
|
+
autoMerge: false,
|
|
76
|
+
},
|
|
77
|
+
storage: {
|
|
78
|
+
type: 'file',
|
|
79
|
+
path: '.gait',
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
// Initialize storage
|
|
83
|
+
await fileStorage.init();
|
|
84
|
+
await fileStorage.saveConfig(config);
|
|
85
|
+
spinner.succeed('GAIT initialized successfully!');
|
|
86
|
+
console.log('\n' + chalk.green('✓') + ' Created .gait directory');
|
|
87
|
+
console.log(chalk.green('✓') + ' Created configuration file');
|
|
88
|
+
console.log(chalk.green('✓') + ' Repository ready for GAIT operations');
|
|
89
|
+
console.log('\n' + chalk.cyan('Next steps:'));
|
|
90
|
+
console.log(' • Create your first change proposal: ' + chalk.yellow('gait propose "Your intent"'));
|
|
91
|
+
console.log(' • List proposals: ' + chalk.yellow('gait list'));
|
|
92
|
+
console.log(' • View help: ' + chalk.yellow('gait --help'));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
spinner.fail('Failed to initialize GAIT');
|
|
96
|
+
console.error(chalk.red('Error:'), error);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;KAC1C,MAAM,CAAC,6BAA6B,EAAE,wBAAwB,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,kDAAkD,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,CAAC;QACxD,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,GAAQ,EAAE,CAAC;QAEtB,qDAAqD;QACrD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,GAAG;gBACR,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,CAAC;aAChB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,kBAAkB;oBAC3B,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;iBACtD;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,yBAAyB;oBAClC,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,yBAAyB;iBAC1D;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,+BAA+B;oBACxC,OAAO,EAAE,IAAI;iBACd;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,8BAA8B;oBACvC,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe;iBAC3C;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAEhD,uBAAuB;QACvB,MAAM,MAAM,GAAe;YACzB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC;YACD,QAAQ,EAAE;gBACR,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC;gBACvC,iBAAiB,EAAE,KAAK;gBACxB,SAAS,EAAE,KAAK;aACjB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;aACd;SACF,CAAC;QAEF,qBAAqB;QACrB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAErC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,0BAA0B,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,6BAA6B,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,uCAAuC,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,yCAAyC,GAAG,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAE/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAkIpB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { table } from 'table';
|
|
5
|
+
import { cpManager, markdownStorage } from '@lovelybunch/core';
|
|
6
|
+
import Fuse from 'fuse.js';
|
|
7
|
+
export const listCommand = new Command('list')
|
|
8
|
+
.description('List all Change Proposals')
|
|
9
|
+
.option('-s, --status <status>', 'Filter by status (draft/proposed/in-review/approved/merged/rejected)')
|
|
10
|
+
.option('-a, --author <author>', 'Filter by author name or email')
|
|
11
|
+
.option('-q, --query <query>', 'Search proposals by content (fuzzy search)')
|
|
12
|
+
.option('-l, --limit <number>', 'Limit number of results', '20')
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
const spinner = ora('Loading Change Proposals...').start();
|
|
15
|
+
try {
|
|
16
|
+
// Load proposals from storage
|
|
17
|
+
const proposals = await markdownStorage.loadAllProposals();
|
|
18
|
+
cpManager.import(proposals);
|
|
19
|
+
// Apply filters
|
|
20
|
+
const listOptions = {
|
|
21
|
+
limit: parseInt(options.limit, 10),
|
|
22
|
+
};
|
|
23
|
+
if (options.status) {
|
|
24
|
+
listOptions.status = options.status;
|
|
25
|
+
}
|
|
26
|
+
if (options.author) {
|
|
27
|
+
listOptions.author = options.author;
|
|
28
|
+
}
|
|
29
|
+
let filteredProposals = cpManager.list(listOptions);
|
|
30
|
+
// Apply search filter if provided
|
|
31
|
+
if (options.query) {
|
|
32
|
+
const fuse = new Fuse(filteredProposals, {
|
|
33
|
+
keys: [
|
|
34
|
+
{ name: 'intent', weight: 0.4 },
|
|
35
|
+
{ name: 'id', weight: 0.3 },
|
|
36
|
+
{ name: 'author.name', weight: 0.2 },
|
|
37
|
+
{ name: 'metadata.tags', weight: 0.1 }
|
|
38
|
+
],
|
|
39
|
+
threshold: 0.3,
|
|
40
|
+
includeScore: true
|
|
41
|
+
});
|
|
42
|
+
const searchResults = fuse.search(options.query);
|
|
43
|
+
filteredProposals = searchResults.map(result => result.item);
|
|
44
|
+
}
|
|
45
|
+
spinner.stop();
|
|
46
|
+
if (filteredProposals.length === 0) {
|
|
47
|
+
console.log(chalk.yellow('No Change Proposals found.'));
|
|
48
|
+
if (options.status || options.author || options.query) {
|
|
49
|
+
console.log(chalk.gray('Try adjusting your filters or search query.'));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(chalk.gray('Create one with: gait propose "Your intent"'));
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Prepare table data
|
|
57
|
+
const tableData = [
|
|
58
|
+
[
|
|
59
|
+
chalk.bold('ID'),
|
|
60
|
+
chalk.bold('Intent'),
|
|
61
|
+
chalk.bold('Author'),
|
|
62
|
+
chalk.bold('Status'),
|
|
63
|
+
chalk.bold('Created'),
|
|
64
|
+
],
|
|
65
|
+
];
|
|
66
|
+
for (const proposal of filteredProposals) {
|
|
67
|
+
const intent = proposal.intent.length > 40
|
|
68
|
+
? proposal.intent.substring(0, 37) + '...'
|
|
69
|
+
: proposal.intent;
|
|
70
|
+
const statusColor = {
|
|
71
|
+
draft: chalk.gray,
|
|
72
|
+
proposed: chalk.blue,
|
|
73
|
+
'in-review': chalk.yellow,
|
|
74
|
+
approved: chalk.green,
|
|
75
|
+
merged: chalk.cyan,
|
|
76
|
+
rejected: chalk.red,
|
|
77
|
+
}[proposal.status] || chalk.white;
|
|
78
|
+
tableData.push([
|
|
79
|
+
chalk.cyan(proposal.id),
|
|
80
|
+
intent,
|
|
81
|
+
`${proposal.author.name}\n${chalk.gray(proposal.author.type)}`,
|
|
82
|
+
statusColor(proposal.status.toUpperCase()),
|
|
83
|
+
chalk.gray(proposal.metadata.createdAt.toLocaleDateString()),
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
// Display table
|
|
87
|
+
const tableConfig = {
|
|
88
|
+
border: {
|
|
89
|
+
topBody: chalk.gray('─'),
|
|
90
|
+
topJoin: chalk.gray('┬'),
|
|
91
|
+
topLeft: chalk.gray('┌'),
|
|
92
|
+
topRight: chalk.gray('┐'),
|
|
93
|
+
bottomBody: chalk.gray('─'),
|
|
94
|
+
bottomJoin: chalk.gray('┴'),
|
|
95
|
+
bottomLeft: chalk.gray('└'),
|
|
96
|
+
bottomRight: chalk.gray('┘'),
|
|
97
|
+
bodyLeft: chalk.gray('│'),
|
|
98
|
+
bodyRight: chalk.gray('│'),
|
|
99
|
+
bodyJoin: chalk.gray('│'),
|
|
100
|
+
joinBody: chalk.gray('─'),
|
|
101
|
+
joinLeft: chalk.gray('├'),
|
|
102
|
+
joinRight: chalk.gray('┤'),
|
|
103
|
+
joinJoin: chalk.gray('┼'),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
console.log('\n' + chalk.bold('Change Proposals'));
|
|
107
|
+
console.log(table(tableData, tableConfig));
|
|
108
|
+
console.log(chalk.gray(`Showing ${filteredProposals.length} of ${proposals.length} proposals`));
|
|
109
|
+
if (filteredProposals.length > 0) {
|
|
110
|
+
console.log('\n' + chalk.cyan('Actions:'));
|
|
111
|
+
console.log(' • View details: ' + chalk.yellow('gait show <id>'));
|
|
112
|
+
console.log(' • Create new: ' + chalk.yellow('gait propose "Your intent"'));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
spinner.fail('Failed to list Change Proposals');
|
|
117
|
+
console.error(chalk.red('Error:'), error);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,cAAc,SAwEvB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { cpManager, markdownStorage } from '@lovelybunch/core';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
export const proposeCommand = new Command('propose')
|
|
8
|
+
.description('Create a new Change Proposal')
|
|
9
|
+
.argument('<intent>', 'The intent of the change')
|
|
10
|
+
.option('--author <name>', 'Author name')
|
|
11
|
+
.option('--email <email>', 'Author email')
|
|
12
|
+
.option('--type <type>', 'Author type (human/agent)', 'human')
|
|
13
|
+
.action(async (intent, options) => {
|
|
14
|
+
const spinner = ora('Creating Change Proposal...').start();
|
|
15
|
+
try {
|
|
16
|
+
// Load existing proposals
|
|
17
|
+
spinner.text = 'Loading existing proposals...';
|
|
18
|
+
const existingProposals = await markdownStorage.loadAllProposals();
|
|
19
|
+
cpManager.import(existingProposals);
|
|
20
|
+
// Get author information
|
|
21
|
+
spinner.stop();
|
|
22
|
+
const authorInfo = await inquirer.prompt([
|
|
23
|
+
{
|
|
24
|
+
type: 'input',
|
|
25
|
+
name: 'name',
|
|
26
|
+
message: 'Author name:',
|
|
27
|
+
default: options.author || os.userInfo().username,
|
|
28
|
+
when: !options.author,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: 'input',
|
|
32
|
+
name: 'email',
|
|
33
|
+
message: 'Author email:',
|
|
34
|
+
default: options.email,
|
|
35
|
+
when: !options.email,
|
|
36
|
+
},
|
|
37
|
+
]);
|
|
38
|
+
const author = {
|
|
39
|
+
type: options.type === 'agent' ? 'agent' : 'human',
|
|
40
|
+
id: authorInfo.email || options.email || `${authorInfo.name || options.author}@local`,
|
|
41
|
+
name: authorInfo.name || options.author || os.userInfo().username,
|
|
42
|
+
email: authorInfo.email || options.email,
|
|
43
|
+
};
|
|
44
|
+
spinner.start('Creating proposal...');
|
|
45
|
+
// Create the proposal
|
|
46
|
+
const proposal = cpManager.create({
|
|
47
|
+
intent,
|
|
48
|
+
author,
|
|
49
|
+
});
|
|
50
|
+
// Save to storage
|
|
51
|
+
await markdownStorage.saveProposal(proposal);
|
|
52
|
+
spinner.succeed(`Change Proposal created: ${chalk.cyan(proposal.id)}`);
|
|
53
|
+
console.log('\n' + chalk.bold('Change Proposal Details:'));
|
|
54
|
+
console.log(' ID: ' + chalk.cyan(proposal.id));
|
|
55
|
+
console.log(' Intent: ' + chalk.white(proposal.intent));
|
|
56
|
+
console.log(' Author: ' + chalk.white(`${author.name} (${author.type})`));
|
|
57
|
+
console.log(' Status: ' + chalk.yellow(proposal.status));
|
|
58
|
+
console.log(' Created: ' + chalk.gray(proposal.metadata.createdAt.toLocaleString()));
|
|
59
|
+
console.log('\n' + chalk.cyan('Next steps:'));
|
|
60
|
+
console.log(' • View proposal details: ' + chalk.yellow(`gait show ${proposal.id}`));
|
|
61
|
+
console.log(' • Add plan steps: ' + chalk.yellow(`gait plan ${proposal.id}`));
|
|
62
|
+
console.log(' • List all proposals: ' + chalk.yellow('gait list'));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
spinner.fail('Failed to create Change Proposal');
|
|
66
|
+
console.error(chalk.red('Error:'), error);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=propose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgEpC,eAAO,MAAM,YAAY,SA6DrB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { createServer } from 'net';
|
|
4
|
+
// Utility function to check if a port is available
|
|
5
|
+
function isPortAvailable(port, host = 'localhost') {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
const server = createServer();
|
|
8
|
+
server.listen(port, host, () => {
|
|
9
|
+
server.close(() => {
|
|
10
|
+
resolve(true);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
server.on('error', () => {
|
|
14
|
+
resolve(false);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
// Function to find a random available port
|
|
19
|
+
async function findAvailablePort(host = 'localhost', startPort = 3000) {
|
|
20
|
+
// Try the preferred port first
|
|
21
|
+
if (await isPortAvailable(startPort, host)) {
|
|
22
|
+
return startPort;
|
|
23
|
+
}
|
|
24
|
+
// If preferred port is taken, try random ports in a reasonable range
|
|
25
|
+
for (let attempts = 0; attempts < 10; attempts++) {
|
|
26
|
+
const randomPort = Math.floor(Math.random() * (65535 - 3001)) + 3001;
|
|
27
|
+
if (await isPortAvailable(randomPort, host)) {
|
|
28
|
+
return randomPort;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Fallback: let the system assign a port
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const server = createServer();
|
|
34
|
+
server.listen(0, host, () => {
|
|
35
|
+
const port = server.address()?.port;
|
|
36
|
+
server.close(() => {
|
|
37
|
+
if (port) {
|
|
38
|
+
resolve(port);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
reject(new Error('Could not find an available port'));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Function to open browser cross-platform
|
|
48
|
+
function openBrowser(url) {
|
|
49
|
+
const { spawn } = require('child_process');
|
|
50
|
+
// Cross-platform browser opening
|
|
51
|
+
const command = process.platform === 'darwin' ? 'open' :
|
|
52
|
+
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
53
|
+
spawn(command, [url], { detached: true, stdio: 'ignore' });
|
|
54
|
+
console.log(chalk.blue(`🌐 Opening browser at ${url}`));
|
|
55
|
+
}
|
|
56
|
+
export const serveCommand = new Command('serve')
|
|
57
|
+
.description('Start the GAIT web interface')
|
|
58
|
+
.option('-p, --port <port>', 'Preferred port to run the server on (will find alternative if unavailable)', '3000')
|
|
59
|
+
.option('--host <host>', 'Host to bind the server to', 'localhost')
|
|
60
|
+
.option('--no-open', 'Prevent automatic browser opening', false)
|
|
61
|
+
.action(async (options) => {
|
|
62
|
+
console.log(chalk.blue('🚀 Starting GAIT web interface...'));
|
|
63
|
+
try {
|
|
64
|
+
// Set environment variables for Next.js
|
|
65
|
+
const currentDir = process.cwd();
|
|
66
|
+
console.log(chalk.blue(`🗂️ Serving data from: ${currentDir}/.gait`));
|
|
67
|
+
process.env.GAIT_DATA_PATH = currentDir;
|
|
68
|
+
// Find an available port
|
|
69
|
+
const preferredPort = parseInt(options.port, 10);
|
|
70
|
+
console.log(chalk.blue(`🔍 Finding available port...`));
|
|
71
|
+
const availablePort = await findAvailablePort(options.host, preferredPort);
|
|
72
|
+
if (availablePort !== preferredPort) {
|
|
73
|
+
console.log(chalk.yellow(`⚠️ Port ${preferredPort} was unavailable, using port ${availablePort} instead`));
|
|
74
|
+
}
|
|
75
|
+
// Dynamic import to avoid issues with ES modules
|
|
76
|
+
const { startServer } = await import('@lovelybunch/api');
|
|
77
|
+
// Start the Hono API server with static frontend
|
|
78
|
+
const server = await startServer({
|
|
79
|
+
port: availablePort,
|
|
80
|
+
host: options.host
|
|
81
|
+
});
|
|
82
|
+
const url = `http://${options.host}:${availablePort}`;
|
|
83
|
+
console.log(chalk.green(`📱 Web interface running at ${url}`));
|
|
84
|
+
// Open browser automatically unless explicitly disabled
|
|
85
|
+
if (options.open !== false) {
|
|
86
|
+
setTimeout(() => {
|
|
87
|
+
openBrowser(url);
|
|
88
|
+
}, 1000);
|
|
89
|
+
}
|
|
90
|
+
// Handle graceful shutdown
|
|
91
|
+
process.on('SIGINT', () => {
|
|
92
|
+
console.log(chalk.yellow('\n🛑 Shutting down GAIT web interface...'));
|
|
93
|
+
server.close(() => {
|
|
94
|
+
process.exit(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
process.on('SIGTERM', () => {
|
|
98
|
+
server.close(() => {
|
|
99
|
+
process.exit(0);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error(chalk.red('❌ Failed to start GAIT web interface:'), error);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAiIpB,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { markdownStorage } from '@lovelybunch/core';
|
|
5
|
+
export const showCommand = new Command('show')
|
|
6
|
+
.description('Show details of a Change Proposal')
|
|
7
|
+
.argument('<id>', 'Change Proposal ID')
|
|
8
|
+
.option('--json', 'Output as JSON')
|
|
9
|
+
.action(async (id, options) => {
|
|
10
|
+
const spinner = ora('Loading Change Proposal...').start();
|
|
11
|
+
try {
|
|
12
|
+
// Load the specific proposal
|
|
13
|
+
const proposal = await markdownStorage.loadProposal(id);
|
|
14
|
+
spinner.stop();
|
|
15
|
+
if (!proposal) {
|
|
16
|
+
console.error(chalk.red(`Change Proposal '${id}' not found.`));
|
|
17
|
+
console.log(chalk.gray('Use "gait list" to see all proposals.'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Output as JSON if requested
|
|
21
|
+
if (options.json) {
|
|
22
|
+
console.log(JSON.stringify(proposal, null, 2));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Display formatted output
|
|
26
|
+
console.log('\n' + chalk.bold.underline('Change Proposal Details'));
|
|
27
|
+
console.log();
|
|
28
|
+
// Basic Information
|
|
29
|
+
console.log(chalk.cyan('Basic Information:'));
|
|
30
|
+
console.log(' ID: ' + chalk.white(proposal.id));
|
|
31
|
+
console.log(' Intent: ' + chalk.white(proposal.intent));
|
|
32
|
+
console.log(' Status: ' + getStatusColor(proposal.status)(proposal.status.toUpperCase()));
|
|
33
|
+
console.log(' Created: ' + chalk.white(new Date(proposal.metadata.createdAt).toLocaleString()));
|
|
34
|
+
console.log(' Updated: ' + chalk.white(new Date(proposal.metadata.updatedAt).toLocaleString()));
|
|
35
|
+
// Author Information
|
|
36
|
+
console.log('\n' + chalk.cyan('Author:'));
|
|
37
|
+
console.log(' Name: ' + chalk.white(proposal.author.name));
|
|
38
|
+
console.log(' Type: ' + chalk.white(proposal.author.type));
|
|
39
|
+
if (proposal.author.email) {
|
|
40
|
+
console.log(' Email: ' + chalk.white(proposal.author.email));
|
|
41
|
+
}
|
|
42
|
+
// Product Spec Reference
|
|
43
|
+
if (proposal.productSpecRef) {
|
|
44
|
+
console.log('\n' + chalk.cyan('Product Specification:'));
|
|
45
|
+
console.log(' Reference: ' + chalk.white(proposal.productSpecRef));
|
|
46
|
+
}
|
|
47
|
+
// Plan Steps
|
|
48
|
+
if (proposal.planSteps.length > 0) {
|
|
49
|
+
console.log('\n' + chalk.cyan('Plan Steps:'));
|
|
50
|
+
proposal.planSteps.forEach((step, index) => {
|
|
51
|
+
const statusIcon = getStepStatusIcon(step.status);
|
|
52
|
+
console.log(` ${index + 1}. ${statusIcon} ${step.description}`);
|
|
53
|
+
if (step.command) {
|
|
54
|
+
console.log(' Command: ' + chalk.gray(step.command));
|
|
55
|
+
}
|
|
56
|
+
if (step.executedAt) {
|
|
57
|
+
console.log(' Executed: ' + chalk.gray(new Date(step.executedAt).toLocaleString()));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Evidence
|
|
62
|
+
if (proposal.evidence.length > 0) {
|
|
63
|
+
console.log('\n' + chalk.cyan('Evidence:'));
|
|
64
|
+
proposal.evidence.forEach((evidence) => {
|
|
65
|
+
console.log(` • [${evidence.type}] ${evidence.description}`);
|
|
66
|
+
console.log(' ' + chalk.gray(new Date(evidence.timestamp).toLocaleString()));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Feature Flags
|
|
70
|
+
if (proposal.featureFlags.length > 0) {
|
|
71
|
+
console.log('\n' + chalk.cyan('Feature Flags:'));
|
|
72
|
+
proposal.featureFlags.forEach((flag) => {
|
|
73
|
+
console.log(` • ${flag.name} (${flag.type})`);
|
|
74
|
+
console.log(' Default: ' + chalk.gray(JSON.stringify(flag.defaultValue)));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Experiments
|
|
78
|
+
if (proposal.experiments.length > 0) {
|
|
79
|
+
console.log('\n' + chalk.cyan('Experiments:'));
|
|
80
|
+
proposal.experiments.forEach((exp) => {
|
|
81
|
+
console.log(` • ${exp.name} - ${exp.status}`);
|
|
82
|
+
console.log(' Hypothesis: ' + chalk.gray(exp.hypothesis));
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Release Plan
|
|
86
|
+
console.log('\n' + chalk.cyan('Release Plan:'));
|
|
87
|
+
console.log(' Strategy: ' + chalk.white(proposal.releasePlan.strategy));
|
|
88
|
+
if (proposal.releasePlan.schedule) {
|
|
89
|
+
console.log(' Schedule: ' + chalk.white(new Date(proposal.releasePlan.schedule).toLocaleString()));
|
|
90
|
+
}
|
|
91
|
+
// Metadata
|
|
92
|
+
if (proposal.metadata.tags && proposal.metadata.tags.length > 0) {
|
|
93
|
+
console.log('\n' + chalk.cyan('Tags:'));
|
|
94
|
+
console.log(' ' + proposal.metadata.tags.map(tag => chalk.magenta(`#${tag}`)).join(' '));
|
|
95
|
+
}
|
|
96
|
+
if (proposal.metadata.priority) {
|
|
97
|
+
console.log('\n' + chalk.cyan('Priority:') + ' ' + getPriorityColor(proposal.metadata.priority)(proposal.metadata.priority.toUpperCase()));
|
|
98
|
+
}
|
|
99
|
+
// AI Interactions
|
|
100
|
+
if (proposal.metadata.aiInteractions.length > 0) {
|
|
101
|
+
console.log('\n' + chalk.cyan('AI Interactions:'));
|
|
102
|
+
console.log(' Count: ' + chalk.white(proposal.metadata.aiInteractions.length));
|
|
103
|
+
const totalTokens = proposal.metadata.aiInteractions.reduce((sum, ai) => sum + ai.tokens.total, 0);
|
|
104
|
+
console.log(' Total Tokens:' + chalk.white(totalTokens));
|
|
105
|
+
}
|
|
106
|
+
// Actions
|
|
107
|
+
console.log('\n' + chalk.cyan('Actions:'));
|
|
108
|
+
console.log(' • Update status: ' + chalk.yellow(`gait status ${proposal.id} <status>`));
|
|
109
|
+
console.log(' • Add plan step: ' + chalk.yellow(`gait plan ${proposal.id}`));
|
|
110
|
+
console.log(' • Delete proposal: ' + chalk.yellow(`gait delete ${proposal.id}`));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
spinner.fail('Failed to load Change Proposal');
|
|
114
|
+
console.error(chalk.red('Error:'), error);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
function getStatusColor(status) {
|
|
119
|
+
const colors = {
|
|
120
|
+
draft: chalk.gray,
|
|
121
|
+
proposed: chalk.blue,
|
|
122
|
+
approved: chalk.green,
|
|
123
|
+
merged: chalk.cyan,
|
|
124
|
+
rejected: chalk.red,
|
|
125
|
+
};
|
|
126
|
+
return colors[status] || chalk.white;
|
|
127
|
+
}
|
|
128
|
+
function getStepStatusIcon(status) {
|
|
129
|
+
const icons = {
|
|
130
|
+
pending: chalk.gray('○'),
|
|
131
|
+
'in-progress': chalk.yellow('◐'),
|
|
132
|
+
completed: chalk.green('●'),
|
|
133
|
+
failed: chalk.red('✗'),
|
|
134
|
+
};
|
|
135
|
+
return icons[status] || chalk.gray('○');
|
|
136
|
+
}
|
|
137
|
+
function getPriorityColor(priority) {
|
|
138
|
+
const colors = {
|
|
139
|
+
low: chalk.gray,
|
|
140
|
+
medium: chalk.yellow,
|
|
141
|
+
high: chalk.magenta,
|
|
142
|
+
critical: chalk.red,
|
|
143
|
+
};
|
|
144
|
+
return colors[priority] || chalk.white;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lovelybunch/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"description": "Command-line interface for GAIT",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/
|
|
7
|
-
"types": "./dist/
|
|
6
|
+
"main": "./dist/cli.js",
|
|
7
|
+
"types": "./dist/cli.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
11
|
-
"import": "./dist/
|
|
12
|
-
}
|
|
13
|
-
"./dist/cli.js": "./dist/cli.js"
|
|
10
|
+
"types": "./dist/cli.d.ts",
|
|
11
|
+
"import": "./dist/cli.js"
|
|
12
|
+
}
|
|
14
13
|
},
|
|
15
14
|
"files": [
|
|
16
15
|
"dist/**/*",
|