repowise 0.1.41 → 0.1.42
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/src/commands/config.d.ts +2 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +95 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/create.d.ts +2 -0
- package/dist/src/commands/create.d.ts.map +1 -0
- package/dist/src/commands/create.js +309 -0
- package/dist/src/commands/create.js.map +1 -0
- package/dist/src/commands/listen.d.ts +5 -0
- package/dist/src/commands/listen.d.ts.map +1 -0
- package/dist/src/commands/listen.js +47 -0
- package/dist/src/commands/listen.js.map +1 -0
- package/dist/src/commands/login.d.ts +5 -0
- package/dist/src/commands/login.d.ts.map +1 -0
- package/dist/src/commands/login.js +58 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/logout.d.ts +2 -0
- package/dist/src/commands/logout.d.ts.map +1 -0
- package/dist/src/commands/logout.js +12 -0
- package/dist/src/commands/logout.js.map +1 -0
- package/dist/src/commands/start.d.ts +2 -0
- package/dist/src/commands/start.d.ts.map +1 -0
- package/dist/src/commands/start.js +17 -0
- package/dist/src/commands/start.js.map +1 -0
- package/dist/src/commands/status.d.ts +2 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +63 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/stop.d.ts +2 -0
- package/dist/src/commands/stop.d.ts.map +1 -0
- package/dist/src/commands/stop.js +17 -0
- package/dist/src/commands/stop.js.map +1 -0
- package/dist/src/commands/sync.d.ts +2 -0
- package/dist/src/commands/sync.d.ts.map +1 -0
- package/dist/src/commands/sync.js +205 -0
- package/dist/src/commands/sync.js.map +1 -0
- package/dist/src/lib/ai-tools.d.ts +23 -0
- package/dist/src/lib/ai-tools.d.ts.map +1 -0
- package/dist/src/lib/ai-tools.js +193 -0
- package/dist/src/lib/ai-tools.js.map +1 -0
- package/dist/src/lib/api.d.ts +2 -0
- package/dist/src/lib/api.d.ts.map +1 -0
- package/dist/src/lib/api.js +38 -0
- package/dist/src/lib/api.js.map +1 -0
- package/dist/src/lib/auth.d.ts +28 -0
- package/dist/src/lib/auth.d.ts.map +1 -0
- package/dist/src/lib/auth.js +271 -0
- package/dist/src/lib/auth.js.map +1 -0
- package/dist/src/lib/config.d.ts +15 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +19 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/env.d.ts +10 -0
- package/dist/src/lib/env.d.ts.map +1 -0
- package/dist/src/lib/env.js +26 -0
- package/dist/src/lib/env.js.map +1 -0
- package/dist/src/lib/interview-handler.d.ts +2 -0
- package/dist/src/lib/interview-handler.d.ts.map +1 -0
- package/dist/src/lib/interview-handler.js +100 -0
- package/dist/src/lib/interview-handler.js.map +1 -0
- package/dist/src/lib/progress-renderer.d.ts +84 -0
- package/dist/src/lib/progress-renderer.d.ts.map +1 -0
- package/dist/src/lib/progress-renderer.js +388 -0
- package/dist/src/lib/progress-renderer.js.map +1 -0
- package/dist/src/lib/prompts.d.ts +7 -0
- package/dist/src/lib/prompts.d.ts.map +1 -0
- package/dist/src/lib/prompts.js +33 -0
- package/dist/src/lib/prompts.js.map +1 -0
- package/dist/src/lib/welcome.d.ts +6 -0
- package/dist/src/lib/welcome.d.ts.map +1 -0
- package/dist/src/lib/welcome.js +42 -0
- package/dist/src/lib/welcome.js.map +1 -0
- package/dist/src/types/index.d.ts +4 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/tsup.config.d.ts +3 -0
- package/dist/tsup.config.d.ts.map +1 -0
- package/dist/tsup.config.js +18 -0
- package/dist/tsup.config.js.map +1 -0
- package/package.json +3 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAeA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG5C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { select } from '@inquirer/prompts';
|
|
4
|
+
import { getValidCredentials, performLogin, decodeIdToken } from '../lib/auth.js';
|
|
5
|
+
import { apiRequest } from '../lib/api.js';
|
|
6
|
+
export async function config() {
|
|
7
|
+
const spinner = ora('Checking authentication...').start();
|
|
8
|
+
try {
|
|
9
|
+
let credentials = await getValidCredentials();
|
|
10
|
+
if (!credentials) {
|
|
11
|
+
spinner.info(chalk.yellow('Not logged in. Opening browser to authenticate...'));
|
|
12
|
+
credentials = await performLogin();
|
|
13
|
+
const { email } = decodeIdToken(credentials.idToken);
|
|
14
|
+
spinner.succeed(chalk.green(`Authenticated as ${chalk.bold(email)}`));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
spinner.succeed('Authenticated');
|
|
18
|
+
}
|
|
19
|
+
// Fetch repos
|
|
20
|
+
spinner.start('Loading repositories...');
|
|
21
|
+
const repos = await apiRequest('/v1/repos');
|
|
22
|
+
spinner.stop();
|
|
23
|
+
if (repos.length === 0) {
|
|
24
|
+
console.log(chalk.yellow('No repositories connected. Run `repowise create` first.'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Select repo
|
|
28
|
+
const repoId = await select({
|
|
29
|
+
message: 'Select a repository to configure',
|
|
30
|
+
choices: repos.map((r) => ({
|
|
31
|
+
name: r.fullName,
|
|
32
|
+
value: r.repoId,
|
|
33
|
+
})),
|
|
34
|
+
});
|
|
35
|
+
const repo = repos.find((r) => r.repoId === repoId);
|
|
36
|
+
const currentDelivery = repo.deliveryMode ?? 'direct';
|
|
37
|
+
const currentBranch = repo.monitoredBranch ?? repo.defaultBranch;
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log(chalk.bold(`Settings for ${repo.fullName}`));
|
|
40
|
+
console.log(chalk.dim(` Context storage: RepoWise servers`));
|
|
41
|
+
console.log(chalk.dim(` Delivery mode: ${currentDelivery}`));
|
|
42
|
+
console.log(chalk.dim(` Monitored branch: ${currentBranch}`));
|
|
43
|
+
console.log('');
|
|
44
|
+
// Select setting to change
|
|
45
|
+
const setting = await select({
|
|
46
|
+
message: 'What would you like to change?',
|
|
47
|
+
choices: [
|
|
48
|
+
{ name: `Delivery mode (current: ${currentDelivery})`, value: 'deliveryMode' },
|
|
49
|
+
{ name: `Monitored branch (current: ${currentBranch})`, value: 'monitoredBranch' },
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
const patch = {};
|
|
53
|
+
if (setting === 'deliveryMode') {
|
|
54
|
+
const newMode = await select({
|
|
55
|
+
message: 'Delivery mode',
|
|
56
|
+
choices: [
|
|
57
|
+
{ name: 'Direct push to branch', value: 'direct' },
|
|
58
|
+
{ name: 'Create pull request', value: 'pr' },
|
|
59
|
+
],
|
|
60
|
+
default: currentDelivery,
|
|
61
|
+
});
|
|
62
|
+
if (newMode === currentDelivery) {
|
|
63
|
+
console.log(chalk.dim('No change.'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
patch.deliveryMode = newMode;
|
|
67
|
+
}
|
|
68
|
+
else if (setting === 'monitoredBranch') {
|
|
69
|
+
const { input } = await import('@inquirer/prompts');
|
|
70
|
+
const newBranch = await input({
|
|
71
|
+
message: 'Monitored branch',
|
|
72
|
+
default: currentBranch,
|
|
73
|
+
});
|
|
74
|
+
if (newBranch === currentBranch) {
|
|
75
|
+
console.log(chalk.dim('No change.'));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
patch.monitoredBranch = newBranch;
|
|
79
|
+
}
|
|
80
|
+
// Save
|
|
81
|
+
spinner.start('Saving...');
|
|
82
|
+
await apiRequest(`/v1/repos/${repoId}`, {
|
|
83
|
+
method: 'PATCH',
|
|
84
|
+
body: JSON.stringify(patch),
|
|
85
|
+
});
|
|
86
|
+
spinner.succeed(chalk.green('Setting updated'));
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
spinner.stop();
|
|
90
|
+
const message = err instanceof Error ? err.message : 'Config failed';
|
|
91
|
+
console.error(chalk.red(message));
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAiHA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAmW5C"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { getValidCredentials, performLogin, decodeIdToken } from '../lib/auth.js';
|
|
7
|
+
import { apiRequest } from '../lib/api.js';
|
|
8
|
+
import { selectAiTools } from '../lib/prompts.js';
|
|
9
|
+
import { updateToolConfig, scanLocalContextFiles, AI_TOOL_CONFIG } from '../lib/ai-tools.js';
|
|
10
|
+
import { getConfig, saveConfig } from '../lib/config.js';
|
|
11
|
+
import { handleInterview } from '../lib/interview-handler.js';
|
|
12
|
+
import { ProgressRenderer, CORE_FILES } from '../lib/progress-renderer.js';
|
|
13
|
+
function detectRepoRoot() {
|
|
14
|
+
return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim();
|
|
15
|
+
}
|
|
16
|
+
function detectRepoName(repoRoot) {
|
|
17
|
+
try {
|
|
18
|
+
const remoteUrl = execSync('git remote get-url origin', {
|
|
19
|
+
encoding: 'utf-8',
|
|
20
|
+
cwd: repoRoot,
|
|
21
|
+
}).trim();
|
|
22
|
+
// Extract repo name from URL (handles both HTTPS and SSH)
|
|
23
|
+
const match = remoteUrl.match(/\/([^/]+?)(?:\.git)?$/);
|
|
24
|
+
if (match?.[1])
|
|
25
|
+
return match[1];
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// No remote configured — fall back to directory name
|
|
29
|
+
}
|
|
30
|
+
return repoRoot.split('/').pop() ?? 'unknown';
|
|
31
|
+
}
|
|
32
|
+
function formatElapsed(ms) {
|
|
33
|
+
const totalSeconds = Math.round(ms / 1000);
|
|
34
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
35
|
+
const seconds = totalSeconds % 60;
|
|
36
|
+
if (minutes === 0)
|
|
37
|
+
return `${seconds}s`;
|
|
38
|
+
return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
|
|
39
|
+
}
|
|
40
|
+
const POLL_INTERVAL_MS = 3000;
|
|
41
|
+
const MAX_POLL_ATTEMPTS = 600; // ~30 minutes at 3s interval
|
|
42
|
+
const DEFAULT_CONTEXT_FOLDER = 'repowise-context';
|
|
43
|
+
export async function create() {
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
const spinner = ora('Checking authentication...').start();
|
|
46
|
+
try {
|
|
47
|
+
// Step 1: Auth check — auto-login if not authenticated (Story 2.1)
|
|
48
|
+
let credentials = await getValidCredentials();
|
|
49
|
+
if (!credentials) {
|
|
50
|
+
spinner.info(chalk.yellow('Not logged in. Opening browser to authenticate...'));
|
|
51
|
+
credentials = await performLogin();
|
|
52
|
+
const { email } = decodeIdToken(credentials.idToken);
|
|
53
|
+
spinner.succeed(chalk.green(`Authenticated as ${chalk.bold(email)}`));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
spinner.succeed('Authenticated');
|
|
57
|
+
}
|
|
58
|
+
// Step 2: Check for pending onboarding repo from dashboard (Story 2.2)
|
|
59
|
+
let repoId;
|
|
60
|
+
let repoName;
|
|
61
|
+
let repoRoot;
|
|
62
|
+
spinner.start('Checking for pending repository...');
|
|
63
|
+
try {
|
|
64
|
+
const pending = await apiRequest('/v1/onboarding/pending');
|
|
65
|
+
if (pending?.repoId) {
|
|
66
|
+
repoId = pending.repoId;
|
|
67
|
+
repoName = pending.repoName;
|
|
68
|
+
spinner.succeed(`Found pending repository: ${chalk.bold(repoName)}`);
|
|
69
|
+
// Clear pending onboarding after pickup
|
|
70
|
+
apiRequest('/v1/onboarding/pending', { method: 'DELETE' }).catch(() => { });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// No pending onboarding API available or failed — fall through to local detection
|
|
75
|
+
}
|
|
76
|
+
// Fall back to local git detection if no pending repo
|
|
77
|
+
if (!repoId) {
|
|
78
|
+
spinner.text = 'Detecting repository...';
|
|
79
|
+
try {
|
|
80
|
+
repoRoot = detectRepoRoot();
|
|
81
|
+
repoName = detectRepoName(repoRoot);
|
|
82
|
+
spinner.succeed(`Repository: ${chalk.bold(repoName)}`);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
spinner.fail(chalk.red('Not in a git repository. Run this command from your repo directory, or select a repo on the dashboard first.'));
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Resolve repoId from API
|
|
90
|
+
try {
|
|
91
|
+
const repos = await apiRequest('/v1/repos');
|
|
92
|
+
const match = repos.find((r) => r.name === repoName || r.fullName.endsWith(`/${repoName}`));
|
|
93
|
+
if (match) {
|
|
94
|
+
repoId = match.repoId;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Could not resolve — will fail at sync trigger
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Try to detect local repo root even with pending repo (for downloading context files)
|
|
103
|
+
try {
|
|
104
|
+
repoRoot = detectRepoRoot();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Not in a git repo directory — that's ok with pending repo
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (!repoId) {
|
|
111
|
+
spinner.fail(chalk.red('Could not find this repository in your RepoWise account. Connect it on the dashboard first.'));
|
|
112
|
+
process.exitCode = 1;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Step 3: AI tool selection
|
|
116
|
+
const { tools, hasOther } = await selectAiTools();
|
|
117
|
+
if (hasOther) {
|
|
118
|
+
console.log(chalk.cyan('\nFor AI tools not listed, context files still work with any tool that reads the filesystem.\nRequest support for your tool at: https://dashboard.repowise.ai/support/ai-tools'));
|
|
119
|
+
}
|
|
120
|
+
if (tools.length === 0 && !hasOther) {
|
|
121
|
+
console.log(chalk.yellow('\nNo AI tools selected. You can configure them later with `repowise config`.'));
|
|
122
|
+
}
|
|
123
|
+
// Step 4: Trigger pipeline (or resume an existing active sync)
|
|
124
|
+
const contextStorage = 'server';
|
|
125
|
+
spinner.start('Starting context generation pipeline...');
|
|
126
|
+
let syncId;
|
|
127
|
+
try {
|
|
128
|
+
const triggerResult = await apiRequest(`/v1/repos/${repoId}/sync`, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
body: JSON.stringify({ scanType: 'full', contextStorage }),
|
|
131
|
+
});
|
|
132
|
+
syncId = triggerResult.syncId;
|
|
133
|
+
}
|
|
134
|
+
catch (triggerErr) {
|
|
135
|
+
const msg = triggerErr instanceof Error ? triggerErr.message : '';
|
|
136
|
+
if (!msg.toLowerCase().includes('already running')) {
|
|
137
|
+
throw triggerErr;
|
|
138
|
+
}
|
|
139
|
+
// A sync is already in progress — find it and resume polling
|
|
140
|
+
spinner.text = 'Resuming existing pipeline...';
|
|
141
|
+
const syncs = await apiRequest(`/v1/repos/${repoId}/syncs?limit=1`);
|
|
142
|
+
const active = syncs.items.find((s) => s.status === 'in_progress' || s.status === 'awaiting_input');
|
|
143
|
+
if (!active) {
|
|
144
|
+
throw new Error('Could not find active sync to resume. Please try again.');
|
|
145
|
+
}
|
|
146
|
+
syncId = active.syncId;
|
|
147
|
+
spinner.info(chalk.cyan('Resuming existing pipeline...'));
|
|
148
|
+
spinner.start();
|
|
149
|
+
}
|
|
150
|
+
// Step 5: Poll for completion with enriched progress display
|
|
151
|
+
let pollAttempts = 0;
|
|
152
|
+
const progressRenderer = new ProgressRenderer();
|
|
153
|
+
while (true) {
|
|
154
|
+
if (++pollAttempts > MAX_POLL_ATTEMPTS) {
|
|
155
|
+
spinner.fail(chalk.red('Pipeline timed out. Check dashboard for status.'));
|
|
156
|
+
process.exitCode = 1;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
160
|
+
const syncResult = await apiRequest(`/v1/sync/${syncId}/status`);
|
|
161
|
+
// Update progress display first so discovery/scan sections render
|
|
162
|
+
// even if the status already jumped to awaiting_input or completed
|
|
163
|
+
progressRenderer.update(syncResult, spinner);
|
|
164
|
+
// Handle interview questions (Story 3.2)
|
|
165
|
+
if (syncResult.status === 'awaiting_input' &&
|
|
166
|
+
syncResult.questionId &&
|
|
167
|
+
syncResult.questionText) {
|
|
168
|
+
spinner.stop();
|
|
169
|
+
await handleInterview(syncId, syncResult.questionId, syncResult.questionText, syncResult.questionContext ?? undefined, syncResult.discoveryResult?.estimatedInterviewQuestions);
|
|
170
|
+
spinner.start('Resuming pipeline...');
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (syncResult.status === 'completed') {
|
|
174
|
+
const generatedFiles = syncResult.filesGenerated ?? [];
|
|
175
|
+
const fileCount = generatedFiles.length;
|
|
176
|
+
if (fileCount > 0) {
|
|
177
|
+
const coreCount = generatedFiles.filter((f) => CORE_FILES.has(f.split('/').pop() ?? f)).length;
|
|
178
|
+
const tailoredCount = fileCount - coreCount;
|
|
179
|
+
spinner.succeed(`Context generation complete — ${coreCount} core + ${tailoredCount} tailored files`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
spinner.warn(chalk.yellow('Pipeline completed but no context files were generated.'));
|
|
183
|
+
console.log(chalk.yellow(' This may be due to AI throttling or a parsing issue. Try running `repowise create` again.'));
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
if (syncResult.status === 'failed') {
|
|
188
|
+
spinner.fail(chalk.red(`Pipeline failed: ${syncResult.error ?? 'Unknown error'}`));
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Step 6: Download context files from server
|
|
194
|
+
if (repoRoot) {
|
|
195
|
+
spinner.start('Downloading context files from server...');
|
|
196
|
+
try {
|
|
197
|
+
const listResult = await apiRequest(`/v1/repos/${repoId}/context`);
|
|
198
|
+
const files = listResult.data?.files ??
|
|
199
|
+
listResult.files ??
|
|
200
|
+
[];
|
|
201
|
+
if (files.length > 0) {
|
|
202
|
+
const contextDir = join(repoRoot, DEFAULT_CONTEXT_FOLDER);
|
|
203
|
+
mkdirSync(contextDir, { recursive: true });
|
|
204
|
+
let downloadedCount = 0;
|
|
205
|
+
let failedCount = 0;
|
|
206
|
+
for (const file of files) {
|
|
207
|
+
// Path traversal protection
|
|
208
|
+
if (file.fileName.includes('..') || file.fileName.includes('/')) {
|
|
209
|
+
failedCount++;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const urlResult = await apiRequest(`/v1/repos/${repoId}/context/${file.fileName}`);
|
|
213
|
+
const presignedUrl = urlResult.data?.url ?? urlResult.url;
|
|
214
|
+
const response = await fetch(presignedUrl);
|
|
215
|
+
if (response.ok) {
|
|
216
|
+
const content = await response.text();
|
|
217
|
+
writeFileSync(join(contextDir, file.fileName), content, 'utf-8');
|
|
218
|
+
downloadedCount++;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
failedCount++;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (failedCount > 0) {
|
|
225
|
+
spinner.warn(`Downloaded ${downloadedCount}/${files.length} files to ./${DEFAULT_CONTEXT_FOLDER}/ (${failedCount} failed)`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
spinner.succeed(`Context files downloaded to ./${DEFAULT_CONTEXT_FOLDER}/`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
spinner.warn('No context files found on server');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
237
|
+
spinner.warn(chalk.yellow(`Cannot reach RepoWise servers to download context: ${msg}\nFiles are stored on our servers (not in git). Retry when online.`));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Step 7: Collect context files
|
|
241
|
+
const contextFolder = DEFAULT_CONTEXT_FOLDER;
|
|
242
|
+
let contextFiles = [];
|
|
243
|
+
if (repoRoot) {
|
|
244
|
+
contextFiles = await scanLocalContextFiles(repoRoot, contextFolder);
|
|
245
|
+
}
|
|
246
|
+
if (contextFiles.length === 0) {
|
|
247
|
+
console.log(chalk.yellow(` No context files found in ${contextFolder}/. Try re-running \`repowise create\`.`));
|
|
248
|
+
}
|
|
249
|
+
// Step 8: Configure AI tools
|
|
250
|
+
if (tools.length > 0 && repoRoot) {
|
|
251
|
+
spinner.start('Configuring AI tools...');
|
|
252
|
+
const results = [];
|
|
253
|
+
for (const tool of tools) {
|
|
254
|
+
const { created: wasCreated } = await updateToolConfig(repoRoot, tool, repoName, contextFolder, contextFiles);
|
|
255
|
+
const config = AI_TOOL_CONFIG[tool];
|
|
256
|
+
const action = wasCreated ? 'Created' : 'Updated';
|
|
257
|
+
results.push(` ${action} ${config.filePath}`);
|
|
258
|
+
}
|
|
259
|
+
spinner.succeed('AI tools configured');
|
|
260
|
+
console.log(chalk.dim(results.join('\n')));
|
|
261
|
+
}
|
|
262
|
+
// Step 9: Save config (including repo registration for the listener)
|
|
263
|
+
const existingConfig = await getConfig();
|
|
264
|
+
const existingRepos = existingConfig.repos ?? [];
|
|
265
|
+
const updatedRepos = existingRepos.filter((r) => r.repoId !== repoId);
|
|
266
|
+
if (repoRoot) {
|
|
267
|
+
updatedRepos.push({ repoId: repoId, localPath: repoRoot });
|
|
268
|
+
}
|
|
269
|
+
await saveConfig({
|
|
270
|
+
...existingConfig,
|
|
271
|
+
aiTools: tools,
|
|
272
|
+
contextFolder,
|
|
273
|
+
repos: updatedRepos,
|
|
274
|
+
});
|
|
275
|
+
// Step 10: Auto-start listener
|
|
276
|
+
let listenerRunning = false;
|
|
277
|
+
try {
|
|
278
|
+
const { install } = (await import('@repowise/listener/service-installer'));
|
|
279
|
+
const { startBackground } = (await import('@repowise/listener/process-manager'));
|
|
280
|
+
await install();
|
|
281
|
+
await startBackground();
|
|
282
|
+
listenerRunning = true;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
console.log(chalk.yellow('Warning: Could not start listener automatically. Run the following to enable it:'));
|
|
286
|
+
console.log(chalk.yellow(` $ repowise listen --install`));
|
|
287
|
+
}
|
|
288
|
+
// Step 11: Completion summary with elapsed time (Story 2.3)
|
|
289
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
290
|
+
console.log('');
|
|
291
|
+
console.log(chalk.green.bold(' All done! Setup complete!'));
|
|
292
|
+
console.log(chalk.green(` Your AI tools now have access to project context for ${chalk.bold(repoName)}.`));
|
|
293
|
+
if (listenerRunning) {
|
|
294
|
+
console.log('');
|
|
295
|
+
console.log(chalk.cyan(' The RepoWise listener is running in the background —'));
|
|
296
|
+
console.log(chalk.cyan(' your context will stay in sync automatically.'));
|
|
297
|
+
console.log(chalk.cyan(" Go back to coding, we've got it from here!"));
|
|
298
|
+
}
|
|
299
|
+
console.log('');
|
|
300
|
+
console.log(chalk.cyan(' Head back to the dashboard and click "Complete Onboarding" to explore your RepoWise dashboard!'));
|
|
301
|
+
console.log(chalk.dim(`\n Total time: ${elapsed}`));
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
const message = err instanceof Error ? err.message : 'Create failed';
|
|
305
|
+
spinner.fail(chalk.red(message));
|
|
306
|
+
process.exitCode = 1;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.d.ts","sourceRoot":"","sources":["../../../src/commands/listen.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD/F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getValidCredentials } from '../lib/auth.js';
|
|
2
|
+
export async function listen(options) {
|
|
3
|
+
if (options.install) {
|
|
4
|
+
try {
|
|
5
|
+
const { install } = (await import('@repowise/listener/service-installer'));
|
|
6
|
+
await install();
|
|
7
|
+
console.log('Auto-start service installed. The listener will start on boot.');
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
11
|
+
console.error(`Failed to install auto-start service: ${message}`);
|
|
12
|
+
console.error('You can still run the listener manually with `repowise listen`.');
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
}
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (options.uninstall) {
|
|
18
|
+
try {
|
|
19
|
+
const { uninstall } = (await import('@repowise/listener/service-installer'));
|
|
20
|
+
await uninstall();
|
|
21
|
+
console.log('Auto-start service removed.');
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
25
|
+
console.error(`Failed to uninstall auto-start service: ${message}`);
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const credentials = await getValidCredentials();
|
|
31
|
+
if (!credentials) {
|
|
32
|
+
console.error('Not logged in. Run `repowise login` first.');
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log('Starting RepoWise listener...');
|
|
37
|
+
// Dynamic import to avoid hard dependency on listener package
|
|
38
|
+
try {
|
|
39
|
+
const { startListener } = (await import('@repowise/listener/main'));
|
|
40
|
+
await startListener();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
console.error('Failed to start listener. Ensure @repowise/listener is installed.');
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../../src/commands/listen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAmD;IAC9E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAExE,CAAC;YACF,MAAM,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAE1E,CAAC;YACF,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAEjE,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { generateCodeVerifier, generateCodeChallenge, generateState, getAuthorizeUrl, startCallbackServer, exchangeCodeForTokens, storeCredentials, decodeIdToken, } from '../lib/auth.js';
|
|
4
|
+
export async function login(options = {}) {
|
|
5
|
+
const spinner = ora('Preparing login...').start();
|
|
6
|
+
try {
|
|
7
|
+
// Generate PKCE and state
|
|
8
|
+
const codeVerifier = generateCodeVerifier();
|
|
9
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
10
|
+
const state = generateState();
|
|
11
|
+
// Build authorize URL
|
|
12
|
+
const authorizeUrl = getAuthorizeUrl(codeChallenge, state);
|
|
13
|
+
// Start callback server first
|
|
14
|
+
const callbackPromise = startCallbackServer();
|
|
15
|
+
// Open browser or print URL
|
|
16
|
+
if (options.browser === false) {
|
|
17
|
+
spinner.stop();
|
|
18
|
+
console.log(`\nOpen this URL in your browser to authenticate:\n`);
|
|
19
|
+
console.log(chalk.cyan(authorizeUrl));
|
|
20
|
+
console.log(`\nWaiting for authentication...`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
spinner.text = 'Opening browser for authentication...';
|
|
24
|
+
try {
|
|
25
|
+
const open = (await import('open')).default;
|
|
26
|
+
await open(authorizeUrl);
|
|
27
|
+
spinner.text = 'Waiting for authentication in browser...';
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Fall back to printing URL if open fails
|
|
31
|
+
spinner.stop();
|
|
32
|
+
console.log(`\nCould not open browser automatically. Open this URL:\n`);
|
|
33
|
+
console.log(chalk.cyan(authorizeUrl));
|
|
34
|
+
console.log(`\nWaiting for authentication...`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Wait for callback
|
|
38
|
+
const { code, state: returnedState } = await callbackPromise;
|
|
39
|
+
// Validate state
|
|
40
|
+
if (returnedState !== state) {
|
|
41
|
+
throw new Error('State mismatch — possible CSRF attack. Please try again.');
|
|
42
|
+
}
|
|
43
|
+
spinner.start('Exchanging authorization code...');
|
|
44
|
+
// Exchange code for tokens
|
|
45
|
+
const credentials = await exchangeCodeForTokens(code, codeVerifier);
|
|
46
|
+
// Store credentials
|
|
47
|
+
await storeCredentials(credentials);
|
|
48
|
+
// Decode ID token for display
|
|
49
|
+
const { email } = decodeIdToken(credentials.idToken);
|
|
50
|
+
spinner.succeed(chalk.green(`Logged in as ${chalk.bold(email)}`));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const message = err instanceof Error ? err.message : 'Login failed';
|
|
54
|
+
spinner.fail(chalk.red(message));
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { clearCredentials, getStoredCredentials } from '../lib/auth.js';
|
|
3
|
+
export async function logout() {
|
|
4
|
+
const creds = await getStoredCredentials();
|
|
5
|
+
if (!creds) {
|
|
6
|
+
console.log(chalk.yellow('Not logged in.'));
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
await clearCredentials();
|
|
10
|
+
console.log(chalk.green('Logged out successfully.'));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"AAAA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB3C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function start() {
|
|
2
|
+
try {
|
|
3
|
+
const { isRunning, startBackground } = (await import('@repowise/listener/process-manager'));
|
|
4
|
+
if (await isRunning()) {
|
|
5
|
+
console.log('Listener is already running.');
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const pid = await startBackground();
|
|
9
|
+
console.log(`Listener started (PID: ${pid}).`);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
13
|
+
console.error(`Failed to start listener: ${message}`);
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=start.js.map
|